Frequently Asked Questions
Adjusting the options for different reconstruction scenarios and output quality
COLMAP provides many options that can be tuned for different reconstruction
scenarios and to trade off accuracy and completeness versus efficiency. The
default options are set to for medium to high quality reconstruction of
unstructured input data. There are several presets for different scenarios and
quality levels, which can be set in the GUI as Extras > Set options for ...
.
To use these presets from the command-line, you can save the current set of
options as File > Save project
after choosing the presets. The resulting
project file can be opened with a text editor to view the different options.
Alternatively, you can generate the project file also from the command-line
by running colmap project_generator
.
Extending COLMAP
If you need to simply analyze the produced sparse or dense reconstructions from
COLMAP, you can load the sparse models in Python and Matlab using the provided
scripts in scripts/python
and scripts/matlab
.
If you want to write a C/C++ executable that builds on top of COLMAP, there are
two possible approaches. First, the COLMAP headers and library are installed
to the CMAKE_INSTALL_PREFIX
by default. Compiling against COLMAP as a
library is described here. Alternatively, you can
start from the src/tools/example.cc
code template and implement the desired
functionality directly as a new binary within COLMAP.
Fix intrinsics
By default, COLMAP tries to refine the intrinsic camera parameters (except principal point) automatically during the reconstruction. Usually, if there are enough images in the dataset and you share the intrinsics between multiple images, the estimated intrinsic camera parameters in SfM should be better than parameters manually obtained with a calibration pattern.
However, sometimes COLMAP’s self-calibration routine might converge in
degenerate parameters, especially in case of the more complex camera models with
many distortion parameters. If you know the calibration parameters a priori, you
can fix different parameter groups during the reconstruction. Choose
Reconstruction > Reconstruction options > Bundle Adj. > refine_*
and check
which parameter group to refine or to keep constant. Even if you keep the
parameters constant during the reconstruction, you can refine the parameters in
a final global bundle adjustment by setting Reconstruction > Bundle adj.
options > refine_*
and then running Reconstruction > Bundle adjustment
.
Principal point refinement
By default, COLMAP keeps the principal point constant during the reconstruction, as principal point estimation is an ill-posed problem in general. Once all images are reconstructed, the problem is most often constrained enough that you can try to refine the principal point in global bundle adjustment, especially when sharing intrinsic parameters between multiple images. Please, refer to Fix intrinsics for more information.
Increase number of matches / sparse 3D points
To increase the number of matches, you should use the more discriminative
DSP-SIFT features instead of plain SIFT and also estimate the affine feature
shape using the options: --SiftExtraction.estimate_affine_shape=true
and
--SiftExtraction.domain_size_pooling=true
. In addition, you should enable
guided feature matching using: --SiftMatching.guided_matching=true
.
By default, COLMAP ignores two-view feature tracks in triangulation, resulting
in fewer 3D points than possible. Triangulation of two-view tracks can in rare
cases improve the stability of sparse image collections by providing additional
constraints in bundle adjustment. To also triangulate two-view tracks, unselect
the option Reconstruction > Reconstruction options > Triangulation >
ignore_two_view_tracks
. If your images are taken from far distance with
respect to the scene, you can try to reduce the minimum triangulation angle.
Reconstruct sparse/dense model from known camera poses
If the camera poses are known and you want to reconstruct a sparse or dense
model of the scene, you must first manually construct a sparse model by creating
a cameras.txt
, points3D.txt
, and images.txt
under a new folder:
+── path/to/manually/created/sparse/model
│ +── cameras.txt
│ +── images.txt
│ +── points3D.txt
The points3D.txt
file should be empty while every other line in the images.txt
should also be empty, since the sparse features are computed, as described below. You can
refer to this article for more information about the structure of
a sparse model.
Example of images.txt:
1 0.695104 0.718385 -0.024566 0.012285 -0.046895 0.005253 -0.199664 1 image0001.png
# Make sure every other line is left empty
2 0.696445 0.717090 -0.023185 0.014441 -0.041213 0.001928 -0.134851 2 image0002.png
3 0.697457 0.715925 -0.025383 0.018967 -0.054056 0.008579 -0.378221 1 image0003.png
4 0.698777 0.714625 -0.023996 0.021129 -0.048184 0.004529 -0.313427 2 image0004.png
Each image above must have the same image_id
(first column) as in the database (next step).
This database can be inspected either in the GUI (under Database management > Processing
),
or, one can create a reconstruction with colmap and later export it as text in order to see
the images.txt file it creates.
To reconstruct a sparse map, you first have to recompute features from the images of the known camera poses as follows:
colmap feature_extractor \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images
If your known camera intrinsics have large distortion coefficients, you should
now manually copy the parameters from your cameras.txt
to the database, such
that the matcher can leverage the intrinsics. Modifying the database is possible
in many ways, but an easy option is to use the provided
scripts/python/database.py
script. Otherwise, you can skip this step and
simply continue as follows:
colmap exhaustive_matcher \ # or alternatively any other matcher
--database_path $PROJECT_PATH/database.db
colmap point_triangulator \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images
--input_path path/to/manually/created/sparse/model \
--output_path path/to/triangulated/sparse/model
Note that the sparse reconstruction step is not necessary in order to compute a dense model from known camera poses. Assuming you computed a sparse model from the known camera poses, you can compute a dense model as follows:
colmap image_undistorter \
--image_path $PROJECT_PATH/images \
--input_path path/to/triangulated/sparse/model \
--output_path path/to/dense/workspace
colmap patch_match_stereo \
--workspace_path path/to/dense/workspace
colmap stereo_fusion \
--workspace_path path/to/dense/workspace \
--output_path path/to/dense/workspace/fused.ply
Alternatively, you can also produce a dense model without a sparse model as:
colmap image_undistorter \
--image_path $PROJECT_PATH/images \
--input_path path/to/manually/created/sparse/model \
--output_path path/to/dense/workspace
Since the sparse point cloud is used to automatically select neighboring images during the dense stereo stage, you have to manually specify the source images, as described here. The dense stereo stage now also requires a manual specification of the depth range:
colmap patch_match_stereo \
--workspace_path path/to/dense/workspace \
--PatchMatchStereo.depth_min $MIN_DEPTH \
--PatchMatchStereo.depth_max $MAX_DEPTH
colmap stereo_fusion \
--workspace_path path/to/dense/workspace \
--output_path path/to/dense/workspace/fused.ply
Merge disconnected models
Sometimes COLMAP fails to reconstruct all images into the same model and hence produces multiple sub-models. If those sub-models have common registered images, they can be merged into a single model as post-processing step:
colmap model_merger \
--input_path1 /path/to/sub-model1 \
--input_path2 /path/to/sub-model2 \
--output_path /path/to/merged-model
To improve the quality of the alignment between the two sub-models, it is recommended to run another global bundle adjustment after the merge:
colmap bundle_adjuster \
--input_path /path/to/merged-model \
--output_path /path/to/refined-merged-model
Geo-registration
Geo-registration of models is possible by providing the 3D locations for the camera centers of a subset or all registered images. The 3D similarity transformation between the reconstructed model and the target coordinate frame of the geo-registration is determined from these correspondences.
The geo-registered 3D coordinates can either be extracted from the database (tvec_prior field) or from a user specified text file. For text-files, the geo-registered 3D coordinates of the camera centers for images must be specified with the following format:
image_name1.jpg X1 Y1 Z1
image_name2.jpg X2 Y2 Z2
image_name3.jpg X3 Y3 Z3
...
The coordinates can be either GPS-based (lat/lon/alt) or cartesian-based (x/y/z). In case of GPS coordinates, a conversion will be performed to turn those into cartesian coordinates. The conversion can be done from GPS to ECEF (Earth-Centered-Earth-Fixed) or to ENU (East-North-Up) coordinates. If ENU coordinates are used, the first image GPS coordinates will define the origin of the ENU frame. It is also possible to use ECEF coordinates for alignment and then rotate the aligned reconstruction into the ENU plane.
Note that at least 3 images must be specified to estimate a 3D similarity transformation. Then, the model can be geo-registered using:
colmap model_aligner \
--input_path /path/to/model \
--output_path /path/to/geo-registered-model \
--ref_images_path /path/to/text-file (or --database_path /path/to/databse.db) \
--ref_is_gps 1 \
--alignment_type ecef \
--robust_alignment 1 \
--robust_alignment_max_error 3.0 (where 3.0 is the error threshold to be used in RANSAC)
By default, the robust_alignment flag is set to 1. If this flag is set, a 3D similarity transformation will be estimated with a RANSAC estimator to be robust to potential outliers in the data. In such case, it is required to provide the error threshold to be used in the RANSAC estimator.
Manhattan world alignment
COLMAP has functionality to align the coordinate axes of a reconstruction using
a Manhattan world assumption, i.e. COLMAP can automatically determine the
gravity axis and the major horizontal axis of the Manhattan world through
vanishing point detection in the images. Please, refer to the
model_orientation_aligner
for more details.
Mask image regions
COLMAP supports masking of keypoints during feature extraction two different ways:
1. Passing mask_path
to a folder with image masks. For a given image, the corresponding
mask must have the same sub-path below this root as the image has below
image_path
. The filename must be equal, aside from the added extension
.png
. For example, for an image image_path/abc/012.jpg
, the mask would
be mask_path/abc/012.jpg.png
.
Passing
camera_mask_path
to a single mask image. This single mask is applied to all images.
In both cases no features will be extracted in regions, where the mask image is black (pixel intensity value 0 in grayscale).
Register/localize new images into an existing reconstruction
If you have an existing reconstruction of images and want to register/localize new images within this reconstruction, you can follow these steps:
colmap feature_extractor \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images \
--image_list_path /path/to/image-list.txt
colmap vocab_tree_matcher \
--database_path $PROJECT_PATH/database.db \
--VocabTreeMatching.vocab_tree_path /path/to/vocab-tree.bin \
--VocabTreeMatching.match_list_path /path/to/image-list.txt
colmap image_registrator \
--database_path $PROJECT_PATH/database.db \
--input_path /path/to/existing-model \
--output_path /path/to/model-with-new-images
colmap bundle_adjuster \
--input_path /path/to/model-with-new-images \
--output_path /path/to/model-with-new-images
Note that this first extracts features for the new images, then matches them to the existing images in the database, and finally registers them into the model. The image list text file contains a list of images to extract and match, specified as one image file name per line. The bundle adjustment is optional.
If you need a more accurate image registration with triangulation, then you
should restart or continue the reconstruction process rather than just
registering the images to the model. Instead of running the
image_registrator
, you should run the mapper
to continue the
reconstruction process from the existing model:
colmap mapper \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images \
--input_path /path/to/existing-model \
--output_path /path/to/model-with-new-images
Or, alternatively, you can start the reconstruction from scratch:
colmap mapper \
--database_path $PROJECT_PATH/database.db \
--image_path $PROJECT_PATH/images \
--output_path /path/to/model-with-new-images
Note that dense reconstruction must be re-run from scratch after running the
mapper
or the bundle_adjuster
, as the coordinate frame of the model can
change during these steps.
Available functionality without GPU/CUDA
If you do not have a CUDA-enabled GPU but some other GPU, you can use all COLMAP
functionality except the dense reconstruction part. However, you can use
external dense reconstruction software as an alternative, as described in the
Tutorial. If you have a GPU with low compute power
or you want to execute COLMAP on a machine without an attached display and
without CUDA support, you can run all steps on the CPU by specifying the
appropriate options (e.g., --SiftExtraction.use_gpu=false
for the feature
extraction step). But note that this might result in a significant slow-down of
the reconstruction pipeline. Please, also note that feature extraction on the
CPU can consume excessive RAM for large images in the default settings, which
might require manually reducing the maximum image size using
--SiftExtraction.max_image_size
and/or setting
--SiftExtraction.first_octave 0
or by manually limiting the number of
threads using --SiftExtraction.num_threads
.
Multi-GPU support in feature extraction/matching
You can run feature extraction/matching on multiple GPUs by specifying multiple
indices for CUDA-enabled GPUs, e.g., --SiftExtraction.gpu_index=0,1,2,3
and
--SiftMatching.gpu_index=0,1,2,3
runs the feature extraction/matching on 4
GPUs in parallel. Note that you can only run one thread per GPU and this
typically also gives the best performance. By default, COLMAP runs one feature
extraction/matching thread per CUDA-enabled GPU and this usually gives the best
performance as compared to running multiple threads on the same GPU.
Feature matching fails due to illegal memory access
If you encounter the following error message:
MultiplyDescriptor: an illegal memory access was encountered
or the following:
- ERROR: Feature matching failed. This probably caused by insufficient GPU
memory. Consider reducing the maximum number of features.
during feature matching, your GPU runs out of memory. Try decreasing the option
--SiftMatching.max_num_matches
until the error disappears. Note that this
might lead to inferior feature matching results, since the lower-scale input
features will be clamped in order to fit them into GPU memory. Alternatively,
you could change to CPU-based feature matching, but this can become very slow,
or better you buy a GPU with more memory.
The maximum required GPU memory can be approximately estimated using the
following formula: 4 * num_matches * num_matches + 4 * num_matches * 256
.
For example, if you set --SiftMatching.max_num_matches 10000
, the maximum
required GPU memory will be around 400MB, which are only allocated if one of
your images actually has that many features.
Trading off completeness and accuracy in dense reconstruction
If the dense point cloud contains too many outliers and too much noise, try to
increase the value of option --StereoFusion.min_num_pixels
.
If the reconstructed dense surface mesh model using Poisson reconstruction
contains no surface or there are too many outlier surfaces, you should reduce
the value of option --PoissonMeshing.trim
to decrease the surface are and
vice versa to increase it. Also consider to try the reduce the outliers or
increase the completeness in the fusion stage, as described above.
If the reconstructed dense surface mesh model using Delaunay reconstruction
contains too noisy or incomplete surfaces, you should increase the
--DenaunayMeshing.quality_regularization
parameter to obtain a smoother
surface. If the resolution of the mesh is too coarse, you should reduce the
--DelaunayMeshing.max_proj_dist
option to a lower value.
Improving dense reconstruction results for weakly textured surfaces
For scenes with weakly textured surfaces it can help to have a high resolution
of the input images (--PatchMatchStereo.max_image_size
) and a large patch window
radius (--PatchMatchStereo.window_radius
). You may also want to reduce the
filtering threshold for the photometric consistency cost
(--PatchMatchStereo.filter_min_ncc
).
Surface mesh reconstruction
COLMAP supports two types of surface reconstruction algorithms. Poisson surface reconstruction [kazhdan2013] and graph-cut based surface extraction from a Delaunay triangulation. Poisson surface reconstruction typically requires an almost outlier-free input point cloud and it often produces bad surfaces in the presence of outliers or large holes in the input data. The Delaunay triangulation based meshing algorithm is more robust to outliers and in general more scalable to large datasets than the Poisson algorithm, but it usually produces less smooth surfaces. Furthermore, the Delaunay based meshing can be applied to sparse and dense reconstruction results. To increase the smoothness of the surface as a post-processing step, you could use Laplacian smoothing, as e.g. implemented in Meshlab.
Note that the two algorithms can also be combined by first running the Delaunay meshing to robustly filter outliers from the sparse or dense point cloud and then, in the second step, performing Poisson surface reconstruction to obtain a smooth surface.
Speedup dense reconstruction
The dense reconstruction can be speeded up in multiple ways:
Put more GPUs in your system as the dense reconstruction can make use of multiple GPUs during the stereo reconstruction step. Put more RAM into your system and increase the
--PatchMatchStereo.cache_size
,--StereoFusion.cache_size
to the largest possible value in order to speed up the dense fusion step.Do not perform geometric dense stereo reconstruction
--PatchMatchStereo.geom_consistency false
. Make sure to also enable--PatchMatchStereo.filter true
in this case.Reduce the
--PatchMatchStereo.max_image_size
,--StereoFusion.max_image_size
values to perform dense reconstruction on a maximum image resolution.Reduce the number of source images per reference image to be considered, as described here.
Increase the patch windows step
--PatchMatchStereo.window_step
to 2.Reduce the patch window radius
--PatchMatchStereo.window_radius
.Reduce the number of patch match iterations
--PatchMatchStereo.num_iterations
.Reduce the number of sampled views
--PatchMatchStereo.num_samples
.To speedup the dense stereo and fusion step for very large reconstructions, you can use CMVS to partition your scene into multiple clusters and to prune redundant images, as described here.
Note that apart from upgrading your hardware, the proposed changes might degrade the quality of the dense reconstruction results. When canceling the stereo reconstruction process and restarting it later, the previous progress is not lost and any already processed views will be skipped.
Reduce memory usage during dense reconstruction
If you run out of GPU memory during patch match stereo, you can either reduce
the maximum image size by setting the option --PatchMatchStereo.max_image_size
or
reduce the number of source images in the stereo/patch-match.cfg
file from
e.g. __auto__, 30
to __auto__, 10
. Note that enabling the
geom_consistency
option increases the required GPU memory.
If you run out of CPU memory during stereo or fusion, you can reduce the
--PatchMatchStereo.cache_size
or --StereoFusion.cache_size
specified in
gigabytes or you can reduce --PatchMatchStereo.max_image_size
or
--StereoFusion.max_image_size
. Note that a too low value might lead to very
slow processing and heavy load on the hard disk.
For large-scale reconstructions of several thousands of images, you should
consider splitting your sparse reconstruction into more manageable clusters of
images using e.g. CMVS [furukawa10]. In addition, CMVS allows to prune
redundant images observing the same scene elements. Note that, for this use
case, COLMAP’s dense reconstruction pipeline also supports the PMVS/CMVS folder
structure when executed from the command-line. Please, refer to the workspace
folder for example shell scripts. Note that the example shell scripts for
PMVS/CMVS are only generated, if the output type is set to PMVS. Since CMVS
produces highly overlapping clusters, it is recommended to increase the default
value of 100 images per cluster to as high as possible according to your
available system resources and speed requirements. To change the number of
images using CMVS, you must modify the shell scripts accordingly. For example,
cmvs pmvs/ 500
to limit each cluster to 500 images. If you want to use CMVS
to prune redundant images but not to cluster the scene, you can simply set this
number to a very large value.
Manual specification of source images during dense reconstruction
You can change the number of source images in the stereo/patch-match.cfg
file from e.g. __auto__, 30
to __auto__, 10
. This selects the images
with the most visual overlap automatically as source images. You can also use
all other images as source images, by specifying __all__
. Alternatively, you
can manually specify images with their name, for example:
image1.jpg
image2.jpg, image3.jpg
image2.jpg
image1.jpg, image3.jpg
image3.jpg
image1.jpg, image2.jpg
Here, image2.jpg
and image3.jpg
are used as source images for
image1.jpg
, etc.
Multi-GPU support in dense reconstruction
You can run dense reconstruction on multiple GPUs by specifying multiple indices
for CUDA-enabled GPUs, e.g., --PatchMatchStereo.gpu_index=0,1,2,3
runs the dense
reconstruction on 4 GPUs in parallel. You can also run multiple dense
reconstruction threads on the same GPU by specifying the same GPU index twice,
e.g., --PatchMatchStereo.gpu_index=0,0,1,1,2,3
. By default, COLMAP runs one
dense reconstruction thread per CUDA-enabled GPU.
Fix GPU freezes and timeouts during dense reconstruction
The stereo reconstruction pipeline runs on the GPU using CUDA and puts the GPU under heavy load. You might experience a display freeze or even a program crash during the reconstruction. As a solution to this problem, you could use a secondary GPU in your system, that is not connected to your display by setting the GPU indices explicitly (usually index 0 corresponds to the card that the display is attached to). Alternatively, you can increase the GPU timeouts of your system, as detailed in the following.
By default, the Windows operating system detects response problems from the GPU, and recovers to a functional desktop by resetting the card and aborting the stereo reconstruction process. The solution is to increase the so-called “Timeout Detection & Recovery” (TDR) delay to a larger value. Please, refer to the NVIDIA Nsight documentation or to the Microsoft documentation on how to increase the delay time under Windows. You can increase the delay using the following Windows Registry entries:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
"TdrLevel"=dword:00000001
"TdrDelay"=dword:00000120
To set the registry entries, execute the following commands using administrator
privileges (e.g., in cmd.exe
or powershell.exe
):
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrLevel /t REG_DWORD /d 00000001
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers /v TdrDelay /t REG_DWORD /d 00000120
and restart your machine afterwards to make the changes effective.
The X window system under Linux/Unix has a similar feature and detects response problems of the GPU. The easiest solution to avoid timeout problems under the X window system is to shut it down and run the stereo reconstruction from the command-line. Under Ubuntu, you could first stop X using:
sudo service lightdm stop
And then run the dense reconstruction code from the command-line:
colmap patch_match_stereo ...
Finally, you can restart your desktop environment with the following command:
sudo service lightdm start
If the dense reconstruction still crashes after these changes, the reason is probably insufficient GPU memory, as discussed in a separate item in this list.


