Socket
Socket
Sign inDemoInstall

@roomservice/browser

Package Overview
Dependencies
1
Maintainers
1
Versions
126
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.0-20 to 1.0.0-21

108

dist/browser.cjs.development.js

@@ -32,2 +32,20 @@ 'use strict';

function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _unsupportedIterableToArray(o, minLen) {

@@ -258,3 +276,20 @@ if (!o) return;

})).then(function (res) {
return Promise.resolve(res.json());
return Promise.resolve(res.json()).then(function (doc) {
// Parse JSON values
for (var k in doc) {
if (typeof doc[k].value === 'string') {
var json = void 0;
try {
json = JSON.parse(doc[k].value);
} catch (err) {}
if (json) {
doc[k].value = json;
}
}
}
return doc;
});
});

@@ -821,2 +856,28 @@ } catch (e) {

return result;
};
_proto.withoutActorOrExpired = function withoutActorOrExpired(actor) {
var result = {};
for (var key in this.cache) {
for (var a in this.cache[key]) {
var obj = this.cache[key][a];
if (!obj) continue; // remove this actor
if (a === actor && this.cache[key][a]) {
delete this.cache[key][a];
continue;
} // Remove expired
if (new Date() > obj.expAt) {
delete this.cache[key][a];
continue;
}
result[a] = obj.value;
}
}
return result;
} // Deprecated

@@ -853,6 +914,10 @@ ;

