🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Book a DemoInstallSign in
Socket

@roomservice/browser

Package Overview
Dependencies
Maintainers
1
Versions
126
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@roomservice/browser - npm Package Compare versions

Comparing version

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