@twilio/voice-sdk
Version:
Twilio's JavaScript Voice SDK
193 lines (178 loc) • 4.63 kB
text/typescript
import { InvalidArgumentError } from './errors';
/**
* Valid edges.
*/
export enum Edge {
/**
* Public edges
*/
Sydney = 'sydney',
SaoPaulo = 'sao-paulo',
Dublin = 'dublin',
Frankfurt = 'frankfurt',
Tokyo = 'tokyo',
Singapore = 'singapore',
Ashburn = 'ashburn',
Umatilla = 'umatilla',
Roaming = 'roaming',
/**
* Interconnect edges
*/
AshburnIx = 'ashburn-ix',
SanJoseIx = 'san-jose-ix',
LondonIx = 'london-ix',
FrankfurtIx = 'frankfurt-ix',
SingaporeIx = 'singapore-ix',
SydneyIx = 'sydney-ix',
TokyoIx = 'tokyo-ix',
}
/**
* Valid current regions.
*
* @deprecated
*
* CLIENT-6831
* This is no longer used or updated for checking validity of regions in the
* SDK. We now allow any string to be passed for region. Invalid regions won't
* be able to connect, and won't throw an exception.
*
* CLIENT-7519
* This is used again to temporarily convert edge values to regions as part of
* Phase 1 Regional. This is still considered deprecated.
*
* @private
*/
export enum Region {
Au1 = 'au1',
Au1Ix = 'au1-ix',
Br1 = 'br1',
De1 = 'de1',
De1Ix = 'de1-ix',
Gll = 'gll',
Ie1 = 'ie1',
Ie1Ix = 'ie1-ix',
Ie1Tnx = 'ie1-tnx',
Jp1 = 'jp1',
Jp1Ix = 'jp1-ix',
Sg1 = 'sg1',
Sg1Ix = 'sg1-ix',
Sg1Tnx = 'sg1-tnx',
Us1 = 'us1',
Us1Ix = 'us1-ix',
Us1Tnx = 'us1-tnx',
Us2 = 'us2',
Us2Ix = 'us2-ix',
Us2Tnx = 'us2-tnx',
}
/**
* Region shortcodes. Maps the full region name from AWS to the Twilio shortcode.
* @private
*/
export const regionShortcodes: { [index: string]: Region } = {
ASIAPAC_SINGAPORE: Region.Sg1,
ASIAPAC_SYDNEY: Region.Au1,
ASIAPAC_TOKYO: Region.Jp1,
EU_FRANKFURT: Region.De1,
EU_IRELAND: Region.Ie1,
SOUTH_AMERICA_SAO_PAULO: Region.Br1,
US_EAST_VIRGINIA: Region.Us1,
US_WEST_OREGON: Region.Us2,
};
/**
* Region to edge mapping, as part of Phase 1 Regional (CLIENT-7519).
* Temporary.
* @private
*/
export const regionToEdge: Record<Region, Edge> = {
[]: Edge.Sydney,
[]: Edge.SaoPaulo,
[]: Edge.Dublin,
[]: Edge.Frankfurt,
[]: Edge.Tokyo,
[]: Edge.Singapore,
[]: Edge.Ashburn,
[]: Edge.Umatilla,
[]: Edge.Roaming,
/**
* Interconnect edges
*/
[]: Edge.AshburnIx,
[]: Edge.SanJoseIx,
[]: Edge.LondonIx,
[]: Edge.FrankfurtIx,
[]: Edge.SingaporeIx,
[]: Edge.SydneyIx,
[]: Edge.TokyoIx,
/**
* Tnx regions
*/
[]: Edge.AshburnIx,
[]: Edge.AshburnIx,
[]: Edge.LondonIx,
[]: Edge.SingaporeIx,
};
/**
* The default edge to connect to and create a chunder uri from, if the edge
* parameter is not specified during setup in `Device`.
* @constant
*/
export const defaultEdge: Edge = Edge.Roaming;
/**
* The default event gateway URI to publish to.
* @constant
* @private
*/
const defaultEventGatewayURI: string = 'eventgw.twilio.com';
/**
* String template for an edge chunder URI
* @param edge - The edge.
*/
function createChunderEdgeURI(edge: string): string {
return `voice-js.${edge}.twilio.com`;
}
/**
* String template for a region insights URI
* @param region - The region.
*/
export function createEventGatewayURI(region: string): string {
return region
? `eventgw.${region}.twilio.com`
: defaultEventGatewayURI;
}
/**
* Create a signaling endpoint URL to connect a websocket to from a chunder URI.
* @param uri the chunder URI to create a signaling endpoint URL for
*/
export function createSignalingEndpointURL(uri: string): string {
return `wss://${uri}/signal`;
}
/**
* Get the URI associated with the passed edge.
* @private
* @param edge - A string or an array of edge values
* @returns An array of chunder URIs
*/
export function getChunderURIs(edge?: string[] | string): string[] {
if (!!edge && typeof edge !== 'string' && !Array.isArray(edge)) {
throw new InvalidArgumentError(
'If `edge` is provided, it must be of type `string` or an array of strings.',
);
}
let uris: string[];
if (edge) {
const edgeParams = Array.isArray(edge) ? edge : [edge];
uris = edgeParams.map((param: Edge) => createChunderEdgeURI(param));
} else {
uris = [createChunderEdgeURI(defaultEdge)];
}
return uris;
}
/**
* Get the region shortcode by its full AWS region string.
*
* @private
* @param region - The region's full AWS string.
*/
export function getRegionShortcode(region: string): Region | null {
return regionShortcodes[region] || null;
}