_proto.dangerouslyUpdateClientDirectly = function dangerouslyUpdateClientDirectly(body) {
if (body.room !== this.roomID) return;
if (body.from === this.actor) return; // ignore validation msgs
_proto.dangerouslyUpdateClientDirectly = function dangerouslyUpdateClientDirectly(type, body) {
if (type === 'room:rm_guest') {
return this.withoutActorOrExpired(body.guest);
}
if (body.room !== this.roomID) return false;
if (body.from === this.actor) return false; // ignore validation msgs
var obj = {

@@ -1056,14 +1121,25 @@ expAt: new Date(body.expAt * 1000),

!obj ? invariant(false, 'subscribe() expects the first argument to not be undefined.') : void 0;
var _bound = this.ws.bind('presence:fwd', function (body) {
var fwdListener = this.ws.bind('presence:fwd', function (body) {
if (body.room !== _this11.roomID) return;
if (body.key !== onChangeFnOrString) return;
if (body.from === _this11.actor) return;
var newObj = obj.dangerouslyUpdateClientDirectly(body);
var newObj = obj.dangerouslyUpdateClientDirectly('presence:fwd', body);
if (!newObj) return;
!onChangeFn ? invariant(false) : void 0;
onChangeFn(newObj, body.from);
onChangeFn(_extends({}, newObj), body.from);
});
return _bound;
var leaveListener = this.ws.bind('room:rm_guest', function (body) {
if (body.room !== _this11.roomID) return;
var newObj = obj.dangerouslyUpdateClientDirectly('room:rm_guest', body);
if (!newObj) return;
!onChangeFn ? invariant(false) : void 0;
onChangeFn(_extends({}, newObj), body.guest);
});
return [{
event: 'presence:fwd',
fn: fwdListener
}, {
event: 'room:rm_guest',
fn: leaveListener
}];
} // Map and list handler

@@ -1095,7 +1171,13 @@

});
return bound;
return [{
event: 'doc:fwd',
fn: bound
}];
};
_proto.unsubscribe = function unsubscribe(listener) {
this.ws.unbind('doc:fwd', listener);
_proto.unsubscribe = function unsubscribe(listeners) {
for (var _iterator = _createForOfIteratorHelperLoose(listeners), _step; !(_step = _iterator()).done;) {
var l = _step.value;
this.ws.unbind(l.event, l.fn);
}
};

@@ -1102,0 +1184,0 @@

2

dist/browser.cjs.production.min.js

@@ -1,2 +0,2 @@

"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,e=(t=require("tiny-invariant"))&&"object"==typeof t&&"default"in t?t.default:t;function r(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function n(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function o(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return i(t,void 0);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,void 0):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}var s=function(){function t(t){var e=this;this.callbacks={},this.lastTime=0,this.msgsThisMilisecond=0,this.conn=t,this.conn.onmessage=function(t){var r=JSON.parse(t.data);e.dispatch(r.type,r.body)}}var e=t.prototype;return e.timestamp=function(){var t=Date.now();return t===this.lastTime?this.msgsThisMilisecond++:(this.lastTime=t,this.msgsThisMilisecond=0),t+":"+this.msgsThisMilisecond},e.send=function(t,e){var r=this,n=this.timestamp();this.conn.readyState!==this.conn.CONNECTING?this.conn.send(JSON.stringify({type:t,ts:n,ver:0,body:e})):setTimeout((function(){r.send(t,e)}),100+100*Math.random())},e.bind=function(t,e){return this.callbacks[t]=this.callbacks[t]||[],this.callbacks[t].push(e),e},e.unbind=function(t,e){this.callbacks[t]=this.callbacks[t].filter((function(t){return t!==e}))},e.dispatch=function(t,e){var r=this.callbacks[t];if(r)for(var n=0;n<r.length;n++)r[n](e)},t}();function c(t,e){if("root"===e)return"root";var r=e.split(":");return r[0]+":"+t.actors[parseInt(r[1])]}var u=function(){function t(t){this.count=0,this.actor=t,this.nodes={},this.log=[]}var r=t.prototype;return r.import=function(t,r){t||e(!1);for(var n=t.lists[r],i=n.afters||[],o=n.ids||[],s=n.values||[],u=0;u<i.length;u++){var h={after:c(t,i[u]),id:c(t,o[u]),value:s[u]};this.nodes[h.id]=h,this.log.push(h)}this.count=this.log.length},r.get=function(t){if(this.nodes[t])return this.nodes[t].value},r.insert=function(t,r,n){this.log||e(!1);var i=n;i||(i=this.count+":"+this.actor),this.count++;var o={after:t,value:r,id:i};return this.nodes[i]=o,this.log.push(o),i},r.put=function(t,e){this.nodes[t]&&(this.nodes[t].value=e)},r.has=function(t){return!!this.nodes[t]},r.delete=function(t){this.nodes[t].value={t:""}},r.toTree=function(){for(var t,e={children:[],id:"root",value:""},r={root:e},n=o(this.log);!(t=n()).done;){var i=t.value,s={children:[],id:i.id,value:i.value};if(r[i.id]=s,"root"===i.after)e.children.push(s);else{if(!r[i.after])throw new Error("Unexpectedly missing node "+i.after);r[i.after].children.push(s)}}return e},r.sortLog=function(){this.log.sort((function(t,e){var r=t.id.split(":"),n=r[0],i=r[1],o=e.id.split(":"),s=o[0];return n===s?i.localeCompare(o[1]):parseInt(n)-parseInt(s)}))},r.lastID=function(){return 0===this.log.length?"root":(this.sortLog(),function t(e){return e.children&&0!==e.children.length?t(e.children[e.children.length-1]):e}(this.toTree()).id)},r.toArray=function(){return this.sortLog(),function t(e){if(!e.children||0===e.children.length)return[];for(var r,n=[],i=o(e.children);!(r=i()).done;){var s=r.value,c=s.value;if("string"!=typeof s.value){if(""===s.value.t){n=n.concat([].concat(t(s)));continue}throw new Error("Unimplemented")}n=n.concat([c].concat(t(s)))}return n}(this.toTree())},n(t,[{key:"length",get:function(){return Object.keys(this.nodes).length}}]),t}();function h(t){return JSON.stringify(t)}function a(t){return JSON.parse(t)}var d=function(){function t(t,r,n,i,o,s){this.itemIDs=[],this.roomID=r,this.docID=n,this.id=i,this.ws=o,this.rt=new u(s),t.lists[i]||e(!1),this.rt.import(t,i);for(var h=t.lists[i].ids||[],a=0;a<h.length;a++){var d=t.lists[i].values[a];"object"==typeof d&&""===d.t||this.itemIDs.push(c(t,h[a]))}}var r=t.prototype;return r.sendCmd=function(t){this.ws.send("doc:cmd",{room:this.roomID,args:t})},r.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},r.dangerouslyUpdateClientDirectly=function(t){if(t.length<3)throw new Error("Unexpected command: "+t);var e=t[0];if(t[1]!==this.docID||t[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(e){case"lins":var r=t[3],n=t[4],i=t[5];this.itemIDs.splice(this.itemIDs.findIndex((function(t){return t===r}))+1,0,n),this.rt.insert(r,i,n);break;case"lput":this.rt.put(t[3],t[4]);break;case"ldel":var o=t[3];this.rt.delete(o),this.itemIDs.splice(this.itemIDs.findIndex((function(t){return t===o})),1);break;default:throw new Error("Unexpected command keyword: "+e)}return this.clone()},r.get=function(t){var e=this.itemIDs[t];if(e){var r=this.rt.get(e);if(r){if("object"==typeof r){if(""===r.t)return;throw new Error("Unimplemented references")}return a(r)}}},r.set=function(t,e){var r=this.itemIDs[t];if(!r)throw new Error("Index '"+t+"' doesn't already exist. Try .push() or .insertAfter() instead.");var n=h(e);return this.rt.put(r,n),this.sendCmd(["lput",this.docID,this.id,r,n]),this.clone()},r.delete=function(t){var e=this.itemIDs[t];return e?(this.rt.delete(e),this.itemIDs.splice(t,1),this.sendCmd(["ldel",this.docID,this.id,e]),this.clone()):(console.warn("Unknown index: ",t,this.itemIDs),this.clone())},r.insertAfter=function(t,e){var r=this.itemIDs[t];if(!r)throw new RangeError("List '"+this.id+"' has no index: '"+t+"'");var n=h(e),i=this.rt.insert(r,n);return this.itemIDs.splice(t,0,i),this.sendCmd(["lins",this.docID,this.id,r,i,n]),this.clone()},r.push=function(t){var e=this.rt.lastID(),r=h(t),n=this.rt.insert(e,r);return this.itemIDs.push(n),this.sendCmd(["lins",this.docID,this.id,e,n,r]),this.clone()},r.toArray=function(){return this.rt.toArray().map((function(t){return a(t)}))},t}(),f=function(){function t(t,e,r,n,i){for(var o in this.roomID=e,this.docID=r,this.id=n,this.ws=i,this.store={},t){var s=t[o];"string"==typeof s&&(this.store[o]=unescape(s))}}var e=t.prototype;return e.sendCmd=function(t){this.ws.send("doc:cmd",{room:this.roomID,args:t})},e.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},e.dangerouslyUpdateClientDirectly=function(t){if(t.length<3)throw new Error("Unexpected command: "+t);var e=t[0];if(t[1]!==this.docID||t[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(e){case"mput":if(5!==t.length){console.error("Malformed command ",t);break}this.store[t[3]]=unescape(t[4]);break;case"mdel":if(4!==t.length){console.error("Malformed command ",t);break}delete this.store[t[3]];break;default:throw new Error("Unexpected command keyword: "+e)}return this.clone()},e.get=function(t){return this.store[t]},e.set=function(t,e){var r=h(e);return this.store[t]=e,this.sendCmd(["mput",this.docID,this.id,t,r]),this.clone()},e.delete=function(t){return delete this.store[t],this.sendCmd(["mdel",this.docID,this.id,t]),this.clone()},t}(),l=function(){function t(t,e,r,n){this.roomID=t,this.ws=e,this.actor=r,this.token=n,this.cache={},this.send=function(t,e,r){void 0===r&&(r=!1);var n=null,i=!0;return function(){var e=arguments,o=this,s=r&&i,c=function(){t.apply(o,e),n=null};s&&(i=!1,c()),n||(n=setTimeout(c,40))}}(this.ws.send.bind(this.ws))}var e=t.prototype;return e.getAll=function(t){try{var e=this;return Promise.resolve(function(t,e,r,n){try{return Promise.resolve(fetch("https://super.roomservice.dev/presence/"+r+"/"+encodeURIComponent(n),{headers:{Authorization:"Bearer: "+e}})).then((function(t){return Promise.resolve(t.json())}))}catch(t){return Promise.reject(t)}}(0,e.token,e.roomID,t)).then((function(r){return e.cache[t]=r,e.withoutExpiredAndSelf(t)}))}catch(t){return Promise.reject(t)}},e.withoutExpiredAndSelf=function(t){var e={};for(var r in this.cache[t]){var n=this.cache[t][r];new Date>n.expAt?delete this.cache[t][r]:e[r]=n.value}return e},e.set=function(t,e,r){var n=r||60,i=Math.round((new Date).getTime()/1e3)+n;return this.send("presence:cmd",{room:this.roomID,key:t,value:JSON.stringify(e),expAt:i}),this.cache[t]||(this.cache[t]={}),this.cache[t][this.actor]={value:e,expAt:new Date(1e3*i)},this.withoutExpiredAndSelf(t)},e.dangerouslyUpdateClientDirectly=function(t){if(t.room===this.roomID&&t.from!==this.actor){var e={expAt:new Date(1e3*t.expAt),value:JSON.parse(t.value)};return this.cache[t.key]||(this.cache[t.key]={}),this.cache[t.key][t.from]=e,this.withoutExpiredAndSelf(t.key)}},n(t,[{key:"me",get:function(){return console.warn("presence.me() is deprecated and will be removed in a future version!"),this.actor}}]),t}();function m(t){for(var e=window.atob(t),r=e.length,n=new Uint8Array(r),i=0;i<r;i++)n[i]=e.charCodeAt(i);return n.buffer}var v=function(){function t(t){this.ws=new s(t.conn),this.token=t.token,this.roomID=t.roomID,this.docID=t.checkpoint.id,this.actor=t.actor,this.checkpoint=t.checkpoint,this.vs=this.checkpoint.vs}var r=t.prototype;return r.once=function(t){try{var e,r=this;return Promise.race([new Promise((function(t,e){return setTimeout((function(){return e("timeout")}),2e3)})),new Promise((function(n){e=r.ws.bind(t,(function(t){n(t)}))}))]).then((function(){e&&r.ws.unbind(t,e)}))}catch(t){return Promise.reject(t)}},r.reconnect=function(){try{var t=this;t.errorListener||(t.errorListener=t.ws.bind("error",(function(t){console.error("Room Service encountered a server-side error. If you see this, please let us know; this could be a bug.",t)})));var e=t.once("guest:authenticated");return t.ws.send("guest:authenticate",t.token),Promise.resolve(e).then((function(){var e=t.once("room:joined");return t.ws.send("room:join",t.roomID),Promise.resolve(e).then((function(){}))}))}catch(t){return Promise.reject(t)}},r.list=function(t){try{this.checkpoint.lists[t]||(this.ws.send("doc:cmd",{args:["lcreate",this.docID,t],room:this.roomID}),this.checkpoint.lists[t]={afters:[],ids:[],values:[]});var e=new d(this.checkpoint,this.roomID,this.docID,t,this.ws,this.actor);return Promise.resolve(e)}catch(t){return Promise.reject(t)}},r.map=function(t){try{this.checkpoint.maps[t]||this.ws.send("doc:cmd",{args:["mcreate",this.docID,t],room:this.roomID});var e=new f(this.checkpoint.maps[t]||{},this.roomID,this.docID,t,this.ws);return Promise.resolve(e)}catch(t){return Promise.reject(t)}},r.presence=function(){try{var t=new l(this.roomID,this.ws,this.actor,this.token);return Promise.resolve(t)}catch(t){return Promise.reject(t)}},r.subscribe=function(t,r,n){var i=this;return"string"==typeof r?(t||e(!1),this.ws.bind("presence:fwd",(function(o){if(o.room===i.roomID&&o.key===r&&o.from!==i.actor){var s=t.dangerouslyUpdateClientDirectly(o);s&&(n||e(!1),n(s,o.from))}}))):this.ws.bind("doc:fwd",(function(e){if(e.room===i.roomID)if(!e.args||e.args.length<3)console.error("Unexpected command: ",e.args);else if(!function(t,e){if(!t)return!0;if(!e)return!1;for(var r=new Uint8Array(m(t).slice(0,9)),n=new Uint8Array(m(e).slice(0,9)),i=0;i<r.byteLength;i++){if(n[i]>r[i])return!0;if(n[i]<r[i])return!1}return!1}(e.vs,i.vs)&&e.from!==i.actor){var n=[e.args[1],e.args[2]];if(n[0]===i.docID&&n[1]===t.id){i.vs=e.vs;var o=t.dangerouslyUpdateClientDirectly(e.args);r(o,e.from)}}}))},r.unsubscribe=function(t){this.ws.unbind("doc:fwd",t)},n(t,[{key:"me",get:function(){return this.actor}}]),t}();exports.RoomService=function(){function t(t){this.auth=t.auth}return t.prototype.room=function(t){try{var e=new WebSocket("wss://super.roomservice.dev/ws");return Promise.resolve(function(t,e,r,n,i){try{return Promise.resolve(function(t,e,r){try{var n=function(r){if(i)return r;var n=t;return Promise.resolve(fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resources:[{object:"document",reference:"default",permission:"read_write",room:e},{object:"room",reference:e,permission:"join"}]})})).then((function(t){if(401===t.status)throw new Error("AuthURL returned unauthorized");return Promise.resolve(t.json()).then((function(t){var e=t.token,r=t.user,i=t.resources;if(!i||!e||!r)throw new Error("Invalid response from the AuthURL: "+n);return{token:e,guestReference:r,docID:i.find((function(t){return"document"===t.object})).id,roomID:i.find((function(t){return"room"===t.object})).id}}))}))},i=!1,o=function(){if("function"==typeof t)return Promise.resolve(t(e)).then((function(t){if(!t.user)throw new Error("The auth function must return a 'user' key.");var e=t.resources.find((function(t){return"document"===t.object})).id,r=t.resources.find((function(t){return"room"===t.object})).id;return i=!0,{token:t.token,guestReference:t.user,docID:e,roomID:r}}))}();return Promise.resolve(o&&o.then?o.then(n):n(o))}catch(t){return Promise.reject(t)}}(r,n)).then((function(e){return Promise.resolve(function(t,e,r){try{return Promise.resolve(fetch("https://super.roomservice.dev/docs/"+r,{headers:{Authorization:"Bearer: "+e}})).then((function(t){return Promise.resolve(t.json())}))}catch(t){return Promise.reject(t)}}(0,e.token,e.docID)).then((function(r){var n=new v({conn:t,actor:e.guestReference,checkpoint:r.body,token:e.token,roomID:e.roomID});return Promise.resolve(n.reconnect()).then((function(){return n}))}))}))}catch(t){return Promise.reject(t)}}(e,0,this.auth,t))}catch(t){return Promise.reject(t)}},t}();
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,e=(t=require("tiny-invariant"))&&"object"==typeof t&&"default"in t?t.default:t;function r(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function n(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t}function o(){return(o=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t}).apply(this,arguments)}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function s(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return i(t,void 0);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,void 0):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(r=t[Symbol.iterator]()).next.bind(r)}var c=function(){function t(t){var e=this;this.callbacks={},this.lastTime=0,this.msgsThisMilisecond=0,this.conn=t,this.conn.onmessage=function(t){var r=JSON.parse(t.data);e.dispatch(r.type,r.body)}}var e=t.prototype;return e.timestamp=function(){var t=Date.now();return t===this.lastTime?this.msgsThisMilisecond++:(this.lastTime=t,this.msgsThisMilisecond=0),t+":"+this.msgsThisMilisecond},e.send=function(t,e){var r=this,n=this.timestamp();this.conn.readyState!==this.conn.CONNECTING?this.conn.send(JSON.stringify({type:t,ts:n,ver:0,body:e})):setTimeout((function(){r.send(t,e)}),100+100*Math.random())},e.bind=function(t,e){return this.callbacks[t]=this.callbacks[t]||[],this.callbacks[t].push(e),e},e.unbind=function(t,e){this.callbacks[t]=this.callbacks[t].filter((function(t){return t!==e}))},e.dispatch=function(t,e){var r=this.callbacks[t];if(r)for(var n=0;n<r.length;n++)r[n](e)},t}();function u(t,e){if("root"===e)return"root";var r=e.split(":");return r[0]+":"+t.actors[parseInt(r[1])]}var h=function(){function t(t){this.count=0,this.actor=t,this.nodes={},this.log=[]}var r=t.prototype;return r.import=function(t,r){t||e(!1);for(var n=t.lists[r],o=n.afters||[],i=n.ids||[],s=n.values||[],c=0;c<o.length;c++){var h={after:u(t,o[c]),id:u(t,i[c]),value:s[c]};this.nodes[h.id]=h,this.log.push(h)}this.count=this.log.length},r.get=function(t){if(this.nodes[t])return this.nodes[t].value},r.insert=function(t,r,n){this.log||e(!1);var o=n;o||(o=this.count+":"+this.actor),this.count++;var i={after:t,value:r,id:o};return this.nodes[o]=i,this.log.push(i),o},r.put=function(t,e){this.nodes[t]&&(this.nodes[t].value=e)},r.has=function(t){return!!this.nodes[t]},r.delete=function(t){this.nodes[t].value={t:""}},r.toTree=function(){for(var t,e={children:[],id:"root",value:""},r={root:e},n=s(this.log);!(t=n()).done;){var o=t.value,i={children:[],id:o.id,value:o.value};if(r[o.id]=i,"root"===o.after)e.children.push(i);else{if(!r[o.after])throw new Error("Unexpectedly missing node "+o.after);r[o.after].children.push(i)}}return e},r.sortLog=function(){this.log.sort((function(t,e){var r=t.id.split(":"),n=r[0],o=r[1],i=e.id.split(":"),s=i[0];return n===s?o.localeCompare(i[1]):parseInt(n)-parseInt(s)}))},r.lastID=function(){return 0===this.log.length?"root":(this.sortLog(),function t(e){return e.children&&0!==e.children.length?t(e.children[e.children.length-1]):e}(this.toTree()).id)},r.toArray=function(){return this.sortLog(),function t(e){if(!e.children||0===e.children.length)return[];for(var r,n=[],o=s(e.children);!(r=o()).done;){var i=r.value,c=i.value;if("string"!=typeof i.value){if(""===i.value.t){n=n.concat([].concat(t(i)));continue}throw new Error("Unimplemented")}n=n.concat([c].concat(t(i)))}return n}(this.toTree())},n(t,[{key:"length",get:function(){return Object.keys(this.nodes).length}}]),t}();function a(t){return JSON.stringify(t)}function d(t){return JSON.parse(t)}var f=function(){function t(t,r,n,o,i,s){this.itemIDs=[],this.roomID=r,this.docID=n,this.id=o,this.ws=i,this.rt=new h(s),t.lists[o]||e(!1),this.rt.import(t,o);for(var c=t.lists[o].ids||[],a=0;a<c.length;a++){var d=t.lists[o].values[a];"object"==typeof d&&""===d.t||this.itemIDs.push(u(t,c[a]))}}var r=t.prototype;return r.sendCmd=function(t){this.ws.send("doc:cmd",{room:this.roomID,args:t})},r.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},r.dangerouslyUpdateClientDirectly=function(t){if(t.length<3)throw new Error("Unexpected command: "+t);var e=t[0];if(t[1]!==this.docID||t[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(e){case"lins":var r=t[3],n=t[4],o=t[5];this.itemIDs.splice(this.itemIDs.findIndex((function(t){return t===r}))+1,0,n),this.rt.insert(r,o,n);break;case"lput":this.rt.put(t[3],t[4]);break;case"ldel":var i=t[3];this.rt.delete(i),this.itemIDs.splice(this.itemIDs.findIndex((function(t){return t===i})),1);break;default:throw new Error("Unexpected command keyword: "+e)}return this.clone()},r.get=function(t){var e=this.itemIDs[t];if(e){var r=this.rt.get(e);if(r){if("object"==typeof r){if(""===r.t)return;throw new Error("Unimplemented references")}return d(r)}}},r.set=function(t,e){var r=this.itemIDs[t];if(!r)throw new Error("Index '"+t+"' doesn't already exist. Try .push() or .insertAfter() instead.");var n=a(e);return this.rt.put(r,n),this.sendCmd(["lput",this.docID,this.id,r,n]),this.clone()},r.delete=function(t){var e=this.itemIDs[t];return e?(this.rt.delete(e),this.itemIDs.splice(t,1),this.sendCmd(["ldel",this.docID,this.id,e]),this.clone()):(console.warn("Unknown index: ",t,this.itemIDs),this.clone())},r.insertAfter=function(t,e){var r=this.itemIDs[t];if(!r)throw new RangeError("List '"+this.id+"' has no index: '"+t+"'");var n=a(e),o=this.rt.insert(r,n);return this.itemIDs.splice(t,0,o),this.sendCmd(["lins",this.docID,this.id,r,o,n]),this.clone()},r.push=function(t){var e=this.rt.lastID(),r=a(t),n=this.rt.insert(e,r);return this.itemIDs.push(n),this.sendCmd(["lins",this.docID,this.id,e,n,r]),this.clone()},r.toArray=function(){return this.rt.toArray().map((function(t){return d(t)}))},t}(),l=function(){function t(t,e,r,n,o){for(var i in this.roomID=e,this.docID=r,this.id=n,this.ws=o,this.store={},t){var s=t[i];"string"==typeof s&&(this.store[i]=unescape(s))}}var e=t.prototype;return e.sendCmd=function(t){this.ws.send("doc:cmd",{room:this.roomID,args:t})},e.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},e.dangerouslyUpdateClientDirectly=function(t){if(t.length<3)throw new Error("Unexpected command: "+t);var e=t[0];if(t[1]!==this.docID||t[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(e){case"mput":if(5!==t.length){console.error("Malformed command ",t);break}this.store[t[3]]=unescape(t[4]);break;case"mdel":if(4!==t.length){console.error("Malformed command ",t);break}delete this.store[t[3]];break;default:throw new Error("Unexpected command keyword: "+e)}return this.clone()},e.get=function(t){return this.store[t]},e.set=function(t,e){var r=a(e);return this.store[t]=e,this.sendCmd(["mput",this.docID,this.id,t,r]),this.clone()},e.delete=function(t){return delete this.store[t],this.sendCmd(["mdel",this.docID,this.id,t]),this.clone()},t}(),m=function(){function t(t,e,r,n){this.roomID=t,this.ws=e,this.actor=r,this.token=n,this.cache={},this.send=function(t,e,r){void 0===r&&(r=!1);var n=null,o=!0;return function(){var e=arguments,i=this,s=r&&o,c=function(){t.apply(i,e),n=null};s&&(o=!1,c()),n||(n=setTimeout(c,40))}}(this.ws.send.bind(this.ws))}var e=t.prototype;return e.getAll=function(t){try{var e=this;return Promise.resolve(function(t,e,r,n){try{return Promise.resolve(fetch("https://super.roomservice.dev/presence/"+r+"/"+encodeURIComponent(n),{headers:{Authorization:"Bearer: "+e}})).then((function(t){return Promise.resolve(t.json()).then((function(t){for(var e in t)if("string"==typeof t[e].value){var r=void 0;try{r=JSON.parse(t[e].value)}catch(t){}r&&(t[e].value=r)}return t}))}))}catch(t){return Promise.reject(t)}}(0,e.token,e.roomID,t)).then((function(r){return e.cache[t]=r,e.withoutExpiredAndSelf(t)}))}catch(t){return Promise.reject(t)}},e.withoutExpiredAndSelf=function(t){var e={};for(var r in this.cache[t]){var n=this.cache[t][r];new Date>n.expAt?delete this.cache[t][r]:e[r]=n.value}return e},e.withoutActorOrExpired=function(t){var e={};for(var r in this.cache)for(var n in this.cache[r]){var o=this.cache[r][n];o&&(n===t&&this.cache[r][n]||new Date>o.expAt?delete this.cache[r][n]:e[n]=o.value)}return e},e.set=function(t,e,r){var n=r||60,o=Math.round((new Date).getTime()/1e3)+n;return this.send("presence:cmd",{room:this.roomID,key:t,value:JSON.stringify(e),expAt:o}),this.cache[t]||(this.cache[t]={}),this.cache[t][this.actor]={value:e,expAt:new Date(1e3*o)},this.withoutExpiredAndSelf(t)},e.dangerouslyUpdateClientDirectly=function(t,e){if("room:rm_guest"===t)return this.withoutActorOrExpired(e.guest);if(e.room!==this.roomID)return!1;if(e.from===this.actor)return!1;var r={expAt:new Date(1e3*e.expAt),value:JSON.parse(e.value)};return this.cache[e.key]||(this.cache[e.key]={}),this.cache[e.key][e.from]=r,this.withoutExpiredAndSelf(e.key)},n(t,[{key:"me",get:function(){return console.warn("presence.me() is deprecated and will be removed in a future version!"),this.actor}}]),t}();function v(t){for(var e=window.atob(t),r=e.length,n=new Uint8Array(r),o=0;o<r;o++)n[o]=e.charCodeAt(o);return n.buffer}var p=function(){function t(t){this.ws=new c(t.conn),this.token=t.token,this.roomID=t.roomID,this.docID=t.checkpoint.id,this.actor=t.actor,this.checkpoint=t.checkpoint,this.vs=this.checkpoint.vs}var r=t.prototype;return r.once=function(t){try{var e,r=this;return Promise.race([new Promise((function(t,e){return setTimeout((function(){return e("timeout")}),2e3)})),new Promise((function(n){e=r.ws.bind(t,(function(t){n(t)}))}))]).then((function(){e&&r.ws.unbind(t,e)}))}catch(t){return Promise.reject(t)}},r.reconnect=function(){try{var t=this;t.errorListener||(t.errorListener=t.ws.bind("error",(function(t){console.error("Room Service encountered a server-side error. If you see this, please let us know; this could be a bug.",t)})));var e=t.once("guest:authenticated");return t.ws.send("guest:authenticate",t.token),Promise.resolve(e).then((function(){var e=t.once("room:joined");return t.ws.send("room:join",t.roomID),Promise.resolve(e).then((function(){}))}))}catch(t){return Promise.reject(t)}},r.list=function(t){try{this.checkpoint.lists[t]||(this.ws.send("doc:cmd",{args:["lcreate",this.docID,t],room:this.roomID}),this.checkpoint.lists[t]={afters:[],ids:[],values:[]});var e=new f(this.checkpoint,this.roomID,this.docID,t,this.ws,this.actor);return Promise.resolve(e)}catch(t){return Promise.reject(t)}},r.map=function(t){try{this.checkpoint.maps[t]||this.ws.send("doc:cmd",{args:["mcreate",this.docID,t],room:this.roomID});var e=new l(this.checkpoint.maps[t]||{},this.roomID,this.docID,t,this.ws);return Promise.resolve(e)}catch(t){return Promise.reject(t)}},r.presence=function(){try{var t=new m(this.roomID,this.ws,this.actor,this.token);return Promise.resolve(t)}catch(t){return Promise.reject(t)}},r.subscribe=function(t,r,n){var i=this;return"string"==typeof r?(t||e(!1),[{event:"presence:fwd",fn:this.ws.bind("presence:fwd",(function(s){if(s.room===i.roomID&&s.key===r&&s.from!==i.actor){var c=t.dangerouslyUpdateClientDirectly("presence:fwd",s);c&&(n||e(!1),n(o({},c),s.from))}}))},{event:"room:rm_guest",fn:this.ws.bind("room:rm_guest",(function(r){if(r.room===i.roomID){var s=t.dangerouslyUpdateClientDirectly("room:rm_guest",r);s&&(n||e(!1),n(o({},s),r.guest))}}))}]):[{event:"doc:fwd",fn:this.ws.bind("doc:fwd",(function(e){if(e.room===i.roomID)if(!e.args||e.args.length<3)console.error("Unexpected command: ",e.args);else if(!function(t,e){if(!t)return!0;if(!e)return!1;for(var r=new Uint8Array(v(t).slice(0,9)),n=new Uint8Array(v(e).slice(0,9)),o=0;o<r.byteLength;o++){if(n[o]>r[o])return!0;if(n[o]<r[o])return!1}return!1}(e.vs,i.vs)&&e.from!==i.actor){var n=[e.args[1],e.args[2]];if(n[0]===i.docID&&n[1]===t.id){i.vs=e.vs;var o=t.dangerouslyUpdateClientDirectly(e.args);r(o,e.from)}}}))}]},r.unsubscribe=function(t){for(var e,r=s(t);!(e=r()).done;){var n=e.value;this.ws.unbind(n.event,n.fn)}},n(t,[{key:"me",get:function(){return this.actor}}]),t}();exports.RoomService=function(){function t(t){this.auth=t.auth}return t.prototype.room=function(t){try{var e=new WebSocket("wss://super.roomservice.dev/ws");return Promise.resolve(function(t,e,r,n,o){try{return Promise.resolve(function(t,e,r){try{var n=function(r){if(o)return r;var n=t;return Promise.resolve(fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resources:[{object:"document",reference:"default",permission:"read_write",room:e},{object:"room",reference:e,permission:"join"}]})})).then((function(t){if(401===t.status)throw new Error("AuthURL returned unauthorized");return Promise.resolve(t.json()).then((function(t){var e=t.token,r=t.user,o=t.resources;if(!o||!e||!r)throw new Error("Invalid response from the AuthURL: "+n);return{token:e,guestReference:r,docID:o.find((function(t){return"document"===t.object})).id,roomID:o.find((function(t){return"room"===t.object})).id}}))}))},o=!1,i=function(){if("function"==typeof t)return Promise.resolve(t(e)).then((function(t){if(!t.user)throw new Error("The auth function must return a 'user' key.");var e=t.resources.find((function(t){return"document"===t.object})).id,r=t.resources.find((function(t){return"room"===t.object})).id;return o=!0,{token:t.token,guestReference:t.user,docID:e,roomID:r}}))}();return Promise.resolve(i&&i.then?i.then(n):n(i))}catch(t){return Promise.reject(t)}}(r,n)).then((function(e){return Promise.resolve(function(t,e,r){try{return Promise.resolve(fetch("https://super.roomservice.dev/docs/"+r,{headers:{Authorization:"Bearer: "+e}})).then((function(t){return Promise.resolve(t.json())}))}catch(t){return Promise.reject(t)}}(0,e.token,e.docID)).then((function(r){var n=new p({conn:t,actor:e.guestReference,checkpoint:r.body,token:e.token,roomID:e.roomID});return Promise.resolve(n.reconnect()).then((function(){return n}))}))}))}catch(t){return Promise.reject(t)}}(e,0,this.auth,t))}catch(t){return Promise.reject(t)}},t}();
//# sourceMappingURL=browser.cjs.production.min.js.map