:: com :: sun :: star :: text ::
|
| struct VertOrientationFormat |
|
- Description
- describes the vertical orientation of an object.
If VerticalOrientation == VERT_NONE , then the value "YPos"
describes the distance from the top of the context. Otherwise "YPos"
is ignored.
|
| Elements' Summary |
| YPos |
contains the distance from top. Only valid if the property
VerticalOrientation contains the value VERT_NONE.
|
| VerticalOrientation |
determines the vertical alignment of an object.
The values refer to com::sun::star::VertOrientation.
|
| VerticalRelation |
determines the reference position of the vertical alignment. |
| Elements' Details |
YPos
long YPos;
- Description
- contains the distance from top. Only valid if the property
VerticalOrientation contains the value VERT_NONE.
|
|
VerticalOrientation
short VerticalOrientation;
- Description
- determines the vertical alignment of an object.
The values refer to com::sun::star::VertOrientation.
|
|
VerticalRelation
short VerticalRelation;
- Description
- determines the reference position of the vertical alignment.
- See also
- RelOrientation
|
|
Top of Page
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


/**
* The list of Datachannel connection states.
* @attribute DATA_CHANNEL_STATE
* @param {String} CONNECTING Value "connecting"
* The value of the state when Datachannel is attempting to establish a connection.
* @param {String} OPEN Value "open"
* The value of the state when Datachannel has established a connection.
* @param {String} CLOSING Value "closing"
* The value of the state when Datachannel connection is closing.
* @param {String} CLOSED Value "closed"
* The value of the state when Datachannel connection has closed.
* @param {String} ERROR Value "error"
* The value of the state when Datachannel has encountered an exception during connection.
* @param {String} CREATE_ERROR Value "createError"
* The value of the state when Datachannel has failed to establish a connection.
* @param {String} BUFFERED_AMOUNT_LOW Value "bufferedAmountLow"
* The value of the state when Datachannel when the amount of data buffered to be sent
* falls below the Datachannel threshold.
* This state should occur only during after
* sendBlobData() method or sendURLData() method or
* sendP2PMessage() method.
* @param {String} SEND_MESSAGE_ERROR Value "sendMessageError"
* The value of the state when Datachannel when data transfer packets or P2P message fails to send.
* This state should occur only during after
* sendBlobData() method or sendURLData() method or
* sendP2PMessage() method.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_CHANNEL_STATE = {
CONNECTING: 'connecting',
OPEN: 'open',
CLOSING: 'closing',
CLOSED: 'closed',
ERROR: 'error',
CREATE_ERROR: 'createError',
BUFFERED_AMOUNT_LOW: 'bufferedAmountLow',
SEND_MESSAGE_ERROR: 'sendMessageError'
};
/**
* The list of Datachannel types.
* @attribute DATA_CHANNEL_TYPE
* @param {String} MESSAGING Value "messaging"
* The value of the Datachannel type that is used only for messaging in
* sendP2PMessage() method.
* However for Peers that do not support simultaneous data transfers, this Datachannel
* type will be used to do data transfers (1 at a time).
* Each Peer connections will only have one of this Datachannel type and the
* connection will only close when the Peer connection is closed (happens when
* peerConnectionState event triggers parameter payload state as
* CLOSED for Peer).
* @param {String} DATA Value "data"
* The value of the Datachannel type that is used only for a data transfer in
* sendURLData() method and
* sendBlobData() method.
* The connection will close after the data transfer has been completed or terminated (happens when
* dataTransferState event triggers parameter payload
* state as DOWNLOAD_COMPLETED, UPLOAD_COMPLETED,
* REJECTED, CANCEL or ERROR for Peer).
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.DATA_CHANNEL_TYPE = {
MESSAGING: 'messaging',
DATA: 'data'
};
/**
* The list of Datachannel sending message error types.
* @attribute DATA_CHANNEL_MESSAGE_ERROR
* @param {String} MESSAGE Value "message"
* The value of the Datachannel sending message error type when encountered during
* sending P2P message from sendP2PMessage() method.
* @param {String} TRANSFER Value "transfer"
* The value of the Datachannel sending message error type when encountered during
* data transfers from sendURLData() method or
* sendBlobData() method.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype.DATA_CHANNEL_MESSAGE_ERROR = {
MESSAGE: 'message',
TRANSFER: 'transfer'
};
/**
* The list of supported data transfer data types.
* @attribute DATA_TRANSFER_DATA_TYPE
* @param {String} BINARY_STRING Value "binaryString"
* The value of data transfer data type when Blob binary data chunks encoded to Base64 encoded string are
* sent or received over the Datachannel connection for the data transfer session.
* Used only in sendBlobData() method when
* parameter sendChunksAsBinary value is false.
* @param {String} ARRAY_BUFFER Value "arrayBuffer"
* The value of data transfer data type when ArrayBuffer binary data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* Used only in sendBlobData() method when
* parameter sendChunksAsBinary value is true.
* @param {String} BLOB Value "blob"
* The value of data transfer data type when Blob binary data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* Used only in sendBlobData() method when
* parameter sendChunksAsBinary value is true.
* @param {String} STRING Value "string"
* The value of data transfer data type when only string data chunks are
* sent or received over the Datachannel connection for the data transfer session.
* Used only in sendURLData() method.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_TRANSFER_DATA_TYPE = {
BINARY_STRING: 'binaryString',
ARRAY_BUFFER: 'arrayBuffer',
BLOB: 'blob',
STRING: 'string'
};
/**
*

* Note that this is used only for SDK developer purposes.

* Current version: 0.1.0
*

* The value of the current version of the data transfer protocol.
* @attribute DT_PROTOCOL_VERSION
* @type String
* @readOnly
* @for Skylink
* @since 0.5.10
*/
Skylink.prototype.DT_PROTOCOL_VERSION = '0.1.3';
/**
* The list of data transfers directions.
* @attribute DATA_TRANSFER_TYPE
* @param {String} UPLOAD Value "upload"
* The value of the data transfer direction when User is uploading data to Peer.
* @param {String} DOWNLOAD Value "download"
* The value of the data transfer direction when User is downloading data from Peer.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_TRANSFER_TYPE = {
UPLOAD: 'upload',
DOWNLOAD: 'download'
};
/**
* The list of data transfers session types.
* @attribute DATA_TRANSFER_SESSION_TYPE
* @param {String} BLOB Value "blob"
* The value of the session type for
* sendURLData() method data transfer.
* @param {String} DATA_URL Value "dataURL"
* The value of the session type for
* method_sendBlobData() method data transfer.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.DATA_TRANSFER_SESSION_TYPE = {
BLOB: 'blob',
DATA_URL: 'dataURL'
};
/**
* The list of data transfer states.
* @attribute DATA_TRANSFER_STATE
* @param {String} UPLOAD_REQUEST Value "request"
* The value of the state when receiving an upload data transfer request from Peer to User.
* At this stage, the upload data transfer request from Peer may be accepted or rejected with the
* acceptDataTransfer() method invoked by User.
* @parma {String} USER_UPLOAD_REQUEST Value "userRequest"
* The value of the state when User sent an upload data transfer request to Peer.
* At this stage, the upload data transfer request to Peer may be accepted or rejected with the
* acceptDataTransfer() method invoked by Peer.
* @param {String} UPLOAD_STARTED Value "uploadStarted"
* The value of the state when the data transfer request has been accepted
* and data transfer will start uploading data to Peer.
* At this stage, the data transfer may be terminated with the
* cancelDataTransfer() method.
* @param {String} DOWNLOAD_STARTED Value "downloadStarted"
* The value of the state when the data transfer request has been accepted
* and data transfer will start downloading data from Peer.
* At this stage, the data transfer may be terminated with the
* cancelDataTransfer() method.
* @param {String} REJECTED Value "rejected"
* The value of the state when upload data transfer request to Peer has been rejected and terminated.
* @param {String} USER_REJECTED Value "userRejected"
* The value of the state when User rejected and terminated upload data transfer request from Peer.
* @param {String} UPLOADING Value "uploading"
* The value of the state when data transfer is uploading data to Peer.
* @param {String} DOWNLOADING Value "downloading"
* The value of the state when data transfer is downloading data from Peer.
* @param {String} UPLOAD_COMPLETED Value "uploadCompleted"
* The value of the state when data transfer has uploaded successfully to Peer.
* @param {String} DOWNLOAD_COMPLETED Value "downloadCompleted"
* The value of the state when data transfer has downloaded successfully from Peer.
* @param {String} CANCEL Value "cancel"
* The value of the state when data transfer has been terminated from / to Peer.
* @param {String} ERROR Value "error"
* The value of the state when data transfer has errors and has been terminated from / to Peer.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.4.0
*/
Skylink.prototype.DATA_TRANSFER_STATE = {
UPLOAD_REQUEST: 'request',
UPLOAD_STARTED: 'uploadStarted',
DOWNLOAD_STARTED: 'downloadStarted',
REJECTED: 'rejected',
CANCEL: 'cancel',
ERROR: 'error',
UPLOADING: 'uploading',
DOWNLOADING: 'downloading',
UPLOAD_COMPLETED: 'uploadCompleted',
DOWNLOAD_COMPLETED: 'downloadCompleted',
USER_REJECTED: 'userRejected',
USER_UPLOAD_REQUEST: 'userRequest',
START_ERROR: 'startError'
};
/**
* The list of data streaming states.
* @attribute DATA_STREAM_STATE
* @param {String} SENDING_STARTED Value "sendStart"
* The value of the state when data streaming session has started from User to Peer.
* @param {String} RECEIVING_STARTED Value "receiveStart"
* The value of the state when data streaming session has started from Peer to Peer.
* @param {String} RECEIVED Value "received"
* The value of the state when data streaming session data chunk has been received from Peer to User.
* @param {String} SENT Value "sent"
* The value of the state when data streaming session data chunk has been sent from User to Peer.
* @param {String} SENDING_STOPPED Value "sendStop"
* The value of the state when data streaming session has stopped from User to Peer.
* @param {String} RECEIVING_STOPPED Value "receivingStop"
* The value of the state when data streaming session has stopped from Peer to User.
* @param {String} ERROR Value "error"
* The value of the state when data streaming session has errors.
* At this stage, the data streaming state is considered SENDING_STOPPED or
* RECEIVING_STOPPED.
* @param {String} START_ERROR Value "startError"
* The value of the state when data streaming session failed to start from User to Peer.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.18
*/
Skylink.prototype.DATA_STREAM_STATE = {
SENDING_STARTED: 'sendStart',
SENDING_STOPPED: 'sendStop',
RECEIVING_STARTED: 'receiveStart',
RECEIVING_STOPPED: 'receiveStop',
RECEIVED: 'received',
SENT: 'sent',
ERROR: 'error',
START_ERROR: 'startError'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of Peer connection ICE gathering states.
* @attribute CANDIDATE_GENERATION_STATE
* @param {String} GATHERING Value "gathering"
* The value of the state when Peer connection is gathering ICE candidates.
* These ICE candidates are sent to Peer for its connection to check for a suitable matching
* pair of ICE candidates to establish an ICE connection for stream audio, video and data.
* See iceConnectionState event for ICE connection status.
* This state cannot happen until Peer connection remote "offer" / "answer"
* session description is set. See
* peerConnectionState event for session description exchanging status.
* @param {String} COMPLETED Value "completed"
* The value of the state when Peer connection gathering of ICE candidates has completed.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.4.1
*/
Skylink.prototype.CANDIDATE_GENERATION_STATE = {
NEW: 'new',
GATHERING: 'gathering',
COMPLETED: 'completed'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of Peer connection remote ICE candidate processing states for trickle ICE connections.
* @attribute CANDIDATE_PROCESSING_STATE
* @param {String} RECEIVED Value "received"
* The value of the state when the remote ICE candidate was received.
* @param {String} DROPPED Value "received"
* The value of the state when the remote ICE candidate is dropped.
* @param {String} BUFFERED Value "buffered"
* The value of the state when the remote ICE candidate is buffered.
* @param {String} PROCESSING Value "processing"
* The value of the state when the remote ICE candidate is being processed.
* @param {String} PROCESS_SUCCESS Value "processSuccess"
* The value of the state when the remote ICE candidate has been processed successfully.
* The ICE candidate that is processed will be used to check against the list of
* locally generated ICE candidate to start matching for the suitable pair for the best ICE connection.
* @param {String} PROCESS_ERROR Value "processError"
* The value of the state when the remote ICE candidate has failed to be processed.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype.CANDIDATE_PROCESSING_STATE = {
RECEIVED: 'received',
DROPPED: 'dropped',
BUFFERED: 'buffered',
PROCESSING: 'processing',
PROCESS_SUCCESS: 'processSuccess',
PROCESS_ERROR: 'processError'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of Peer connection ICE connection states.
* @attribute ICE_CONNECTION_STATE
* @param {String} CHECKING Value "checking"
* The value of the state when Peer connection is checking for a suitable matching pair of
* ICE candidates to establish ICE connection.
* Exchanging of ICE candidates happens during
* candidateGenerationState event.
* @param {String} CONNECTED Value "connected"
* The value of the state when Peer connection has found a suitable matching pair of
* ICE candidates to establish ICE connection but is still checking for a better
* suitable matching pair of ICE candidates for the best ICE connectivity.
* At this state, ICE connection is already established and audio, video and
* data streaming has already started.
* @param {String} COMPLETED Value "completed"
* The value of the state when Peer connection has found the best suitable matching pair
* of ICE candidates to establish ICE connection and checking has stopped.
* At this state, ICE connection is already established and audio, video and
* data streaming has already started. This may happpen after CONNECTED.
* @param {String} FAILED Value "failed"
* The value of the state when Peer connection ICE connection has failed.
* @param {String} DISCONNECTED Value "disconnected"
* The value of the state when Peer connection ICE connection is disconnected.
* At this state, the Peer connection may attempt to revive the ICE connection.
* This may happen due to flaky network conditions.
* @param {String} CLOSED Value "closed"
* The value of the state when Peer connection ICE connection has closed.
* This happens when Peer connection is closed and no streaming can occur at this stage.
* @param {String} TRICKLE_FAILED Value "trickeFailed"
* The value of the state when Peer connection ICE connection has failed during trickle ICE.
* Trickle ICE is enabled in init() method
* enableIceTrickle option.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.ICE_CONNECTION_STATE = {
STARTING: 'starting',
CHECKING: 'checking',
CONNECTED: 'connected',
COMPLETED: 'completed',
CLOSED: 'closed',
FAILED: 'failed',
TRICKLE_FAILED: 'trickleFailed',
DISCONNECTED: 'disconnected'
};
/**
*

* Note that configuring the protocol may not necessarily result in the desired network transports protocol
* used in the actual TURN network traffic as it depends which protocol the browser selects and connects with.
* This simply configures the TURN ICE server urls <code?transport=(protocol) query option when constructing
* the Peer connection. When all protocols are selected, the ICE servers urls are duplicated with all protocols.
*

* The list of TURN network transport protocols options when constructing Peer connections
* configured in the init() method.
* Example .urls inital input: ["turn:server.com?transport=tcp",
* "turn:server1.com:3478", "turn:server.com?transport=udp"]
* @attribute TURN_TRANSPORT
* @param {String} TCP Value "tcp"
* The value of the option to configure using only TCP network transport protocol.
* Example .urls output: ["turn:server.com?transport=tcp",
* "turn:server1.com:3478?transport=tcp"]
* @param {String} UDP Value "udp"
* The value of the option to configure using only UDP network transport protocol.
* Example .urls output: ["turn:server.com?transport=udp",
* "turn:server1.com:3478?transport=udp"]
* @param {String} ANY Value "any"
* The value of the option to configure using any network transport protocols configured from the Signaling server.
* Example .urls output: ["turn:server.com?transport=tcp",
* "turn:server1.com:3478", "turn:server.com?transport=udp"]
* @param {String} NONE Value "none"
* The value of the option to not configure using any network transport protocols.
* Example .urls output: ["turn:server.com", "turn:server1.com:3478"]
* Configuring this does not mean that no protocols will be used, but
* rather removing ?transport=(protocol) query option in
* the TURN ICE server .urls when constructing the Peer connection.
* @param {String} ALL Value "all"
* The value of the option to configure using both TCP and UDP network transport protocols.
* Example .urls output: ["turn:server.com?transport=tcp",
* "turn:server.com?transport=udp", "turn:server1.com:3478?transport=tcp",
* "turn:server1.com:3478?transport=udp"]
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.4
*/
Skylink.prototype.TURN_TRANSPORT = {
UDP: 'udp',
TCP: 'tcp',
ANY: 'any',
NONE: 'none',
ALL: 'all'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of Peer connection session description exchanging states.
* @attribute PEER_CONNECTION_STATE
* @param {String} STABLE Value "stable"
* The value of the state when there is no session description being exchanged between Peer connection.
* @param {String} HAVE_LOCAL_OFFER Value "have-local-offer"
* The value of the state when local "offer" session description is set.
* This should transition to STABLE state after remote "answer"
* session description is set.
* See handshakeProgress event for a more
* detailed exchanging of session description states.
* @param {String} HAVE_REMOTE_OFFER Value "have-remote-offer"
* The value of the state when remote "offer" session description is set.
* This should transition to STABLE state after local "answer"
* session description is set.
* See handshakeProgress event for a more
* detailed exchanging of session description states.
* @param {String} CLOSED Value "closed"
* The value of the state when Peer connection is closed and no session description can be exchanged and set.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.0
*/
Skylink.prototype.PEER_CONNECTION_STATE = {
STABLE: 'stable',
HAVE_LOCAL_OFFER: 'have-local-offer',
HAVE_REMOTE_OFFER: 'have-remote-offer',
CLOSED: 'closed'
};
/**
* The list of getConnectionStatus()
* method retrieval states.
* @attribute GET_CONNECTION_STATUS_STATE
* @param {Number} RETRIEVING Value 0
* The value of the state when getConnectionStatus() is retrieving the Peer connection stats.
* @param {Number} RETRIEVE_SUCCESS Value 1
* The value of the state when getConnectionStatus() has retrieved the Peer connection stats successfully.
* @param {Number} RETRIEVE_ERROR Value -1
* The value of the state when getConnectionStatus() has failed retrieving the Peer connection stats.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.GET_CONNECTION_STATUS_STATE = {
RETRIEVING: 0,
RETRIEVE_SUCCESS: 1,
RETRIEVE_ERROR: -1
};
/**
*

* As there are more features getting implemented, there will be eventually more different types of
* server Peers.
*

* The list of available types of server Peer connections.
* @attribute SERVER_PEER_TYPE
* @param {String} MCU Value "mcu"
* The value of the server Peer type that is used for MCU connection.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.SERVER_PEER_TYPE = {
MCU: 'mcu'
//SIP: 'sip'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of available Peer connection bundle policies.
* @attribute BUNDLE_POLICY
* @param {String} MAX_COMPAT Value "max-compat"
* The value of the bundle policy to generate ICE candidates for each media type
* so each media type flows through different transports.
* @param {String} MAX_BUNDLE Value "max-bundle"
* The value of the bundle policy to generate ICE candidates for one media type
* so all media type flows through a single transport.
* @param {String} BALANCED Value "balanced"
* The value of the bundle policy to use MAX_BUNDLE if Peer supports it,
* else fallback to MAX_COMPAT.
* @param {String} NONE Value "none"
* The value of the bundle policy to not use any media bundle.
* This removes the a=group:BUNDLE line from session descriptions.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.18
*/
Skylink.prototype.BUNDLE_POLICY = {
MAX_COMPAT: 'max-compat',
BALANCED: 'balanced',
MAX_BUNDLE: 'max-bundle',
NONE: 'none'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of available Peer connection RTCP mux policies.
* @attribute RTCP_MUX_POLICY
* @param {String} REQUIRE Value "require"
* The value of the RTCP mux policy to generate ICE candidates for RTP only and RTCP shares the same ICE candidates.
* @param {String} NEGOTIATE Value "negotiate"
* The value of the RTCP mux policy to generate ICE candidates for both RTP and RTCP each.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.18
*/
Skylink.prototype.RTCP_MUX_POLICY = {
REQUIRE: 'require',
NEGOTIATE: 'negotiate'
};
/**
*

* Learn more about how ICE works in this
* article here.
*

* The list of available Peer connection certificates cryptographic algorithm to use.
* @attribute PEER_CERTIFICATE
* @param {String} RSA Value "RSA"
* The value of the Peer connection certificate algorithm to use RSA-1024.
* @param {String} ECDSA Value "ECDSA"
* The value of the Peer connection certificate algorithm to use ECDSA.
* @param {String} AUTO Value "AUTO"
* The value of the Peer connection to use the default certificate generated.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.18
*/
Skylink.prototype.PEER_CERTIFICATE = {
RSA: 'RSA',
ECDSA: 'ECDSA',
AUTO: 'AUTO'
};
/**
* The list of Peer connection states.
* @attribute HANDSHAKE_PROGRESS
* @param {String} ENTER Value "enter"
* The value of the connection state when Peer has just entered the Room.
* At this stage, peerJoined event
* is triggered.
* @param {String} WELCOME Value "welcome"
* The value of the connection state when Peer is aware that User has entered the Room.
* At this stage, peerJoined event
* is triggered and Peer connection may commence.
* @param {String} OFFER Value "offer"
* The value of the connection state when Peer connection has set the local / remote "offer"
* session description to start streaming connection.
* @param {String} ANSWER Value "answer"
* The value of the connection state when Peer connection has set the local / remote "answer"
* session description to establish streaming connection.
* @param {String} ERROR Value "error"
* The value of the connection state when Peer connection has failed to establish streaming connection.
* This happens when there are errors that occurs in creating local "offer" /
* "answer", or when setting remote / local "offer" / "answer".
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.HANDSHAKE_PROGRESS = {
ENTER: 'enter',
WELCOME: 'welcome',
OFFER: 'offer',
ANSWER: 'answer',
ERROR: 'error'
};
/**
*

* Note that this feature requires "isPrivileged" flag to be enabled for the App Key
* provided in the init() method, as only Users connecting using
* the App Key with this flag enabled (which we call privileged Users / Peers) can retrieve the list of
* Peer IDs from Rooms within the same App space.
*
* Read more about privileged App Key feature here.
*

* The list of getPeers() method retrieval states.
* @attribute GET_PEERS_STATE
* @param {String} ENQUIRED Value "enquired"
* The value of the state when getPeers() is retrieving the list of Peer IDs
* from Rooms within the same App space from the Signaling server.
* @param {String} RECEIVED Value "received"
* The value of the state when getPeers() has retrieved the list of Peer IDs
* from Rooms within the same App space from the Signaling server successfully.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.GET_PEERS_STATE = {
ENQUIRED: 'enquired',
RECEIVED: 'received'
};
/**
*

* Note that this feature requires "isPrivileged" flag to be enabled and
* "autoIntroduce" flag to be disabled for the App Key provided in the
* init() method, as only Users connecting using
* the App Key with this flag enabled (which we call privileged Users / Peers) can retrieve the list of
* Peer IDs from Rooms within the same App space.
*
* Read more about privileged App Key feature here.
*

* The list of introducePeer method Peer introduction request states.
* @attribute INTRODUCE_STATE
* @param {String} INTRODUCING Value "enquired"
* The value of the state when introduction request for the selected pair of Peers has been made to the Signaling server.
* @param {String} ERROR Value "error"
* The value of the state when introduction request made to the Signaling server
* for the selected pair of Peers has failed.
* @readOnly
* @for Skylink
* @since 0.6.1
*/
Skylink.prototype.INTRODUCE_STATE = {
INTRODUCING: 'introducing',
ERROR: 'error'
};
/**
* The list of Signaling server reaction states during joinRoom() method.
* @attribute SYSTEM_ACTION
* @param {String} WARNING Value "warning"
* The value of the state when Room session is about to end.
* @param {String} REJECT Value "reject"
* The value of the state when Room session has failed to start or has ended.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.1
*/
Skylink.prototype.SYSTEM_ACTION = {
WARNING: 'warning',
REJECT: 'reject'
};
/**
* The list of Signaling server reaction states reason of action code during
* joinRoom() method.
* @attribute SYSTEM_ACTION_REASON
* @param {String} CREDENTIALS_EXPIRED Value "oldTimeStamp"
* The value of the reason code when Room session token has expired.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} CREDENTIALS_ERROR Value "credentialError"
* The value of the reason code when Room session token provided is invalid.
* Happens during joinRoom() method request.
* @param {String} DUPLICATED_LOGIN Value "duplicatedLogin"
* The value of the reason code when Room session token has been used already.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} ROOM_NOT_STARTED Value "notStart"
* The value of the reason code when Room session has not started.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} EXPIRED Value "expired"
* The value of the reason code when Room session has ended already.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} ROOM_LOCKED Value "locked"
* The value of the reason code when Room is locked.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} FAST_MESSAGE Value "fastmsg"
* The value of the reason code when User is flooding socket messages to the Signaling server
* that is sent too quickly within less than a second interval.
* Happens after Room session has started. This can be caused by various methods like
* sendMessage() method,
* setUserData() method,
* muteStream() method,
* enableAudio() method,
* enableVideo() method,
* disableAudio() method and
* disableVideo() method
* Results with: WARNING
* @param {String} ROOM_CLOSING Value "toClose"
* The value of the reason code when Room session is ending.
* Happens after Room session has started. This serves as a prerequisite warning before
* ROOM_CLOSED occurs.
* Results with: WARNING
* @param {String} ROOM_CLOSED Value "roomclose"
* The value of the reason code when Room session has just ended.
* Happens after Room session has started.
* Results with: REJECT
* @param {String} SERVER_ERROR Value "serverError"
* The value of the reason code when Room session fails to start due to some technical errors.
* Happens during joinRoom() method request.
* Results with: REJECT
* @param {String} KEY_ERROR Value "keyFailed"
* The value of the reason code when Room session fails to start due to some technical error pertaining to
* App Key initialization.
* Happens during joinRoom() method request.
* Results with: REJECT
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype.SYSTEM_ACTION_REASON = {
CREDENTIALS_EXPIRED: 'oldTimeStamp',
CREDENTIALS_ERROR: 'credentialError',
DUPLICATED_LOGIN: 'duplicatedLogin',
ROOM_NOT_STARTED: 'notStart',
EXPIRED: 'expired',
ROOM_LOCKED: 'locked',
FAST_MESSAGE: 'fastmsg',
ROOM_CLOSING: 'toclose',
ROOM_CLOSED: 'roomclose',
SERVER_ERROR: 'serverError',
KEY_ERROR: 'keyFailed'
};
/**
* Contains the current version of Skylink Web SDK.
* @attribute VERSION
* @type String
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.VERSION = '@@version';
/**
* The list of init() method ready states.
* @attribute READY_STATE_CHANGE
* @param {Number} INIT Value 0
* The value of the state when init() has just started.
* @param {Number} LOADING Value 1
* The value of the state when init() is authenticating App Key provided
* (and with credentials if provided as well) with the Auth server.
* @param {Number} COMPLETED Value 2
* The value of the state when init() has successfully authenticated with the Auth server.
* Room session token is generated for joining the defaultRoom provided in init().
* Room session token has to be generated each time User switches to a different Room
* in joinRoom() method.
* @param {Number} ERROR Value -1
* The value of the state when init() has failed authenticating with the Auth server.
* [Rel: Skylink.READY_STATE_CHANGE_ERROR]
* @type JSON
* @readOnly
* @for Skylink
* @since 0.1.0
*/
Skylink.prototype.READY_STATE_CHANGE = {
INIT: 0,
LOADING: 1,
COMPLETED: 2,
ERROR: -1
};
/**
* The list of init() method ready state failure codes.
* @attribute READY_STATE_CHANGE_ERROR
* @param {Number} API_INVALID Value 4001
* The value of the failure code when provided App Key in init() does not exists.
* To resolve this, check that the provided App Key exists in
* the Temasys Console.
* @param {Number} API_DOMAIN_NOT_MATCH Value 4002
* The value of the failure code when "domainName" property in the App Key does not
* match the accessing server IP address.
* To resolve this, contact our support portal.
* @param {Number} API_CORS_DOMAIN_NOT_MATCH Value 4003
* The value of the failure code when "corsurl" property in the App Key does not match accessing CORS.
* To resolve this, configure the App Key CORS in
* the Temasys Console.
* @param {Number} API_CREDENTIALS_INVALID Value 4004
* The value of the failure code when there is no [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
* present in the HTTP headers during the request to the Auth server present nor
* options.credentials.credentials configuration provided in the init().
* To resolve this, ensure that CORS are present in the HTTP headers during the request to the Auth server.
* @param {Number} API_CREDENTIALS_NOT_MATCH Value 4005
* The value of the failure code when the options.credentials.credentials configuration provided in the
* init() does not match up with the options.credentials.startDateTime,
* options.credentials.duration or that the "secret" used to generate
* options.credentials.credentials does not match the App Key's "secret property provided.
* To resolve this, check that the options.credentials.credentials is generated correctly and
* that the "secret" used to generate it is from the App Key provided in the init().
* @param {Number} API_INVALID_PARENT_KEY Value 4006
* The value of the failure code when the App Key provided does not belong to any existing App.
* To resolve this, check that the provided App Key exists in
* the Developer Console.
* @param {Number} API_NO_MEETING_RECORD_FOUND Value 4010
* The value of the failure code when provided options.credentials
* does not match any scheduled meetings available for the "Persistent Room" enabled App Key provided.
* See the <a href="http://support.temasys.io/support/solutions/articles/
*<PHONE_NUMBER>1-using-the-persistent-room-feature-to-configure-meetings">Persistent Room article to learn more.
* @param {Number} API_OVER_SEAT_LIMIT Value 4020
* The value of the failure code when App Key has reached its current concurrent users limit.
* To resolve this, use another App Key. To create App Keys dynamically, see the
* Application REST API
* docs for more information.
* @param {Number} API_RETRIEVAL_FAILED Value 4021
* The value of the failure code when App Key retrieval of authentication token fails.
* If this happens frequently, contact our support portal.
* @param {Number} API_WRONG_ACCESS_DOMAIN Value 5005
* The value of the failure code when App Key makes request to the incorrect Auth server.
* To resolve this, ensure that the roomServer is not configured. If this persists even without
* roomServer configuration, contact our support portal.
* @param {Number} XML_HTTP_REQUEST_ERROR Value -1
* The value of the failure code when requesting to Auth server has timed out.
* @param {Number} XML_HTTP_NO_REPONSE_ERROR Value -2
* The value of the failure code when response from Auth server is empty or timed out.
* @param {Number} NO_SOCKET_IO Value 1
* The value of the failure code when dependency Socket.IO client is not loaded.
* To resolve this, ensure that the Socket.IO client dependency is loaded before the Skylink SDK.
* You may use the provided Socket.IO client CDN here.
* @param {Number} NO_XMLHTTPREQUEST_SUPPORT Value 2
* The value of the failure code when
* XMLHttpRequest API required to make request to Auth server is not supported.
* To resolve this, display in the Web UI to ask clients to switch to the list of supported browser
* as listed in here.
* @param {Number} NO_WEBRTC_SUPPORT Value 3
* The value of the failure code when
* RTCPeerConnection API required for Peer connections is not supported.
* To resolve this, display in the Web UI to ask clients to switch to the list of supported browser
* as listed in here.
* For plugin supported browsers, if the clients
* does not have the plugin installed, there will be an installation toolbar that will prompt for installation
* to support the RTCPeerConnection API.
* @param {Number} NO_PATH Value 4
* The value of the failure code when provided init() configuration has errors.
* @param {Number} ADAPTER_NO_LOADED Value 7
* The value of the failure code when dependency AdapterJS
* is not loaded.
* To resolve this, ensure that the AdapterJS dependency is loaded before the Skylink dependency.
* You may use the provided AdapterJS CDN here.
* @param {Number} PARSE_CODECS Value 8
* The value of the failure code when codecs support cannot be parsed and retrieved.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.4.0
*/
Skylink.prototype.READY_STATE_CHANGE_ERROR = {
API_INVALID: 4001,
API_DOMAIN_NOT_MATCH: 4002,
API_CORS_DOMAIN_NOT_MATCH: 4003,
API_CREDENTIALS_INVALID: 4004,
API_CREDENTIALS_NOT_MATCH: 4005,
API_INVALID_PARENT_KEY: 4006,
API_NO_MEETING_RECORD_FOUND: 4010,
API_OVER_SEAT_LIMIT: 4020,
API_RETRIEVAL_FAILED: 4021,
API_WRONG_ACCESS_DOMAIN: 5005,
XML_HTTP_REQUEST_ERROR: -1,
XML_HTTP_NO_REPONSE_ERROR: -2,
NO_SOCKET_IO: 1,
NO_XMLHTTPREQUEST_SUPPORT: 2,
NO_WEBRTC_SUPPORT: 3,
NO_PATH: 4,
ADAPTER_NO_LOADED: 7,
PARSE_CODECS: 8
};
/**
* Spoofs the REGIONAL_SERVER to prevent errors on deployed apps except the fact this no longer works.
* Automatic regional selection has already been implemented hence REGIONAL_SERVER is no longer useful.
* @attribute REGIONAL_SERVER
* @type JSON
* @readOnly
* @private
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype.REGIONAL_SERVER = {
APAC1: '',
US1: ''
};
/**
* The list of User's priority weight schemes for
* joinRoom() method connections.
* @attribute PRIORITY_WEIGHT_SCHEME
* @param {String} ENFORCE_OFFERER Value "enforceOfferer"
* The value of the priority weight scheme to enforce User as the offerer.
* @param {String} ENFORCE_ANSWERER Value "enforceAnswerer"
* The value of the priority weight scheme to enforce User as the answerer.
* @param {String} AUTO Value "auto"
* The value of the priority weight scheme to let User be offerer or answerer based on Signaling server selection.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.18
*/
Skylink.prototype.PRIORITY_WEIGHT_SCHEME = {
ENFORCE_OFFERER: 'enforceOfferer',
ENFORCE_ANSWERER: 'enforceAnswerer',
AUTO: 'auto'
};
/**
* The list of the SDK console API log levels.
* @attribute LOG_LEVEL
* @param {Number} DEBUG Value 4
* The value of the log level that displays console debug,
* log, info, warn and error logs.
* @param {Number} LOG Value 3
* The value of the log level that displays only console log,
* info, warn and error logs.
* @param {Number} INFO Value 2
* The value of the log level that displays only console info,
* warn and error logs.
* @param {Number} WARN Value 1
* The value of the log level that displays only console warn
* and error logs.
* @param {Number} ERROR Value 0
* The value of the log level that displays only console error logs.
* @param {Number} NONE Value -1
* The value of the log level that displays no logs.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.4
*/
Skylink.prototype.LOG_LEVEL = {
DEBUG: 4,
LOG: 3,
INFO: 2,
WARN: 1,
ERROR: 0,
NONE: -1
};
/**
* The list of joinRoom() method socket connection failure states.
* @attribute SOCKET_ERROR
* @param {Number} CONNECTION_FAILED Value 0
* The value of the failure state when joinRoom() socket connection failed to establish with
* the Signaling server at the first attempt.
* @param {Number} RECONNECTION_FAILED Value -1
* The value of the failure state when joinRoom() socket connection failed to establish
* the Signaling server after the first attempt.
* @param {Number} CONNECTION_ABORTED Value -2
* The value of the failure state when joinRoom() socket connection will not attempt
* to reconnect after the failure of the first attempt in CONNECTION_FAILED as there
* are no more ports or transports to attempt for reconnection.
* @param {Number} RECONNECTION_ABORTED Value -3
* The value of the failure state when joinRoom() socket connection will not attempt
* to reconnect after the failure of several attempts in RECONNECTION_FAILED as there
* are no more ports or transports to attempt for reconnection.
* @param {Number} RECONNECTION_ATTEMPT Value -4
* The value of the failure state when joinRoom() socket connection is attempting
* to reconnect with a new port or transport after the failure of attempts in
* CONNECTION_FAILED or RECONNECTED_FAILED.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.6
*/
Skylink.prototype.SOCKET_ERROR = {
CONNECTION_FAILED: 0,
RECONNECTION_FAILED: -1,
CONNECTION_ABORTED: -2,
RECONNECTION_ABORTED: -3,
RECONNECTION_ATTEMPT: -4
};
/**
* The list of joinRoom() method socket connection reconnection states.
* @attribute SOCKET_FALLBACK
* @param {String} NON_FALLBACK Value "nonfallback"
* The value of the reconnection state when joinRoom() socket connection is at its initial state
* without transitioning to any new socket port or transports yet.
* @param {String} FALLBACK_PORT Value "fallbackPortNonSSL"
* The value of the reconnection state when joinRoom() socket connection is reconnecting with
* another new HTTP port using WebSocket transports to attempt to establish connection with Signaling server.
* @param {String} FALLBACK_PORT_SSL Value "fallbackPortSSL"
* The value of the reconnection state when joinRoom() socket connection is reconnecting with
* another new HTTPS port using WebSocket transports to attempt to establish connection with Signaling server.
* @param {String} LONG_POLLING Value "fallbackLongPollingNonSSL"
* The value of the reconnection state when joinRoom() socket connection is reconnecting with
* another new HTTP port using Polling transports to attempt to establish connection with Signaling server.
* @param {String} LONG_POLLING_SSL Value "fallbackLongPollingSSL"
* The value of the reconnection state when joinRoom() socket connection is reconnecting with
* another new HTTPS port using Polling transports to attempt to establish connection with Signaling server.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.6
*/
Skylink.prototype.SOCKET_FALLBACK = {
NON_FALLBACK: 'nonfallback',
FALLBACK_PORT: 'fallbackPortNonSSL',
FALLBACK_SSL_PORT: 'fallbackPortSSL',
LONG_POLLING: 'fallbackLongPollingNonSSL',
LONG_POLLING_SSL: 'fallbackLongPollingSSL'
};
/**
*

* Note that this is used only for SDK developer purposes.

* Current version: 0.1.4
*

* The value of the current version of the Signaling socket message protocol.
* @attribute SM_PROTOCOL_VERSION
* @type String
* @for Skylink
* @since 0.6.0
*/
Skylink.prototype.SM_PROTOCOL_VERSION = '<IP_ADDRESS>';
/**
*

* Note that if the video codec is not supported, the SDK will not configure the local "offer" or
* "answer" session description to prefer the codec.
*

* The list of available video codecs to set as the preferred video codec to use to encode
* sending video data when available encoded video codec for Peer connections
* configured in the init() method.
* @attribute VIDEO_CODEC
* @param {String} AUTO Value "auto"
* The value of the option to not prefer any video codec but rather use the created
* local "offer" / "answer" session description video codec preference.
* @param {String} VP8 Value "VP8"
* The value of the option to prefer the VP8 video codec.
* @param {String} VP9 Value "VP9"
* The value of the option to prefer the VP9 video codec.
* @param {String} H264 Value "H264"
* The value of the option to prefer the H264 video codec.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.10
*/
Skylink.prototype.VIDEO_CODEC = {
AUTO: 'auto',
VP8: 'VP8',
H264: 'H264',
VP9: 'VP9'
//H264UC: 'H264UC'
};
/**
*

* Note that if the audio codec is not supported, the SDK will not configure the local "offer" or
* "answer" session description to prefer the codec.
*

* The list of available audio codecs to set as the preferred audio codec to use to encode
* sending audio data when available encoded audio codec for Peer connections
* configured in the init() method.
* @attribute AUDIO_CODEC
* @param {String} AUTO Value "auto"
* The value of the option to not prefer any audio codec but rather use the created
* local "offer" / "answer" session description audio codec preference.
* @param {String} OPUS Value "opus"
* The value of the option to prefer the OPUS audio codec.
* @param {String} ISAC Value "ISAC"
* The value of the option to prefer the ISAC audio codec.
* @param {String} ILBC Value "ILBC"
* The value of the option to prefer the iLBC audio codec.
* @param {String} G722 Value "G722"
* The value of the option to prefer the G722 audio codec.
* @param {String} PCMA Value "PCMA"
* The value of the option to prefer the G711u audio codec.
* @param {String} PCMU Value "PCMU"
* The value of the option to prefer the G711a audio codec.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.10
*/
Skylink.prototype.AUDIO_CODEC = {
AUTO: 'auto',
ISAC: 'ISAC',
OPUS: 'opus',
ILBC: 'ILBC',
G722: 'G722',
PCMU: 'PCMU',
PCMA: 'PCMA',
//SILK: 'SILK'
};
/**
* The list of available screensharing media sources configured in the
* shareScreen() method.
* @attribute MEDIA_SOURCE
* @param {String} SCREEN Value "screen"
* The value of the option to share entire screen.
* @param {String} WINDOW Value "window"
* The value of the option to share application windows.
* @param {String} TAB Value "tab"
* The value of the option to share browser tab.
* Note that this is only supported by from Chrome 52+ and Opera 39+.
* @param {String} TAB_AUDIO Value "audio"
* The value of the option to share browser tab audio.
* Note that this is only supported by Chrome 52+ and Opera 39+.
* options.audio has to be enabled with TAB also requested to enable sharing of tab audio.
* @param {String} APPLICATION Value "application"
* The value of the option to share applications.
* Note that this is only supported by Firefox currently.
* @param {String} BROWSER Value "browser"
* The value of the option to share browser.
* Note that this is only supported by Firefox currently, and requires toggling the media.getUserMedia.browser.enabled
* in about:config.
* @param {String} CAMERA Value "camera"
* The value of the option to share camera.
* Note that this is only supported by Firefox currently.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.10
*/
Skylink.prototype.MEDIA_SOURCE = {
SCREEN: 'screen',
WINDOW: 'window',
TAB: 'tab',
TAB_AUDIO: 'audio',
APPLICATION: 'application',
BROWSER: 'browser',
CAMERA: 'camera'
};
/**
*

* Note that currently getUserMedia() method only configures
* the maximum resolution of the Stream due to browser interopability and support.
*

* The list of
* video resolutions sets configured in the getUserMedia() method.
* @attribute VIDEO_RESOLUTION
* @param {JSON} QQVGA Value { width: 160, height: 120 }
* The value of the option to configure QQVGA resolution.
* Aspect ratio: 4:3
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} HQVGA Value { width: 240, height: 160 }
* The value of the option to configure HQVGA resolution.
* Aspect ratio: 3:2
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} QVGA Value { width: 320, height: 240 }
* The value of the option to configure QVGA resolution.
* Aspect ratio: 4:3
* @param {JSON} WQVGA Value { width: 384, height: 240 }
* The value of the option to configure WQVGA resolution.
* Aspect ratio: 16:10
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} HVGA Value { width: 480, height: 320 }
* The value of the option to configure HVGA resolution.
* Aspect ratio: 3:2
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} VGA Value { width: 640, height: 480 }
* The value of the option to configure VGA resolution.
* Aspect ratio: 4:3
* @param {JSON} WVGA Value { width: 768, height: 480 }
* The value of the option to configure WVGA resolution.
* Aspect ratio: 16:10
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} FWVGA Value { width: 854, height: 480 }
* The value of the option to configure FWVGA resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} SVGA Value { width: 800, height: 600 }
* The value of the option to configure SVGA resolution.
* Aspect ratio: 4:3
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} DVGA Value { width: 960, height: 640 }
* The value of the option to configure DVGA resolution.
* Aspect ratio: 3:2
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} WSVGA Value { width: 1024, height: 576 }
* The value of the option to configure WSVGA resolution.
* Aspect ratio: 16:9
* @param {JSON} HD Value { width: 1280, height: 720 }
* The value of the option to configure HD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on device supports.
* @param {JSON} HDPLUS Value { width: 1600, height: 900 }
* The value of the option to configure HDPLUS resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} FHD Value { width: 1920, height: 1080 }
* The value of the option to configure FHD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on device supports.
* @param {JSON} QHD Value { width: 2560, height: 1440 }
* The value of the option to configure QHD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} WQXGAPLUS Value { width: 3200, height: 1800 }
* The value of the option to configure WQXGAPLUS resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} UHD Value { width: 3840, height: 2160 }
* The value of the option to configure UHD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} UHDPLUS Value { width: 5120, height: 2880 }
* The value of the option to configure UHDPLUS resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} FUHD Value { width: 7680, height: 4320 }
* The value of the option to configure FUHD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @param {JSON} QUHD Value { width: 15360, height: 8640 }
* The value of the option to configure QUHD resolution.
* Aspect ratio: 16:9
* Note that configurating this resolution may not be supported depending on browser and device supports.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.5.6
*/
Skylink.prototype.VIDEO_RESOLUTION = {
QQVGA: { width: 160, height: 120 /*, aspectRatio: '4:3'*/ },
HQVGA: { width: 240, height: 160 /*, aspectRatio: '3:2'*/ },
QVGA: { width: 320, height: 240 /*, aspectRatio: '4:3'*/ },
WQVGA: { width: 384, height: 240 /*, aspectRatio: '16:10'*/ },
HVGA: { width: 480, height: 320 /*, aspectRatio: '3:2'*/ },
VGA: { width: 640, height: 480 /*, aspectRatio: '4:3'*/ },
WVGA: { width: 768, height: 480 /*, aspectRatio: '16:10'*/ },
FWVGA: { width: 854, height: 480 /*, aspectRatio: '16:9'*/ },
SVGA: { width: 800, height: 600 /*, aspectRatio: '4:3'*/ },
DVGA: { width: 960, height: 640 /*, aspectRatio: '3:2'*/ },
WSVGA: { width: 1024, height: 576 /*, aspectRatio: '16:9'*/ },
HD: { width: 1280, height: 720 /*, aspectRatio: '16:9'*/ },
HDPLUS: { width: 1600, height: 900 /*, aspectRatio: '16:9'*/ },
FHD: { width: 1920, height: 1080 /*, aspectRatio: '16:9'*/ },
QHD: { width: 2560, height: 1440 /*, aspectRatio: '16:9'*/ },
WQXGAPLUS: { width: 3200, height: 1800 /*, aspectRatio: '16:9'*/ },
UHD: { width: 3840, height: 2160 /*, aspectRatio: '16:9'*/ },
UHDPLUS: { width: 5120, height: 2880 /*, aspectRatio: '16:9'*/ },
FUHD: { width: 7680, height: 4320 /*, aspectRatio: '16:9'*/ },
QUHD: { width: 15360, height: 8640 /*, aspectRatio: '16:9'*/ }
};
/**
* The list of getUserMedia() method or
* shareScreen() method Stream fallback states.
* @attribute MEDIA_ACCESS_FALLBACK_STATE
* @param {JSON} FALLBACKING Value 0
* The value of the state when getUserMedia() will retrieve audio track only
* when retrieving audio and video tracks failed.
* This can be configured by init() method
* audioFallback option.
* @param {JSON} FALLBACKED Value 1
* The value of the state when getUserMedia() or shareScreen()
* retrieves camera / screensharing Stream successfully but with missing originally required audio or video tracks.
* @param {JSON} ERROR Value -1
* The value of the state when getUserMedia() failed to retrieve audio track only
* after retrieving audio and video tracks failed.
* @readOnly
* @for Skylink
* @since 0.6.14
*/
Skylink.prototype.MEDIA_ACCESS_FALLBACK_STATE = {
FALLBACKING: 0,
FALLBACKED: 1,
ERROR: -1
};
/**
* The list of recording states.
* @attribute RECORDING_STATE
* @param {Number} START Value 0
* The value of the state when recording session has started.
* @param {Number} STOP Value 1
* The value of the state when recording session has stopped.

* At this stage, the recorded videos will go through the mixin server to compile the videos.
* @param {Number} LINK Value 2
* The value of the state when recording session mixin request has been completed.
* @param {Number} ERROR Value -1
* The value of the state state when recording session has errors.
* This can happen during recording session or during mixin of recording videos,
* and at this stage, any current recording session or mixin is aborted.
* @type JSON
* @beta
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype.RECORDING_STATE = {
START: 0,
STOP: 1,
LINK: 2,
ERROR: -1
};
/**
* Stores the data chunk size for Blob transfers.
* @attribute _CHUNK_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._CHUNK_FILE_SIZE = 49152;
/**
* Stores the data chunk size for Blob transfers transferring from/to
* Firefox browsers due to limitation tested in the past in some PCs (linx predominatly).
* @attribute _MOZ_CHUNK_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._MOZ_CHUNK_FILE_SIZE = 12288;
/**
* Stores the data chunk size for binary Blob transfers.
* @attribute _BINARY_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype._BINARY_FILE_SIZE = 65456;
/**
* Stores the data chunk size for binary Blob transfers.
* @attribute _MOZ_BINARY_FILE_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.6.16
*/
Skylink.prototype._MOZ_BINARY_FILE_SIZE = 16384;
/**
* Stores the data chunk size for data URI string transfers.
* @attribute _CHUNK_DATAURL_SIZE
* @type Number
* @private
* @readOnly
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._CHUNK_DATAURL_SIZE = 1212;
/**
* Stores the list of data transfer protocols.
* @attribute _DC_PROTOCOL_TYPE
* @param {String} WRQ The protocol to initiate data transfer.
* @param {String} ACK The protocol to request for data transfer chunk.
* Give -1 to reject the request at the beginning and 0 to accept
* the data transfer request.
* @param {String} CANCEL The protocol to terminate data transfer.
* @param {String} ERROR The protocol when data transfer has errors and has to be terminated.
* @param {String} MESSAGE The protocol that is used to send P2P messages.
* @type JSON
* @readOnly
* @private
* @for Skylink
* @since 0.5.2
*/
Skylink.prototype._DC_PROTOCOL_TYPE = {
WRQ: 'WRQ',
ACK: 'ACK',
ERROR: 'ERROR',
CANCEL: 'CANCEL',
MESSAGE: 'MESSAGE'
};
/**
* Stores the list of socket messaging protocol types.
* See confluence docs for the list based on the current SM_PROTOCOL_VERSION.
* @attribute _SIG_MESSAGE_TYPE
* @type JSON
* @readOnly
* @private
* @for Skylink
* @since 0.5.6
*/
Skylink.prototype._SIG_MESSAGE_TYPE = {
JOIN_ROOM: 'joinRoom',
IN_ROOM: 'inRoom',
ENTER: 'enter',
WELCOME: 'welcome',
RESTART: 'restart',
OFFER: 'offer',
ANSWER: 'answer',
ANSWER_ACK: 'answerAck',
CANDIDATE: 'candidate',
BYE: 'bye',
REDIRECT: 'redirect',
UPDATE_USER: 'updateUserEvent',
ROOM_LOCK: 'roomLockEvent',
MUTE_VIDEO: 'muteVideoEvent',
MUTE_AUDIO: 'muteAudioEvent',
PUBLIC_MESSAGE: 'public',
PRIVATE_MESSAGE: 'private',
STREAM: 'stream',
GROUP: 'group',
GET_PEERS: 'getPeers',
PEER_LIST: 'peerList',
INTRODUCE: 'introduce',
INTRODUCE_ERROR: 'introduceError',
APPROACH: 'approach',
START_RECORDING: 'startRecordingRoom',
STOP_RECORDING: 'stopRecordingRoom',
START_RTMP: 'startRTMP',
STOP_RTMP: 'stopRTMP',
RTMP: 'rtmpEvent',
RECORDING: 'recordingEvent',
END_OF_CANDIDATES: 'endOfCandidates'
};
/**
* Stores the list of socket messaging protocol types to queue when sent less than a second interval.
* @attribute _GROUP_MESSAGE_LIST
* @type Array
* @readOnly
* @private
* @for Skylink
* @since 0.5.10
*/
Skylink.prototype._GROUP_MESSAGE_LIST = [
Skylink.prototype._SIG_MESSAGE_TYPE.STREAM,
Skylink.prototype._SIG_MESSAGE_TYPE.UPDATE_USER,
Skylink.prototype._SIG_MESSAGE_TYPE.MUTE_AUDIO,
Skylink.prototype._SIG_MESSAGE_TYPE.MUTE_VIDEO,
Skylink.prototype._SIG_MESSAGE_TYPE.PUBLIC_MESSAGE
];
/**
*

* Note that this is used only for SDK development purposes.

* Current version: 1.1
*

* The value of the current version of the stats API used.
* @attribute STATS_API_VERSION
* @type String
* @readOnly
* @for Skylink
* @since 0.6.31
*/
Skylink.prototype.STATS_API_VERSION = '1.1';
/**
* The options available for video and audio bitrates (kbps) quality.
* @attribute VIDEO_QUALITY
* @param {JSON} HD Value { video: 3200, audio: 80 }
* The value of option to prefer high definition video and audio bitrates.
* @param {JSON} HQ Value { video: 1200, audio: 50 }
* The value of option to prefer high quality video and audio bitrates.
* @param {JSON} SQ Value { video: 800, audio: 30 }
* The value of option to prefer standard quality video and audio bitrates.
* @param {JSON} LQ Value { video: 500, audio: 20 }
* The value of option to prefer low quality video and audio bitrates.
* @type JSON
* @readOnly
* @for Skylink
* @since 0.6.32
*/
Skylink.prototype.VIDEO_QUALITY = {
HD: { video: 3200, audio: 150 },
HQ: { video: 1200, audio: 80 },
SQ: { video: 800, audio: 30 },
LQ: { video: 400, audio: 20 }
};
/**
* The list of RTMP states.
* @attribute RTMP_STATE
* @param {Number} START Value 0
* The value of the state when live streaming session has started.
* @param {Number} STOP Value 1
* The value of the state when live streaming session has stopped.

* At this stage, the recorded videos will go through the mixin server to compile the videos.
* @param {Number} ERROR Value -1
* The value of the state state when live streaming session has errors.
* @type JSON
* @beta
* @for Skylink
* @since 0.6.34
*/
Skylink.prototype.RTMP_STATE = {
START: 0,
STOP: 1,
ERROR: -1
};


Junior Software Developer
I'm currently attending Lehigh University as a computer science and business major and I plan to continue onto graduate school and get my master's degree in artificial intelligence. I really enjoy programming and learning new languages (both programming and otherwise) and love to work as part of a team to develop larger projects. I always try to have a side project going in order to keep my knowledge fresh and I am looking forward to being able to help in whatever way I can while learning new skills through various internships and opportunities.
Java: I learned Java as my first programming during a course called "Programming in Java" my sophomore year of high school. It remains my favorite programming language and it is what lead me to continue on with computer science.
Python: I learned Python when I took AP Computer Science Principles my senior year of high school as it was the programming language I choose for my create performance task.
HTML/CSS: I have learned HTML and CSS through various summer camps I took. One was the Drexel Digital Development Camp which I took the summer after junior year and the other was Kode with Klossy which I completed after senior year of high school
C: I learned a little bit of C when I took the HavardX course CS50, it was the language they taught the first half of the course. Its stance as a base language for many other languages make it so I want to try and learn similar, but more advanced, langauges like C++.
Swift: I learned Swift because I chose the mobile development track as my final project for the CS50 course I took. I ended up developing a basic to-do list app called ZRoutine. I would like to do more Swift programming in the future for more advanced projects.
SQL: I also learned a little bit of SQL when I took the HavardX course CS50, they taught about its uses regarding databases in a few lessons.
JavaScript: I want to learn JavaScript because it is a widely used language that can be used for many different things. I also think that it would be useful because rarely is there a company that doesn't appreciate an employee who knows JavaScript.


Bingmaps Key
Visit
BingMaps Portal
to obtain a valid key
Cloudconvert API Key
Visit
Cloudconvert Portal
to obtain a valid key
Currencylayer API Key
Visit
Currencylayer Portal
to obtain a valid key
Dynamics 365 Base Url
This is base Url of Dynamics 365


In the seventh rotation, the class learned how to make skateboards and long boards.
I made a skateboard which took me
two tries to get anywhere near right.
There were a few cracks at the head of my skateboard that I decided to ignore.
This turned out alright
becuase once I stained it, The cracks looked kind of cool, not to mention somewhat unnoticeable.
The class also designed and milled it out to make chocolate molds.
Here was mine:


Party time
Watch as Hearts-daft Lee McGregor is serenaded in Edinburgh pub after win over Kash Farooq
by David FowlerLEE McGREGOR was serenaded in an Edinburgh boozer as he celebrated his win over Kash Farooq.
The Scot won an explosive fight by split decision in front of a packed Emirates Arena on Saturday night.
In just his eighth bout as a pro McGregor triumphed to add the British bantamweight belt to his Commonwealth title.
And he partied in style with his Gorgie Hearts AFC team-mates.
The amateur football side uploaded a video of the new champ in the pub with his belt with chants of "Saturday night and I like the way you move Lee McGregor" sang throughout.
One judge scored the contest in favour of McGregor at 114-113 with one opting for Farooq at the same score.
But the 115-112 margin of the third judge was a hugely controversial one, especially after McGregor had a point docked for repeated holding in the tenth.
Speaking after his win, he said: “It was never in doubt. I had a good start. In the later rounds I felt he was sneaking things with his tippy tappy stuff on the inside.
“I felt when I was sticking to my boxing I was winning the rounds quite clearly. Kash is very clever and I had to just stand and grind it out with him now and again.
“But I had a strong finish, and that won me the fight. It was a gruelling, hard battle.
“I was confident I’d won, but when I got the point off I knew it would be tighter. Without that I’d have been very confident.
“I felt he should have had a point off too. I did some holding in the middle rounds, but in the last rounds it was him.
"It doesn’t matter — I’ve got that British title. I’m just so happy.”
Keep u p to date with ALL the latest news and transfers at the Scottish Sun football page


I am a communicative full stack engineer with a focus on responsive design. Currently expanding in Bootstrap, Wordpress, and Ruby.
I graduated from Loyola University Maryland with a B.S. of Computer Science. I have been programming since I was 15. I have over 7 years of educational Java.
I've spent the last two years working in a .NET environment including work in C#, SQL, JQuery, NuGet, and Selenium. I also spent six months working in an environment that uses VB.NET.
I am creating a few sites of my own with Wordpress, and Bootstrap. I have worked with AngularJS and the MVC pattern.
My past experience has included robotics, graphics, and code base optimization. I also have performed academic research as an undergrad.


{# ------------------------------------------------------- #} {# ONE OFF VIEW submit #} {# This page can use any data from http:localhost:2000/cms/#/form/submit/ #} {# Webhook uses the SWIG.js (like Djagno/Twig) templating system. Their documentation is here: #} {# http://paularmstrong.github.io/swig/docs/tags/ #} {# Learn about calling data into Webhook pages here: #} {# http://www.webhook.com/docs/template-rules-and-filters/ #} {# ------------------------------------------------------- #} {# Confused what extends and blocks do? Watch a primer: #} {# http://www.webhook.com/docs/template-inheritance-blocks/ #} {% extends "templates/partials/base.html" %} {# You can copy/paste this line to any page on your site to access the submit data. #} {% set item = get('submit') %} {# This sets our page
{{ item.paragraph_text }}


Herring Cove
Toggle navigation
{{ site.name }}
Get Started
Documentation
Developer Community
Blog
github
Issues
Get Started
Documentation
Developer Community
Blog
github
Issues


public class ObjectFactory
extends java.lang.Object
An ObjectFactory allows you to programatically construct new instances of the Java representation for XML content. The Java representation of XML content can consist of schema derived interfaces and classes representing the binding of schema type definitions, element declarations and model groups. Factory methods for each of these are provided in this class.
| Constructor and Description |
|---|
ObjectFactory()
Create a new ObjectFactory that can be used to create new instances of schema derived classes
for package: ee.riik.schemas.dhl.rkel_letter
|
public ObjectFactory()
public Addressee createAddressee()
Addressee
Addressee
public Signature createSignature()
Signature
Signature
public Compilator createCompilator()
Compilator
Compilator
public LetterType createLetterType()
LetterType
LetterType
public Enclosure createEnclosure()
Enclosure
Enclosure
public AccessRightsType createAccessRightsType()
AccessRightsType
AccessRightsType
public SignatureType createSignatureType()
SignatureType
SignatureType
public SignatureDataType createSignatureDataType()
SignatureDataType
SignatureDataType
public PartyType createPartyType()
PartyType
PartyType
public OrganisationType createOrganisationType()
OrganisationType
OrganisationType
public PersonType createPersonType()
PersonType
PersonType
public IntellectualPropertyRightsType createIntellectualPropertyRightsType()
IntellectualPropertyRightsType
IntellectualPropertyRightsType


Core Olympians
The Olympians were a race of deities, primarily consisting of a third and fourth generation of immortal beings, worshipped as the principal gods of the Greek pantheon and so named because of their residency atop Mount Olympus.
They gained their supremacy in a ten-year-long war of gods, in which Zeus led his siblings to victory over the previous generation of ruling gods, the Titans.
They were a family of gods, the most important consisting of the first generation of Olympians, offspring of the Titans Cronus and Rhea: Zeus, Poseidon, Hera, Demeter and Hestia, along with the principal offspring of Zeus: Athena, Apollo, Artemis, Ares, Aphrodite, Hephaestus, Hermes, and Dionysus.
Although Hades was a major deity in the Greek pantheon, and was the brother of Zeus and the other first generation of Olympians, his realm was far away from Olympus in the underworld, and thus he was not usually considered to be one of the Olympians.
Olympic gods can be contrasted to chthonic gods, including Hades, by mode of sacrifice, the latter receiving sacrifices in a bothros ("pit") or megaron ("sunken chamber") rather than at an altar.
More on the gods:
King of the gods and ruler of Mount Olympus; god of the sky, lightning, thunder, law, order and justice.
The youngest child of the Titans Cronus and Rhea. Brother and husband of Hera, although he had many lovers, also brother of Poseidon, Hades, Demeter, and Hestia.
His symbols include the thunderbolt, eagle, oak tree, bull, scepter, and scales.
Queen of the gods and the goddess of marriage, women, childbirth and family.
The youngest daughter of Cronus and Rhea. Sister and wife of Zeus. Being the goddess of marriage, she frequently tried to get revenge on Zeus' lovers and their children.
Her symbols include the peacock, cuckoo, and cow.
God of the seas, water, storms, hurricanes, earthquakes and horses.
The middle son of Cronus and Rhea. Brother of Zeus and Hades. Married to the Nereid Amphitrite; although, as with many of the male Greek gods, he had many lovers.
His symbols include the horse, bull, dolphin, and trident.
Goddess of the harvest, fertility, agriculture, nature and the seasons. She presided over grains and the fertility of the earth.
The middle daughter of Cronus and Rhea. Also the lover of Zeus and Poseidon, and the mother of Persephone.
Her symbols include the poppy, wheat, torch, cornucopia, and pig.
Goddess of wisdom, handicraft, and warfare.
The daughter of Zeus and the Oceanid Metis, she rose from her father's head fully grown and in full battle armor.
Her symbols include the owl and the olive tree.
God of light, the Sun, prophecy, philosophy, archery, truth, inspiration, poetry, music, arts, manly beauty, medicine, healing, and plague.
The son of Zeus and Leto, and the twin brother of Artemis.
His symbols include the Sun, bow and arrow, lyre, swan, and mouse.
Goddess of the hunt, the wilderness, virginity, the Moon, archery, childbirth, protection and plague.
The daughter of Zeus and Leto, and the twin sister of Apollo.
Her symbols include the Moon, horse, deer, hound, she-bear, snake, cypress tree, and bow and arrow.
God of war, violence, bloodshed and manly virtues.
The son of Zeus and Hera, all the other gods despised him except Aphrodite. His Latin name, Mars, gave us the word "martial."
His symbols include the boar, serpent, dog, vulture, spear, and shield.
Goddess of love, pleasure, passion, procreation, fertility, beauty and desire.
The daughter of Zeus and the Oceanid Dione, or perhaps born from the sea foam after Uranus' blood dripped into the sea after being castrated by his youngest son, Cronus, who then threw his father's genitals into the sea. Married to Hephaestus, although she had many adulterous affairs, most notably with Ares. Her name gave us the word "aphrodisiac", while her Latin name, Venus, gave us the word "venereal".
Her symbols include the dove, bird, apple, bee, swan, myrtle, and rose.
Master blacksmith and craftsman of the gods; god of the forge, craftsmanship, invention, fire and volcanoes.
The son of Hera, either by Zeus or through parthenogenesis. Married to Aphrodite. His Latin name, Vulcan, gave us the word "volcano."
His symbols include fire, anvil, axe, donkey, hammer, tongs, and quail.
Messenger of the gods; god of travel, commerce, communication, borders, eloquence, diplomacy, thieves and games. He was also the guide of dead souls.
The son of Zeus and the nymph Maia. The second-youngest Olympian, just older than Dionysus.
His symbols include the caduceus (staff entwined with two snakes), winged sandals and cap, stork, and tortoise (whose shell he used to invent the lyre).
Goddess of the hearth, fire and of the right ordering of domesticity and the family; she was born into the first Olympian generation and was one of the original twelve Olympians.
She is the first child of Cronus and Rhea, the elder sister of Hades, Demeter, Poseidon, Hera, and Zeus.
God of wine, the grape vine, fertility, festivity, ecstasy, madness and resurrection. Patron god of the art of theatre.
The son of Zeus and the mortal Theban princess Semele. Married to the Cretan princess Ariadne. The youngest Olympian god, as well as the only one to have a mortal mother.
His symbols include the grapevine, ivy, cup, tiger, panther, leopard, dolphin, goat, and pinecone.


Jekyll - Blogging for Developers
You may have noticed that this blog moved from Blogger to a Ghost themed Jekyll website hosted on GitHub pages. It's been a long time coming, and I couldn't be more happy with how things turned out.
Jekyll on GitHub
Jekyll is a static site generator, which allows you to create websites with markdown easily. All of my posts can thus be written in markdown, with code highlighting and version control thanks to GitHub hosting.
To get started, all you need is to find an open source theme that you like
(e.g. Kapsper), clone it, and run jekyll serve
(after installing Jekyll).
Because the posts are written in markdown, you can use your
favorite markdown editor to write your posts in, or just your editors markdown preview
Free Hosting
Hosting on GitHub is completely free (for your first site), and works seamlessly with Jekyll, until you need a plugin. This was the case with Jekyll RSS which is a plugin that generates an RSS feed from my blog posts.
In order to get plugins to work, you need to compile in a separate git branch,
and then deploy to master
. Here is my source branch:
Zolmeister.github.io/tree/src
Here is the publish.sh
script I wrote to make publishing quicker (DO NOT EDIT ON THE MASTER BRANCH):
#!/bin/bash
jekyll build
mv _site/ /tmp/
git checkout master
rm -r *
cp -r /tmp/_site/* .
rm -r /tmp/_site/
git add . -A
git commit -am'publish'
Other platforms
I considered many other platforms before stumbling across Jekyll. Namely Ghost, Medium, and Svbtle. Both Medium and Svbtle control the display of posts, which is a big downside, but they are extremely simple to use just for writing.
Ghost was most interesting, and my inspiration for a Blogging for Developers hackathon project. However, it's development has been slow in coming partially due to a rewrite in Ember.js which took about 4 months. I simply couldn't wait this long, and without free time to contribute to the project I had to abandon the idea of using it.
Closing thoughts
Blogging is a passion of mine. It brings me joy to catalog my activity to help me reflect on the projects I have worked on. I believe it makes me a stronger developer and has been a motivating force behind a lot of the open source work that I do. I would recommend technical blogging to every developer, no matter what projects you work on.


Content Strategy. Digital Research. Curriculum Design.
Find Out MoreFocused on providing the best results for the client, I am methodical in researching stakeholder needs, determining project scope, and working collaboratively with my team to bring a project across the finish line--for the win!
Learn More!Able to work on multiple complex projects at the same time.
Project execution with deep focus and commitment.
Broad experience in digital industries.
A professional, yet upbeat, can-do attitude.
Ready to round out your team? That's great! Give me a call or send me an email and I will get back to you as soon as possible!
+1<PHONE_NUMBER>