diff --git a/bundles/latest/geckos.io-client.latest.min.js b/bundles/latest/geckos.io-client.latest.min.js index 3f32118..7326ead 100644 --- a/bundles/latest/geckos.io-client.latest.min.js +++ b/bundles/latest/geckos.io-client.latest.min.js @@ -1 +1 @@ -var geckos=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.EVENTS={SEND_OVER_DATA_CHANNEL:"sendOverDataChannel",RECEIVED_FROM_DATA_CHANNEL:"receiveFromDataChannel",DISCONNECTED:"disconnected",DISCONNECT:"disconnect",CONNECTION:"connection",CONNECT:"connect",ERROR:"error",DATA_CHANNEL_IS_OPEN:"dataChannelIsOpen",SEND_TO_ROOM:"sendToRoom",SEND_TO_ALL:"sendToAll",FORWARD_MESSAGE:"forwardMessage",BROADCAST_MESSAGE:"broadcastMessage",RAW_MESSAGE:"rawMessage"};t.ERRORS={BROWSER_NOT_SUPPORTED:"BROWSER_NOT_SUPPORTED",COULD_NOT_PARSE_MESSAGE:"COULD_NOT_PARSE_MESSAGE"}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(5)),i=function(){function e(){this.eventEmitter=new o.default}return e.prototype.emit=function(e,t,n){void 0===n&&(n={}),this.eventEmitter.emit(e,t,n)},e.prototype.on=function(e,t){return this.eventEmitter.on(e,function(e,n){t(e,n)})},e.prototype.removeListener=function(e,t,n){void 0===n&&(n=void 0),this.eventEmitter.removeListener(e,t,n)},e}();t.Bridge=i;var c=new i;t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9);t.isRawMessage=function(e){return"string"==typeof e||e instanceof ArrayBuffer||e instanceof r.ArrayBufferView};t.isObject=function(e){return"object"==typeof e};t.isJSONString=function(e){try{return"string"==typeof e&&(JSON.parse(e),!0)}catch(e){return!1}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(4));t.default=o.default},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function c(e){try{s(r.next(e))}catch(e){i(e)}}function a(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(c,a)}s((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,c={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,r=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!(o=(o=c.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1] dataChannel.send: ",e.message)}}}]).default; \ No newline at end of file +var geckos=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.EVENTS={SEND_OVER_DATA_CHANNEL:"sendOverDataChannel",RECEIVED_FROM_DATA_CHANNEL:"receiveFromDataChannel",DISCONNECTED:"disconnected",DISCONNECT:"disconnect",CONNECTION:"connection",CONNECT:"connect",ERROR:"error",DATA_CHANNEL_IS_OPEN:"dataChannelIsOpen",SEND_TO_ROOM:"sendToRoom",SEND_TO_ALL:"sendToAll",FORWARD_MESSAGE:"forwardMessage",BROADCAST_MESSAGE:"broadcastMessage",RAW_MESSAGE:"rawMessage"};t.ERRORS={BROWSER_NOT_SUPPORTED:"BROWSER_NOT_SUPPORTED",COULD_NOT_PARSE_MESSAGE:"COULD_NOT_PARSE_MESSAGE"}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(5)),i=function(){function e(){this.eventEmitter=new o.default}return e.prototype.emit=function(e,t,n){void 0===n&&(n={}),this.eventEmitter.emit(e,t,n)},e.prototype.on=function(e,t){return this.eventEmitter.on(e,function(e,n){t(e,n)})},e.prototype.removeListener=function(e,t,n){void 0===n&&(n=void 0),this.eventEmitter.removeListener(e,t,n)},e}();t.Bridge=i;var c=new i;t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9);t.isRawMessage=function(e){return"string"==typeof e||e instanceof ArrayBuffer||e instanceof r.ArrayBufferView};t.isObject=function(e){return"object"==typeof e};t.isJSONString=function(e){try{return"string"==typeof e&&(JSON.parse(e),!0)}catch(e){return!1}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(4));t.default=o.default},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function c(e){try{s(r.next(e))}catch(e){i(e)}}function a(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(c,a)}s((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,c={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,r=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!(o=(o=c.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1] dataChannel.send: ",e.message)}}}]).default; \ No newline at end of file diff --git a/bundles/versions/geckos.io-client.1.1.1.min.js b/bundles/versions/geckos.io-client.1.1.1.min.js new file mode 100644 index 0000000..7326ead --- /dev/null +++ b/bundles/versions/geckos.io-client.1.1.1.min.js @@ -0,0 +1 @@ +var geckos=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.EVENTS={SEND_OVER_DATA_CHANNEL:"sendOverDataChannel",RECEIVED_FROM_DATA_CHANNEL:"receiveFromDataChannel",DISCONNECTED:"disconnected",DISCONNECT:"disconnect",CONNECTION:"connection",CONNECT:"connect",ERROR:"error",DATA_CHANNEL_IS_OPEN:"dataChannelIsOpen",SEND_TO_ROOM:"sendToRoom",SEND_TO_ALL:"sendToAll",FORWARD_MESSAGE:"forwardMessage",BROADCAST_MESSAGE:"broadcastMessage",RAW_MESSAGE:"rawMessage"};t.ERRORS={BROWSER_NOT_SUPPORTED:"BROWSER_NOT_SUPPORTED",COULD_NOT_PARSE_MESSAGE:"COULD_NOT_PARSE_MESSAGE"}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(5)),i=function(){function e(){this.eventEmitter=new o.default}return e.prototype.emit=function(e,t,n){void 0===n&&(n={}),this.eventEmitter.emit(e,t,n)},e.prototype.on=function(e,t){return this.eventEmitter.on(e,function(e,n){t(e,n)})},e.prototype.removeListener=function(e,t,n){void 0===n&&(n=void 0),this.eventEmitter.removeListener(e,t,n)},e}();t.Bridge=i;var c=new i;t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9);t.isRawMessage=function(e){return"string"==typeof e||e instanceof ArrayBuffer||e instanceof r.ArrayBufferView};t.isObject=function(e){return"object"==typeof e};t.isJSONString=function(e){try{return"string"==typeof e&&(JSON.parse(e),!0)}catch(e){return!1}}},function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(4));t.default=o.default},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(o,i){function c(e){try{s(r.next(e))}catch(e){i(e)}}function a(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){e.done?o(e.value):new n(function(t){t(e.value)}).then(c,a)}s((r=r.apply(e,t||[])).next())})},o=this&&this.__generator||function(e,t){var n,r,o,i,c={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;c;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,r=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!(o=(o=c.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1] dataChannel.send: ",e.message)}}}]).default; \ No newline at end of file diff --git a/cheatsheet.md b/cheatsheet.md index 79e809f..cf9b7c5 100644 --- a/cheatsheet.md +++ b/cheatsheet.md @@ -8,9 +8,11 @@ import geckos from '@geckos.io/client' /** * start geckos client with these options - * @param {string} options.url default is `${location.protocol}//${location.hostname}` - * @param {number} options.port default is 9208 - * @param {string} label Default: 'geckos.io'. + * @param options.url default is `${location.protocol}//${location.hostname}` + * @param options.port default is 9208 + * @param options.label Default: 'geckos.io'. + * @param options.iceServers Default: []. + * @param options.iceTransportPolicy Default: 'all'. */ const channel = geckos(options) @@ -38,6 +40,7 @@ import geckos from '@geckos.io/server' /** * start geckos server with these options * @param options.iceServers Default: []. + * @param options.iceTransportPolicy Default: 'all'. * @param options.label Default: 'geckos.io'. * @param options.ordered Default: false. * @param options.maxPacketLifeTime Default: null. diff --git a/packages/client/package.json b/packages/client/package.json index 6ccdd1e..19e2877 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@geckos.io/client", - "version": "1.1.0", + "version": "1.1.1", "description": "Real-time client/server communication over UDP using WebRTC and Node.js", "main": "lib/index.js", "author": "Yannick Deubel (https://github.com/yandeu)", diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index 9f14188..7ec41a2 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -8,7 +8,8 @@ import { EventName, EventCallbackClient, ConnectionEventCallbackClient, - EventCallbackRawMessage + EventCallbackRawMessage, + ClientOptions } from '@geckos.io/common/lib/typings' export class ClientChannel { @@ -16,9 +17,9 @@ export class ClientChannel { private connectionsManager: ConnectionsManagerClient private url: string - constructor(url: string, port: number, label: string) { + constructor(url: string, port: number, label: string, rtcConfiguration: RTCConfiguration) { this.url = `${url}:${port}` - this.connectionsManager = new ConnectionsManagerClient(this.url, label) + this.connectionsManager = new ConnectionsManagerClient(this.url, label, rtcConfiguration) } private onconnectionstatechange() { @@ -104,10 +105,18 @@ export class ClientChannel { * @param options.url The url of the server. Default: \`${location.protocol}//${location.hostname}\`. * @param options.port The port of the server. Default: 9208. * @param options.label The label of the DataChannel. Default: 'geckos.io'. + * @param options.iceServers An array of RTCIceServers. See https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer. + * @param options.iceTransportPolicy RTCIceTransportPolicy enum defines string constants which can be used to limit the transport policies of the ICE candidates to be considered during the connection process. */ -const geckosClient = (options: { url?: string; port?: number; label?: string } = {}) => { - const { url = `${location.protocol}//${location.hostname}`, port = 9208, label = 'geckos.io' } = options - return new ClientChannel(url, port, label) +const geckosClient = (options: ClientOptions = {}) => { + const { + iceServers = [], + iceTransportPolicy = 'all', + url = `${location.protocol}//${location.hostname}`, + port = 9208, + label = 'geckos.io' + } = options + return new ClientChannel(url, port, label, { iceServers, iceTransportPolicy }) } export default geckosClient diff --git a/packages/client/src/wrtc/connectionsManager.ts b/packages/client/src/wrtc/connectionsManager.ts index cc3db7e..253eb37 100644 --- a/packages/client/src/wrtc/connectionsManager.ts +++ b/packages/client/src/wrtc/connectionsManager.ts @@ -19,7 +19,7 @@ export default class ConnectionsManagerClient { SendMessage(this.dataChannel, eventName, data) } - constructor(public url: string, public label: string) {} + constructor(public url: string, public label: string, public rtcConfiguration: RTCConfiguration) {} onDataChannel = (ev: RTCDataChannelEvent) => { const { channel } = ev @@ -54,7 +54,11 @@ export default class ConnectionsManagerClient { const { id, localDescription } = this.remotePeerConnection - const configuration: RTCConfiguration = {} + const configuration: RTCConfiguration = { + // @ts-ignore + sdpSemantics: 'unified-plan', + ...this.rtcConfiguration + } const RTCPc = RTCPeerConnection || diff --git a/packages/common/package.json b/packages/common/package.json index 888f6f8..0d8d0e4 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@geckos.io/common", - "version": "1.0.1", + "version": "1.0.2", "description": "The common module for @geckos.io/server and @geckos.io/client.", "main": "lib", "author": "Yannick Deubel (https://github.com/yandeu)", diff --git a/packages/common/src/typings.ts b/packages/common/src/typings.ts index 3979b18..e396787 100644 --- a/packages/common/src/typings.ts +++ b/packages/common/src/typings.ts @@ -18,6 +18,14 @@ export interface ServerOptions { maxPacketLifeTime?: number } +export interface ClientOptions { + iceServers?: RTCIceServer[] + iceTransportPolicy?: RTCIceTransportPolicy + url?: string + port?: number + label?: string +} + export interface EventCallbackClient { (data: Data): void } diff --git a/packages/server/package.json b/packages/server/package.json index 4f4af66..61ce6da 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@geckos.io/server", - "version": "1.1.1", + "version": "1.1.2", "description": "Real-time client/server communication over UDP using WebRTC and Node.js", "main": "lib/index.js", "author": "Yannick Deubel (https://github.com/yandeu)", diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index 4bf399b..a1b8d62 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -123,6 +123,11 @@ export class GeckosServer { * @param options.maxRetransmits The maximum number of times the user agent should attempt to retransmit a message which fails the first time in unreliable mode. While this value is a16-bit unsigned number, each user agent may clamp it to whatever maximum it deems appropriate. Default: 0. */ const geckosServer = (options: ServerOptions = {}) => { + const { iceTransportPolicy } = options + if (iceTransportPolicy === 'relay') { + console.error(`WARNING: iceTransportPolicy "relay" does not work yet on the server!`) + } + return new GeckosServer(options) } diff --git a/packages/server/src/wrtc/webrtcConnection.ts b/packages/server/src/wrtc/webrtcConnection.ts index 4449ece..ab60de2 100644 --- a/packages/server/src/wrtc/webrtcConnection.ts +++ b/packages/server/src/wrtc/webrtcConnection.ts @@ -23,6 +23,8 @@ export default class WebRTCConnection extends DefaultConnection { } let configuration: RTCConfiguration = { + // @ts-ignore + sdpSemantics: 'unified-plan', iceServers: iceServers, iceTransportPolicy: iceTransportPolicy }