@@ -26,2 +26,20 @@ import invariant from 'tiny-invariant';

function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _unsupportedIterableToArray(o, minLen) {

@@ -252,3 +270,20 @@ if (!o) return;

})).then(function (res) {
return Promise.resolve(res.json());
return Promise.resolve(res.json()).then(function (doc) {
// Parse JSON values
for (var k in doc) {
if (typeof doc[k].value === 'string') {
var json = void 0;
try {
json = JSON.parse(doc[k].value);
} catch (err) {}
if (json) {
doc[k].value = json;
}
}
}
return doc;
});
});

@@ -815,2 +850,28 @@ } catch (e) {

return result;
};
_proto.withoutActorOrExpired = function withoutActorOrExpired(actor) {
var result = {};
for (var key in this.cache) {
for (var a in this.cache[key]) {
var obj = this.cache[key][a];
if (!obj) continue; // remove this actor
if (a === actor && this.cache[key][a]) {
delete this.cache[key][a];
continue;
} // Remove expired
if (new Date() > obj.expAt) {
delete this.cache[key][a];
continue;
}
result[a] = obj.value;
}
}
return result;
} // Deprecated

@@ -847,6 +908,10 @@ ;

_proto.dangerouslyUpdateClientDirectly = function dangerouslyUpdateClientDirectly(body) {
if (body.room !== this.roomID) return;
if (body.from === this.actor) return; // ignore validation msgs
_proto.dangerouslyUpdateClientDirectly = function dangerouslyUpdateClientDirectly(type, body) {
if (type === 'room:rm_guest') {
return this.withoutActorOrExpired(body.guest);
}
if (body.room !== this.roomID) return false;
if (body.from === this.actor) return false; // ignore validation msgs
var obj = {

@@ -1050,14 +1115,25 @@ expAt: new Date(body.expAt * 1000),

!obj ? process.env.NODE_ENV !== "production" ? invariant(false, 'subscribe() expects the first argument to not be undefined.') : invariant(false) : void 0;
var _bound = this.ws.bind('presence:fwd', function (body) {
var fwdListener = this.ws.bind('presence:fwd', function (body) {
if (body.room !== _this11.roomID) return;
if (body.key !== onChangeFnOrString) return;
if (body.from === _this11.actor) return;
var newObj = obj.dangerouslyUpdateClientDirectly(body);
var newObj = obj.dangerouslyUpdateClientDirectly('presence:fwd', body);
if (!newObj) return;
!onChangeFn ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
onChangeFn(newObj, body.from);
onChangeFn(_extends({}, newObj), body.from);
});
return _bound;
var leaveListener = this.ws.bind('room:rm_guest', function (body) {
if (body.room !== _this11.roomID) return;
var newObj = obj.dangerouslyUpdateClientDirectly('room:rm_guest', body);
if (!newObj) return;
!onChangeFn ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
onChangeFn(_extends({}, newObj), body.guest);
});
return [{
event: 'presence:fwd',
fn: fwdListener
}, {
event: 'room:rm_guest',
fn: leaveListener
}];
} // Map and list handler

@@ -1089,7 +1165,13 @@

});
return bound;
return [{
event: 'doc:fwd',
fn: bound
}];
};
_proto.unsubscribe = function unsubscribe(listener) {
this.ws.unbind('doc:fwd', listener);
_proto.unsubscribe = function unsubscribe(listeners) {
for (var _iterator = _createForOfIteratorHelperLoose(listeners), _step; !(_step = _iterator()).done;) {
var l = _step.value;
this.ws.unbind(l.event, l.fn);
}
};

@@ -1096,0 +1178,0 @@

import SuperlumeWebSocket from './ws';
import { Prop } from './types';
import { WebSocketPresenceFwdMessage } from './wsMessages';
import { WebSocketPresenceFwdMessage, WebSocketLeaveMessage } from './wsMessages';
export declare class PresenceClient {

@@ -20,2 +20,3 @@ private roomID;

private withoutExpiredAndSelf;
private withoutActorOrExpired;
get me(): string;

@@ -31,5 +32,8 @@ /**

};
dangerouslyUpdateClientDirectly(body: Prop<WebSocketPresenceFwdMessage, 'body'>): {
dangerouslyUpdateClientDirectly(type: 'room:rm_guest', body: Prop<WebSocketLeaveMessage, 'body'>): {
[key: string]: any;
} | undefined;
};
dangerouslyUpdateClientDirectly(type: 'presence:fwd', body: Prop<WebSocketPresenceFwdMessage, 'body'>): {
[key: string]: any;
};
}

@@ -1,6 +0,11 @@

import { WebSocketLikeConnection, DocumentCheckpoint, AuthStrategy } from './types';
import { WebSocketLikeConnection, DocumentCheckpoint, AuthStrategy, Prop } from './types';
import { ListClient } from './ListClient';
import { MapClient } from './MapClient';
import { PresenceClient } from './PresenceClient';
declare type Listener = (args: any) => void;
import { WebSocketServerMessage } from 'wsMessages';
declare type Listener = {
event: Prop<WebSocketServerMessage, 'type'>;
fn: (args: any) => void;
};
declare type ListenerBundle = Array<Listener>;
export declare class RoomClient {

@@ -31,12 +36,12 @@ private ws;

presence(): Promise<PresenceClient>;
subscribe(list: ListClient, onChangeFn: (list: ListClient) => any): Listener;
subscribe(list: ListClient, onChangeFn: (list: ListClient, from: string) => any): Listener;
subscribe(map: MapClient, onChangeFn: (map: MapClient) => {}): Listener;
subscribe(map: MapClient, onChangeFn: (map: MapClient, from: string) => any): Listener;
subscribe(list: ListClient, onChangeFn: (list: ListClient) => any): ListenerBundle;
subscribe(list: ListClient, onChangeFn: (list: ListClient, from: string) => any): ListenerBundle;
subscribe(map: MapClient, onChangeFn: (map: MapClient) => {}): ListenerBundle;
subscribe(map: MapClient, onChangeFn: (map: MapClient, from: string) => any): ListenerBundle;
subscribe<T extends any>(presence: PresenceClient, key: string, onChangeFn: (obj: {
[key: string]: T;
}, from: string) => any): Listener;
unsubscribe(listener: Listener): void;
}, from: string) => any): ListenerBundle;
unsubscribe(listeners: ListenerBundle): void;
}
export declare function createRoom(conn: WebSocketLikeConnection, docsURL: string, authStrategy: AuthStrategy, room: string, document: string): Promise<RoomClient>;
export {};

@@ -1,2 +0,2 @@

import { WebSocketDocFwdMessage, WebSocketDocCmdMessage, WebSocketPresenceCmdMessage, WebSocketPresenceFwdMessage } from './wsMessages';
import { WebSocketDocFwdMessage, WebSocketDocCmdMessage, WebSocketPresenceCmdMessage, WebSocketPresenceFwdMessage, WebSocketLeaveMessage, WebSocketJoinMessage } from './wsMessages';
import { WebSocketLikeConnection, Prop } from 'types';

@@ -11,6 +11,7 @@ declare type Cb = (body: any) => void;

private timestamp;
send(msgType: 'room:join', room: string): void;
send(msgType: 'room:join', room: Prop<WebSocketJoinMessage, 'body'>): void;
send(msgType: 'guest:authenticate', token: string): void;
send(msgType: 'doc:cmd', body: Prop<WebSocketDocCmdMessage, 'body'>): void;
send(msgType: 'presence:cmd', body: Prop<WebSocketPresenceCmdMessage, 'body'>): void;
bind(msgType: 'room:rm_guest', callback: (body: Prop<WebSocketLeaveMessage, 'body'>) => void): Cb;
bind(msgType: 'room:joined', callback: (body: string) => void): Cb;

@@ -17,0 +18,0 @@ bind(msgType: 'doc:fwd', callback: (body: Prop<WebSocketDocFwdMessage, 'body'>) => void): Cb;

@@ -53,2 +53,10 @@ export interface WebSocketAuthenticateMessage {

}
export interface WebSocketLeaveMessage {
ver: number;
type: 'room:rm_guest';
body: {
guest: string;
room: string;
};
}
export interface WebSocketPresenceFwdMessage {

@@ -73,3 +81,3 @@ ver: number;

}
export declare type WebSocketServerMessage = WebSocketAuthenticatedMessage | WebSocketDocFwdMessage | WebSocketPresenceFwdMessage | WebSocketJoinedMessage | WebSocketErrorMessage;
export declare type WebSocketServerMessage = WebSocketAuthenticatedMessage | WebSocketDocFwdMessage | WebSocketPresenceFwdMessage | WebSocketJoinedMessage | WebSocketErrorMessage | WebSocketLeaveMessage;
export declare type WebSocketClientMessage = WebSocketAuthenticateMessage | WebSocketDocCmdMessage | WebSocketPresenceCmdMessage | WebSocketJoinMessage;
{
"version": "1.0.0-20",
"version": "1.0.0-21",
"license": "MIT",

@@ -4,0 +4,0 @@ "main": "dist/index.js",

@@ -14,3 +14,3 @@ <p align="center">

```bash
npm install --save @roomservice/browser
npm install --save @roomservice/browser@1.0.0-20
```

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc