Socket
Socket
Sign inDemoInstall

@roomservice/browser

Package Overview
Dependencies
Maintainers
2
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 2.1.5-0 to 2.1.5

255

dist/browser.cjs.development.js

@@ -382,66 +382,40 @@ 'use strict';

_proto.toTree = function toTree() {
var root = {
children: [],
id: 'root',
value: ''
};
var trees = {
root: root
};
var childrenById = new Map();
var valueById = new Map();
for (var _iterator = _createForOfIteratorHelperLoose(this.log), _step; !(_step = _iterator()).done;) {
var _childrenById$get;
var node = _step.value;
var tree = {
children: [],
id: node.id,
value: node.value
};
trees[node.id] = tree;
if (node.after === 'root') {
root.children.push(tree);
} else {
/* This can happen if three or more people are
editing this at once. For example:
+---+
+-->| A |
| +---+
|
|
|
+---+ +---+
| B |------>| C |
+---+ +---+
If B adds something after C, but A and C haven't
synced up yet, then A may not know how to apply that
change. To prevent this from diverging, we'll
ignore this branch for the time being.
*/
if (!trees[node.after]) {
continue;
}
if (!childrenById.has(node.after)) {
childrenById.set(node.after, []);
}
trees[node.after].children.push(tree);
}
(_childrenById$get = childrenById.get(node.after)) === null || _childrenById$get === void 0 ? void 0 : _childrenById$get.push(node.id);
valueById.set(node.id, node.value);
}
return root;
};
childrenById.forEach(function (children) {
// sort by logical timestamp descending so that latest inserts appear first
children.sort(function (a, b) {
var _a$split = a.split(':'),
leftCount = _a$split[0],
leftActor = _a$split[1];
_proto.sortLog = function sortLog() {
this.log.sort(function (a, b) {
var _a$id$split = a.id.split(':'),
leftCount = _a$id$split[0],
leftActor = _a$id$split[1];
var _b$split = b.split(':'),
rightCount = _b$split[0],
rightActor = _b$split[1];
var _b$id$split = b.id.split(':'),
rightCount = _b$id$split[0],
rightActor = _b$id$split[1];
if (leftCount === rightCount) {
return leftActor.localeCompare(rightActor);
}
if (leftCount === rightCount) {
return leftActor.localeCompare(rightActor);
}
return parseInt(leftCount) - parseInt(rightCount);
return parseInt(rightCount) - parseInt(leftCount);
});
});
return {
childrenById: childrenById,
valueById: valueById
};
};

@@ -454,53 +428,63 @@

this.sortLog();
var root = this.toTree(); // Search the right side of the tree
function right(t) {
if (!t.children || t.children.length === 0) {
return t;
function right(t, node) {
var children = t.childrenById.get(node);
if (!children || children.length === 0) {
return node;
}
return right(t.children[t.children.length - 1]);
return right(t, children[children.length - 1]);
}
return right(root).id;
return right(root, 'root');
};
_proto.postOrderTraverse = function postOrderTraverse() {
this.sortLog(); // -- Convert the log into a regular tree
_proto.preOrderTraverse = function preOrderTraverse() {
// -- Convert the log into a regular tree
var tree = this.toTree();
var seenNodes = new Set(); // -- Do a depth-first traversal to get the result
var root = this.toTree(); // -- Do a depth-first traversal to get the result
function postorder(t) {
if (!t.children || t.children.length === 0) {
function preOrder(t, node) {
if (seenNodes.has(node)) {
console.warn('RoomService list cycle detected. Consider updating @roomservice/browser.');
return [];
}
var children = [];
seenNodes.add(node);
var result = [];
var value = t.valueById.get(node);
for (var _iterator2 = _createForOfIteratorHelperLoose(t.children), _step2; !(_step2 = _iterator2()).done;) {
var child = _step2.value;
if (typeof child.value !== 'string') {
// Skip tombstones
if (child.value.t === '') {
children = children.concat([].concat(postorder(child)));
continue;
}
if (value) {
if (typeof value === 'string') {
result.push({
value: value,
id: node
});
} else if ('t' in value && value.t === '') ; else {
throw new Error('Unimplemented');
}
}
children = children.concat([child].concat(postorder(child)));
var children = t.childrenById.get(node);
if (!children || children.length === 0) {
return result;
}
return children;
for (var _iterator2 = _createForOfIteratorHelperLoose(children), _step2; !(_step2 = _iterator2()).done;) {
var child = _step2.value;
result = result.concat(preOrder(t, child));
}
return result;
}
return postorder(root);
return preOrder(tree, 'root');
};
_proto.toArray = function toArray() {
return this.postOrderTraverse().map(function (c) {
return c.value;
return this.preOrderTraverse().map(function (idValue) {
return idValue.value;
});

@@ -531,17 +515,17 @@ };

var InnerListClient = /*#__PURE__*/function () {
function InnerListClient(checkpoint, roomID, docID, listID, ws, actor) {
function InnerListClient(props) {
// Map indexes to item ids
this.itemIDs = [];
this.roomID = roomID;
this.docID = docID;
this.id = listID;
this.ws = ws;
this.rt = new ReverseTree(actor);
!checkpoint.lists[listID] ? invariant(false, "Unknown listid '" + listID + "' in checkpoint.") : void 0;
this.rt["import"](checkpoint, listID);
var list = checkpoint.lists[listID];
this.roomID = props.roomID;
this.docID = props.docID;
this.id = props.listID;
this.ws = props.ws;
this.rt = new ReverseTree(props.actor);
!props.checkpoint.lists[props.listID] ? invariant(false, "Unknown listid '" + props.listID + "' in checkpoint.") : void 0;
this.rt["import"](props.checkpoint, props.listID);
var list = props.checkpoint.lists[props.listID];
var ids = list.ids || [];
for (var i = 0; i < ids.length; i++) {
var val = checkpoint.lists[listID].values[i];
var val = props.checkpoint.lists[props.listID].values[i];

@@ -552,3 +536,3 @@ if (typeof val === 'object' && val['t'] === '') {

this.itemIDs.push(unescapeID(checkpoint, ids[i]));
this.itemIDs.push(unescapeID(props.checkpoint, ids[i]));
}

@@ -669,4 +653,18 @@ }

_proto.insertAfter = function insertAfter(index, val) {
var afterID = this.itemIDs[index];
return this.insertAt(index + 1, val);
};
_proto.insertAt = function insertAt(index, val) {
if (index < 0) {
throw 'negative indices unsupported';
}
var afterID;
if (index == 0) {
afterID = 'root';
} else {
afterID = this.itemIDs[index - 1];
}
if (!afterID) {

@@ -712,4 +710,4 @@ throw new RangeError("List '" + this.id + "' has no index: '" + index + "'");

_proto.map = function map(fn) {
return this.rt.postOrderTraverse().map(function (m, i) {
return fn(unescape(m.value), i, m.id);
return this.rt.preOrderTraverse().map(function (idValue, i) {
return fn(unescape(idValue.value), i, idValue.id);
});

@@ -728,11 +726,11 @@ };

var InnerMapClient = /*#__PURE__*/function () {
function InnerMapClient(checkpoint, roomID, docID, mapID, ws) {
this.roomID = roomID;
this.docID = docID;
this.id = mapID;
this.ws = ws;
function InnerMapClient(props) {
this.roomID = props.roomID;
this.docID = props.docID;
this.id = props.mapID;
this.ws = props.ws;
this.store = {}; // import
for (var k in checkpoint) {
var val = checkpoint[k];
for (var k in props.checkpoint) {
var val = props.checkpoint[k];

@@ -876,9 +874,9 @@ if (typeof val === 'string') {

var InnerPresenceClient = /*#__PURE__*/function () {
function InnerPresenceClient(roomID, ws, actor, token) {
function InnerPresenceClient(props) {
var _this = this;
this.roomID = roomID;
this.ws = ws;
this.actor = actor;
this.token = token;
this.roomID = props.roomID;
this.ws = props.ws;
this.actor = props.actor;
this.token = props.token;
this.cache = {};

@@ -1118,3 +1116,3 @@

} else {
console.warn("Unhandled Room Service doc:fwd command: " + cmd + ". Consider updating the Room Service client.");
console.warn('Unhandled Room Service doc:fwd command: ' + cmd + '. Consider updating the Room Service client.');
}

@@ -1148,3 +1146,9 @@ });

if (!this.mapClients[objID]) {
var m = new InnerMapClient(this.checkpoint.maps[objID] || {}, this.roomID, this.docID, objID, this.ws);
var m = new InnerMapClient({
checkpoint: this.checkpoint.maps[objID] || {},
roomID: this.roomID,
docID: this.docID,
mapID: objID,
ws: this.ws
});
this.mapClients[objID] = m;

@@ -1164,3 +1168,10 @@ }

if (!this.listClients[objID]) {
var l = new InnerListClient(this.checkpoint, this.roomID, this.docID, objID, this.ws, this.actor);
var l = new InnerListClient({
checkpoint: this.checkpoint,
roomID: this.roomID,
docID: this.docID,
listID: objID,
ws: this.ws,
actor: this.actor
});
this.listClients[objID] = l;

@@ -1296,3 +1307,10 @@ }

var l = new InnerListClient(this.checkpoint, this.roomID, this.docID, name, this.ws, this.actor);
var l = new InnerListClient({
checkpoint: this.checkpoint,
roomID: this.roomID,
docID: this.docID,
listID: name,
ws: this.ws,
actor: this.actor
});
this.listClients[name] = l;

@@ -1315,3 +1333,9 @@ return l;

var m = new InnerMapClient(this.checkpoint.maps[name] || {}, this.roomID, this.docID, name, this.ws);
var m = new InnerMapClient({
checkpoint: this.checkpoint.maps[name] || {},
roomID: this.roomID,
docID: this.docID,
mapID: name,
ws: this.ws
});
this.mapClients[name] = m;

@@ -1326,3 +1350,8 @@ return m;

var p = new InnerPresenceClient(this.roomID, this.ws, this.actor, this.token);
var p = new InnerPresenceClient({
roomID: this.roomID,
ws: this.ws,
actor: this.actor,
token: this.token
});

@@ -1329,0 +1358,0 @@ try {

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

"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=(e=require("tiny-invariant"))&&"object"==typeof e&&"default"in e?e.default:e;function r(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function n(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function s(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return i(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(e,void 0):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[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=e[Symbol.iterator]()).next.bind(r)}var o=function(){function e(e){var t=this;this.callbacks={},this.lastTime=0,this.msgsThisMilisecond=0,this.conn=e,this.conn.onmessage=function(e){var r=JSON.parse(e.data);t.dispatch(r.type,r.body)}}var t=e.prototype;return t.timestamp=function(){var e=Date.now();return e===this.lastTime?this.msgsThisMilisecond++:(this.lastTime=e,this.msgsThisMilisecond=0),e+":"+this.msgsThisMilisecond},t.send=function(e,t){var r=this,n=this.timestamp();this.conn.readyState!==this.conn.CONNECTING?this.conn.send(JSON.stringify({type:e,ts:n,ver:0,body:t})):setTimeout((function(){r.send(e,t)}),100+100*Math.random())},t.bind=function(e,t){return this.callbacks[e]=this.callbacks[e]||[],this.callbacks[e].push(t),t},t.unbind=function(e,t){this.callbacks[e]=this.callbacks[e].filter((function(e){return e!==t}))},t.dispatch=function(e,t){var r=this.callbacks[e];if(r)for(var n=0;n<r.length;n++)r[n](t)},e}();function c(e,t){if("root"===t)return"root";var r=t.split(":");return r[0]+":"+e.actors[parseInt(r[1])]}var a=function(){function e(e){this.count=0,this.actor=e,this.nodes={},this.log=[]}var r=e.prototype;return r.import=function(e,r){e||t(!1);for(var n=e.lists[r],i=n.afters||[],s=n.ids||[],o=n.values||[],a=0;a<i.length;a++){var h={after:c(e,i[a]),id:c(e,s[a]),value:o[a]};this.nodes[h.id]=h,this.log.push(h)}this.count=this.log.length},r.get=function(e){if(this.nodes[e])return this.nodes[e].value},r.insert=function(e,r,n){this.log||t(!1);var i=n;i||(i=this.count+":"+this.actor),this.count++;var s={after:e,value:r,id:i};return this.nodes[i]=s,this.log.push(s),i},r.put=function(e,t){this.nodes[e]&&(this.nodes[e].value=t)},r.has=function(e){return!!this.nodes[e]},r.delete=function(e){this.nodes[e]&&(this.nodes[e].value={t:""})},r.toTree=function(){for(var e,t={children:[],id:"root",value:""},r={root:t},n=s(this.log);!(e=n()).done;){var i=e.value,o={children:[],id:i.id,value:i.value};if(r[i.id]=o,"root"===i.after)t.children.push(o);else{if(!r[i.after])continue;r[i.after].children.push(o)}}return t},r.sortLog=function(){this.log.sort((function(e,t){var r=e.id.split(":"),n=r[0],i=r[1],s=t.id.split(":"),o=s[0];return n===o?i.localeCompare(s[1]):parseInt(n)-parseInt(o)}))},r.lastID=function(){return 0===this.log.length?"root":(this.sortLog(),function e(t){return t.children&&0!==t.children.length?e(t.children[t.children.length-1]):t}(this.toTree()).id)},r.postOrderTraverse=function(){return this.sortLog(),function e(t){if(!t.children||0===t.children.length)return[];for(var r,n=[],i=s(t.children);!(r=i()).done;){var o=r.value;if("string"!=typeof o.value){if(""===o.value.t){n=n.concat([].concat(e(o)));continue}throw new Error("Unimplemented")}n=n.concat([o].concat(e(o)))}return n}(this.toTree())},r.toArray=function(){return this.postOrderTraverse().map((function(e){return e.value}))},n(e,[{key:"length",get:function(){return Object.keys(this.nodes).length}}]),e}();function h(e){return JSON.stringify(e)}function u(e){try{return JSON.parse(e)}catch(t){return e}}var l=function(){function e(e,r,n,i,s,o){this.itemIDs=[],this.roomID=r,this.docID=n,this.id=i,this.ws=s,this.rt=new a(o),e.lists[i]||t(!1),this.rt.import(e,i);for(var h=e.lists[i].ids||[],u=0;u<h.length;u++){var l=e.lists[i].values[u];"object"==typeof l&&""===l.t||this.itemIDs.push(c(e,h[u]))}}var r=e.prototype;return r.sendCmd=function(e){this.ws.send("doc:cmd",{room:this.roomID,args:e})},r.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},r.dangerouslyUpdateClientDirectly=function(e){if(e.length<3)throw new Error("Unexpected command: "+e);var t=e[0];if(e[1]!==this.docID||e[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(t){case"lins":var r=e[3],n=e[4],i=e[5];this.itemIDs.splice(this.itemIDs.findIndex((function(e){return e===r}))+1,0,n),this.rt.insert(r,i,n);break;case"lput":this.rt.put(e[3],e[4]);break;case"ldel":var s=e[3];this.rt.delete(s),this.itemIDs.splice(this.itemIDs.findIndex((function(e){return e===s})),1);break;default:throw new Error("Unexpected command keyword: "+t)}return this.clone()},r.get=function(e){var t=this.itemIDs[e];if(t){var r=this.rt.get(t);if(r){if("object"==typeof r){if(""===r.t)return;throw new Error("Unimplemented references")}return u(r)}}},r.set=function(e,t){var r=this.itemIDs[e];if(!r)throw new Error("Index '"+e+"' doesn't already exist. Try .push() or .insertAfter() instead.");var n=h(t);return this.rt.put(r,n),this.sendCmd(["lput",this.docID,this.id,r,n]),this.clone()},r.delete=function(e){if(0===this.itemIDs.length)return this.clone();var t=this.itemIDs[e];return t?(this.rt.delete(t),this.itemIDs.splice(e,1),this.sendCmd(["ldel",this.docID,this.id,t]),this.clone()):(console.warn("Unknown index: ",e,this.itemIDs),this.clone())},r.insertAfter=function(e,t){var r=this.itemIDs[e];if(!r)throw new RangeError("List '"+this.id+"' has no index: '"+e+"'");var n=h(t),i=this.rt.insert(r,n);return this.itemIDs.splice(e,0,i),this.sendCmd(["lins",this.docID,this.id,r,i,n]),this.clone()},r.pushOne=function(e){var t=this.rt.lastID(),r=h(e),n=this.rt.insert(t,r);return this.itemIDs.push(n),this.sendCmd(["lins",this.docID,this.id,t,n,r]),this.clone()},r.push=function(){for(var e,t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];for(var i=0,s=r;i<s.length;i++){var o=s[i];e=this.pushOne(o)}return e},r.map=function(e){return this.rt.postOrderTraverse().map((function(t,r){return e(u(t.value),r,t.id)}))},r.toArray=function(){return this.rt.toArray().map((function(e){return u(e)}))},e}(),d=function(){function e(e,t,r,n,i){for(var s in this.roomID=t,this.docID=r,this.id=n,this.ws=i,this.store={},e){var o=e[s];"string"==typeof o&&(this.store[s]=u(o))}}var t=e.prototype;return t.sendCmd=function(e){this.ws.send("doc:cmd",{room:this.roomID,args:e})},t.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},t.dangerouslyUpdateClientDirectly=function(e){if(e.length<3)throw new Error("Unexpected command: "+e);var t=e[0];if(e[1]!==this.docID||e[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(t){case"mput":if(5!==e.length){console.error("Malformed command ",e);break}this.store[e[3]]=u(e[4]);break;case"mdel":if(4!==e.length){console.error("Malformed command ",e);break}delete this.store[e[3]];break;default:throw new Error("Unexpected command keyword: "+t)}return this.clone()},t.get=function(e){return this.store[e]},t.set=function(e,t){var r=h(t);return this.store[e]=t,this.sendCmd(["mput",this.docID,this.id,e,r]),this.clone()},t.toObject=function(){for(var e,t={},r=s(this.keys);!(e=r()).done;){var n=e.value;t[n]=this.get(n)}return t},t.delete=function(e){return delete this.store[e],this.sendCmd(["mdel",this.docID,this.id,e]),this.clone()},n(e,[{key:"keys",get:function(){return Object.keys(this.store)}}]),e}(),f=function(){function e(e,t,r,n){var i=this;this.roomID=e,this.ws=t,this.actor=r,this.token=n,this.cache={},this.sendPres=function(e,t,r){void 0===r&&(r=!1);var n={},i=!0;return function(){var t=arguments,s=this,o=r&&i,c=function(){e.apply(s,t),n[t[0]]=null};o&&(i=!1,c()),n[arguments[0]]||(n[arguments[0]]=setTimeout(c,40))}}((function(e,t){i.ws.send("presence:cmd",t)}))}var t=e.prototype;return t.getAll=function(e){try{var t=this;return Promise.resolve(function(e,t,r,n){try{return Promise.resolve(fetch("https://super.roomservice.dev/presence/"+r+"/"+encodeURIComponent(n),{headers:{Authorization:"Bearer: "+t}})).then((function(e){return Promise.resolve(e.json()).then((function(e){for(var t in e)if("string"==typeof e[t].value){var r=void 0;try{r=JSON.parse(e[t].value)}catch(e){}r&&(e[t].value=r)}return e}))}))}catch(e){return Promise.reject(e)}}(0,t.token,t.roomID,e)).then((function(r){return t.cache[e]=r,t.withoutExpiredAndSelf(e)}))}catch(e){return Promise.reject(e)}},t.withoutExpiredAndSelf=function(e){var t={};for(var r in this.cache[e]){var n=this.cache[e][r];r===this.actor&&delete this.cache[e][r],new Date>n.expAt?delete this.cache[e][r]:t[r]=n.value}return t},t.withoutActorOrExpired=function(e){var t={};for(var r in this.cache)for(var n in this.cache[r]){var i=this.cache[r][n];i&&(n===e&&this.cache[r][n]||new Date>i.expAt?delete this.cache[r][n]:t[n]=i.value)}return t},t.set=function(e,t,r){var n=r||60,i=Math.round((new Date).getTime()/1e3)+n;return this.sendPres(e,{room:this.roomID,key:e,value:JSON.stringify(t),expAt:i}),this.cache[e]||(this.cache[e]={}),this.cache[e][this.actor]={value:t,expAt:new Date(1e3*i)},this.withoutExpiredAndSelf(e)},t.dangerouslyUpdateClientDirectly=function(e,t){if("room:rm_guest"===e)return this.withoutActorOrExpired(t.guest);if("presence:expire"===e)return this.withoutExpiredAndSelf(t.key);if(t.room!==this.roomID)return!1;if(t.from===this.actor)return!1;var r={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]=r,this.withoutExpiredAndSelf(t.key)},n(e,[{key:"me",get:function(){return console.warn("presence.me() is deprecated and will be removed in a future version!"),this.actor}}]),e}();function m(e){for(var t=window.atob(e),r=t.length,n=new Uint8Array(r),i=0;i<r;i++)n[i]=t.charCodeAt(i);return n.buffer}var p=["mcreate","mput","mputref","mdel"],v=["lcreate","lins","linsref","lput","lputref","ldel"],y=function(){function e(e){var t=this;this.listClients={},this.mapClients={},this.expires={},this.mapCallbacksByObjID={},this.listCallbacksByObjID={},this.presenceCallbacksByKey={},this.ws=new o(e.conn),this.token=e.token,this.roomID=e.roomID,this.docID=e.checkpoint.id,this.actor=e.actor,this.checkpoint=e.checkpoint,this.InnerPresenceClient=void 0,this.ws.bind("doc:fwd",(function(e){if(e.room===t.roomID)if(!e.args||e.args.length<3)console.error("Unexpected command: ",e.args);else if(!function(e,t){if(!e)return!0;if(!t)return!1;for(var r=new Uint8Array(m(e).slice(0,9)),n=new Uint8Array(m(t).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,t.checkpoint.vs)&&e.from!==t.actor){var r=[e.args[0],e.args[1],e.args[2]],n=r[0],i=r[2];r[1]===t.docID&&(p.includes(n)?t.dispatchMapCmd(i,e):v.includes(n)?t.dispatchListCmd(i,e):console.warn("Unhandled Room Service doc:fwd command: "+n+". Consider updating the Room Service client."))}})),this.ws.bind("presence:fwd",(function(e){t.dispatchPresenceCmd(e)})),this.ws.bind("room:rm_guest",(function(e){if(e.room===t.roomID)for(var r=t.presence().dangerouslyUpdateClientDirectly("room:rm_guest",e),n=0,i=Object.entries(t.presenceCallbacksByKey);n<i.length;n++)for(var o,c=s(i[n][1]);!(o=c()).done;)(0,o.value)(r,e.guest)}))}var r=e.prototype;return r.dispatchMapCmd=function(e,t){if(!this.mapClients[e]){var r=new d(this.checkpoint.maps[e]||{},this.roomID,this.docID,e,this.ws);this.mapClients[e]=r}for(var n,i=this.mapClients[e].dangerouslyUpdateClientDirectly(t.args),o=s(this.mapCallbacksByObjID[e]||[]);!(n=o()).done;)(0,n.value)(i,t.from)},r.dispatchListCmd=function(e,t){if(!this.listClients[e]){var r=new l(this.checkpoint,this.roomID,this.docID,e,this.ws,this.actor);this.listClients[e]=r}for(var n,i=this.listClients[e].dangerouslyUpdateClientDirectly(t.args),o=s(this.listCallbacksByObjID[e]||[]);!(n=o()).done;)(0,n.value)(i,t.from)},r.dispatchPresenceCmd=function(e){var t=this;if(e.room===this.roomID&&e.from!==this.actor){var r=this.presence(),n=e.key,i=(new Date).getTime()/1e3,o=e.expAt-i;if(!(o<0)){if(o<43200){this.expires[n]&&clearTimeout(this.expires[n]);var c=setTimeout((function(){var i=r.dangerouslyUpdateClientDirectly("presence:expire",{key:e.key});if(i)for(var o,c=s(null!==(a=t.presenceCallbacksByKey[n])&&void 0!==a?a:[]);!(o=c()).done;){var a;(0,o.value)(i,e.from)}}),1e3*o);this.expires[n]=c}var a=r.dangerouslyUpdateClientDirectly("presence:fwd",e);if(a)for(var h,u=s(null!==(l=this.presenceCallbacksByKey[n])&&void 0!==l?l:[]);!(h=u()).done;){var l;(0,h.value)(a,e.from)}}}},r.once=function(e){try{var t,r=this;return Promise.race([new Promise((function(e,t){return setTimeout((function(){return t("timeout")}),2e3)})),new Promise((function(n){t=r.ws.bind(e,(function(e){n(e)}))}))]).then((function(){t&&r.ws.unbind(e,t)}))}catch(e){return Promise.reject(e)}},r.reconnect=function(){try{var e=this;e.errorListener||(e.errorListener=e.ws.bind("error",(function(e){console.error("Room Service encountered a server-side error. If you see this, please let us know; this could be a bug.",e)})));var t=e.once("guest:authenticated");return e.ws.send("guest:authenticate",e.token),Promise.resolve(t).then((function(){var t=e.once("room:joined");return e.ws.send("room:join",e.roomID),Promise.resolve(t).then((function(){}))}))}catch(e){return Promise.reject(e)}},r.list=function(e){if(this.listClients[e])return this.listClients[e];this.checkpoint.lists[e]||(this.ws.send("doc:cmd",{args:["lcreate",this.docID,e],room:this.roomID}),this.checkpoint.lists[e]={afters:[],ids:[],values:[]});var t=new l(this.checkpoint,this.roomID,this.docID,e,this.ws,this.actor);return this.listClients[e]=t,t},r.map=function(e){if(this.mapClients[e])return this.mapClients[e];this.checkpoint.maps[e]||this.ws.send("doc:cmd",{args:["mcreate",this.docID,e],room:this.roomID});var t=new d(this.checkpoint.maps[e]||{},this.roomID,this.docID,e,this.ws);return this.mapClients[e]=t,t},r.presence=function(){if(this.InnerPresenceClient)return this.InnerPresenceClient;var e=new f(this.roomID,this.ws,this.actor,this.token);try{this.InnerPresenceClient=e}catch(e){throw new Error("Don't Freeze State. See more: https://err.sh/getroomservice/browser/dont-freeze")}return this.InnerPresenceClient},r.subscribe=function(e,t,r){if("string"==typeof t)return this.subscribePresence(e,t,r);var n,i=function(e,r){t(e,r)};return e instanceof d&&(this.mapCallbacksByObjID[n=e.id]=this.mapCallbacksByObjID[n]||[],this.mapCallbacksByObjID[n].push(i)),e instanceof l&&(this.listCallbacksByObjID[n=e.id]=this.listCallbacksByObjID[n]||[],this.listCallbacksByObjID[n].push(i)),[{objID:n,fn:i}]},r.subscribePresence=function(e,r,n){e||t(!1);var i=function(e,t){n&&n(e,t)};return this.presenceCallbacksByKey[r]=this.presenceCallbacksByKey[r]||[],this.presenceCallbacksByKey[r].push(i),[{objID:r,fn:i}]},r.unsubscribe=function(e){for(var t,r=s(e);!(t=r()).done;){var n=t.value;n.objID&&(this.mapCallbacksByObjID[n.objID]=b(this.mapCallbacksByObjID[n.objID],n.fn),this.listCallbacksByObjID[n.objID]=b(this.listCallbacksByObjID[n.objID],n.fn),this.presenceCallbacksByKey[n.objID]=b(this.presenceCallbacksByKey[n.objID],n.fn)),n.event&&this.ws.unbind(n.event,n.fn)}},n(e,[{key:"me",get:function(){return this.actor}}]),e}();function b(e,t){return e?e.filter((function(e){return e!==t})):[]}var w=function(){function e(e){this.roomClients={},this.auth=e.auth}return e.prototype.room=function(e){try{var t=this;if(t.roomClients[e])return Promise.resolve(t.roomClients[e]);var r=new WebSocket("wss://super.roomservice.dev/ws");return Promise.resolve(function(e,t,r,n,i){try{return Promise.resolve(function(e,t,r){try{var n=function(r){return i?r:Promise.resolve(fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resources:[{object:"document",reference:"default",permission:"read_write",room:t},{object:"room",reference:t,permission:"join"}]})})).then((function(e){if(401===e.status)throw new Error("The Auth Webhook returned unauthorized.");if(200!==e.status)throw new Error("The Auth Webhook returned a status code other than 200.");return Promise.resolve(e.json()).then((function(e){var t=e.resources,r=e.token,n=e.user;if(!t||!r||!n){if("Unauthorized"===e.body)throw new Error("The Auth Webhook unexpectedly return unauthorized. You may be using an invalid API key.");throw new Error("The Auth Webhook has an incorrectly formatted JSON response.")}return{token:r,guestReference:n,docID:t.find((function(e){return"document"===e.object})).id,roomID:t.find((function(e){return"room"===e.object})).id}}))}))},i=!1,s=function(){if("function"==typeof e)return Promise.resolve(e(t)).then((function(e){if(!e.user)throw new Error("The auth function must return a 'user' key.");var t=e.resources.find((function(e){return"document"===e.object})).id,r=e.resources.find((function(e){return"room"===e.object})).id;return i=!0,{token:e.token,guestReference:e.user,docID:t,roomID:r}}))}();return Promise.resolve(s&&s.then?s.then(n):n(s))}catch(e){return Promise.reject(e)}}(r,n)).then((function(t){return Promise.resolve(function(e,t,r){try{return Promise.resolve(fetch("https://super.roomservice.dev/docs/"+r,{headers:{Authorization:"Bearer: "+t}})).then((function(e){return Promise.resolve(e.json())}))}catch(e){return Promise.reject(e)}}(0,t.token,t.docID)).then((function(r){var n=new y({conn:e,actor:t.guestReference,checkpoint:r.body,token:t.token,roomID:t.roomID});return Promise.resolve(n.reconnect()).then((function(){return n}))}))}))}catch(e){return Promise.reject(e)}}(r,0,t.auth,e)).then((function(r){return t.roomClients[e]=r,r}))}catch(e){return Promise.reject(e)}},e}();exports.RoomClient=y,exports.RoomService=w,exports.default=w;
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=(e=require("tiny-invariant"))&&"object"==typeof e&&"default"in e?e.default:e;function r(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function n(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function o(e,t){var r;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return i(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(e,void 0):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[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=e[Symbol.iterator]()).next.bind(r)}var s=function(){function e(e){var t=this;this.callbacks={},this.lastTime=0,this.msgsThisMilisecond=0,this.conn=e,this.conn.onmessage=function(e){var r=JSON.parse(e.data);t.dispatch(r.type,r.body)}}var t=e.prototype;return t.timestamp=function(){var e=Date.now();return e===this.lastTime?this.msgsThisMilisecond++:(this.lastTime=e,this.msgsThisMilisecond=0),e+":"+this.msgsThisMilisecond},t.send=function(e,t){var r=this,n=this.timestamp();this.conn.readyState!==this.conn.CONNECTING?this.conn.send(JSON.stringify({type:e,ts:n,ver:0,body:t})):setTimeout((function(){r.send(e,t)}),100+100*Math.random())},t.bind=function(e,t){return this.callbacks[e]=this.callbacks[e]||[],this.callbacks[e].push(t),t},t.unbind=function(e,t){this.callbacks[e]=this.callbacks[e].filter((function(e){return e!==t}))},t.dispatch=function(e,t){var r=this.callbacks[e];if(r)for(var n=0;n<r.length;n++)r[n](t)},e}();function c(e,t){if("root"===t)return"root";var r=t.split(":");return r[0]+":"+e.actors[parseInt(r[1])]}var a=function(){function e(e){this.count=0,this.actor=e,this.nodes={},this.log=[]}var r=e.prototype;return r.import=function(e,r){e||t(!1);for(var n=e.lists[r],i=n.afters||[],o=n.ids||[],s=n.values||[],a=0;a<i.length;a++){var h={after:c(e,i[a]),id:c(e,o[a]),value:s[a]};this.nodes[h.id]=h,this.log.push(h)}this.count=this.log.length},r.get=function(e){if(this.nodes[e])return this.nodes[e].value},r.insert=function(e,r,n){this.log||t(!1);var i=n;i||(i=this.count+":"+this.actor),this.count++;var o={after:e,value:r,id:i};return this.nodes[i]=o,this.log.push(o),i},r.put=function(e,t){this.nodes[e]&&(this.nodes[e].value=t)},r.has=function(e){return!!this.nodes[e]},r.delete=function(e){this.nodes[e]&&(this.nodes[e].value={t:""})},r.toTree=function(){for(var e,t=new Map,r=new Map,n=o(this.log);!(e=n()).done;){var i,s=e.value;t.has(s.after)||t.set(s.after,[]),null===(i=t.get(s.after))||void 0===i||i.push(s.id),r.set(s.id,s.value)}return t.forEach((function(e){e.sort((function(e,t){var r=e.split(":"),n=r[0],i=r[1],o=t.split(":"),s=o[0];return n===s?i.localeCompare(o[1]):parseInt(s)-parseInt(n)}))})),{childrenById:t,valueById:r}},r.lastID=function(){return 0===this.log.length?"root":function e(t,r){var n=t.childrenById.get(r);return n&&0!==n.length?e(t,n[n.length-1]):r}(this.toTree(),"root")},r.preOrderTraverse=function(){var e=this.toTree(),t=new Set;return function e(r,n){if(t.has(n))return console.warn("RoomService list cycle detected. Consider updating @roomservice/browser."),[];t.add(n);var i=[],s=r.valueById.get(n);if(s)if("string"==typeof s)i.push({value:s,id:n});else if(!("t"in s)||""!==s.t)throw new Error("Unimplemented");var c=r.childrenById.get(n);if(!c||0===c.length)return i;for(var a,h=o(c);!(a=h()).done;)i=i.concat(e(r,a.value));return i}(e,"root")},r.toArray=function(){return this.preOrderTraverse().map((function(e){return e.value}))},n(e,[{key:"length",get:function(){return Object.keys(this.nodes).length}}]),e}();function h(e){return JSON.stringify(e)}function u(e){try{return JSON.parse(e)}catch(t){return e}}var l=function(){function e(e){this.itemIDs=[],this.roomID=e.roomID,this.docID=e.docID,this.id=e.listID,this.ws=e.ws,this.rt=new a(e.actor),e.checkpoint.lists[e.listID]||t(!1),this.rt.import(e.checkpoint,e.listID);for(var r=e.checkpoint.lists[e.listID].ids||[],n=0;n<r.length;n++){var i=e.checkpoint.lists[e.listID].values[n];"object"==typeof i&&""===i.t||this.itemIDs.push(c(e.checkpoint,r[n]))}}var r=e.prototype;return r.sendCmd=function(e){this.ws.send("doc:cmd",{room:this.roomID,args:e})},r.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},r.dangerouslyUpdateClientDirectly=function(e){if(e.length<3)throw new Error("Unexpected command: "+e);var t=e[0];if(e[1]!==this.docID||e[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(t){case"lins":var r=e[3],n=e[4],i=e[5];this.itemIDs.splice(this.itemIDs.findIndex((function(e){return e===r}))+1,0,n),this.rt.insert(r,i,n);break;case"lput":this.rt.put(e[3],e[4]);break;case"ldel":var o=e[3];this.rt.delete(o),this.itemIDs.splice(this.itemIDs.findIndex((function(e){return e===o})),1);break;default:throw new Error("Unexpected command keyword: "+t)}return this.clone()},r.get=function(e){var t=this.itemIDs[e];if(t){var r=this.rt.get(t);if(r){if("object"==typeof r){if(""===r.t)return;throw new Error("Unimplemented references")}return u(r)}}},r.set=function(e,t){var r=this.itemIDs[e];if(!r)throw new Error("Index '"+e+"' doesn't already exist. Try .push() or .insertAfter() instead.");var n=h(t);return this.rt.put(r,n),this.sendCmd(["lput",this.docID,this.id,r,n]),this.clone()},r.delete=function(e){if(0===this.itemIDs.length)return this.clone();var t=this.itemIDs[e];return t?(this.rt.delete(t),this.itemIDs.splice(e,1),this.sendCmd(["ldel",this.docID,this.id,t]),this.clone()):(console.warn("Unknown index: ",e,this.itemIDs),this.clone())},r.insertAfter=function(e,t){return this.insertAt(e+1,t)},r.insertAt=function(e,t){if(e<0)throw"negative indices unsupported";var r;if(!(r=0==e?"root":this.itemIDs[e-1]))throw new RangeError("List '"+this.id+"' has no index: '"+e+"'");var n=h(t),i=this.rt.insert(r,n);return this.itemIDs.splice(e,0,i),this.sendCmd(["lins",this.docID,this.id,r,i,n]),this.clone()},r.pushOne=function(e){var t=this.rt.lastID(),r=h(e),n=this.rt.insert(t,r);return this.itemIDs.push(n),this.sendCmd(["lins",this.docID,this.id,t,n,r]),this.clone()},r.push=function(){for(var e,t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];for(var i=0,o=r;i<o.length;i++){var s=o[i];e=this.pushOne(s)}return e},r.map=function(e){return this.rt.preOrderTraverse().map((function(t,r){return e(u(t.value),r,t.id)}))},r.toArray=function(){return this.rt.toArray().map((function(e){return u(e)}))},e}(),d=function(){function e(e){for(var t in this.roomID=e.roomID,this.docID=e.docID,this.id=e.mapID,this.ws=e.ws,this.store={},e.checkpoint){var r=e.checkpoint[t];"string"==typeof r&&(this.store[t]=u(r))}}var t=e.prototype;return t.sendCmd=function(e){this.ws.send("doc:cmd",{room:this.roomID,args:e})},t.clone=function(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)},t.dangerouslyUpdateClientDirectly=function(e){if(e.length<3)throw new Error("Unexpected command: "+e);var t=e[0];if(e[1]!==this.docID||e[2]!==this.id)throw new Error("Command unexpectedly routed to the wrong client");switch(t){case"mput":if(5!==e.length){console.error("Malformed command ",e);break}this.store[e[3]]=u(e[4]);break;case"mdel":if(4!==e.length){console.error("Malformed command ",e);break}delete this.store[e[3]];break;default:throw new Error("Unexpected command keyword: "+t)}return this.clone()},t.get=function(e){return this.store[e]},t.set=function(e,t){var r=h(t);return this.store[e]=t,this.sendCmd(["mput",this.docID,this.id,e,r]),this.clone()},t.toObject=function(){for(var e,t={},r=o(this.keys);!(e=r()).done;){var n=e.value;t[n]=this.get(n)}return t},t.delete=function(e){return delete this.store[e],this.sendCmd(["mdel",this.docID,this.id,e]),this.clone()},n(e,[{key:"keys",get:function(){return Object.keys(this.store)}}]),e}(),f=function(){function e(e){var t=this;this.roomID=e.roomID,this.ws=e.ws,this.actor=e.actor,this.token=e.token,this.cache={},this.sendPres=function(e,t,r){void 0===r&&(r=!1);var n={},i=!0;return function(){var t=arguments,o=this,s=r&&i,c=function(){e.apply(o,t),n[t[0]]=null};s&&(i=!1,c()),n[arguments[0]]||(n[arguments[0]]=setTimeout(c,40))}}((function(e,r){t.ws.send("presence:cmd",r)}))}var t=e.prototype;return t.getAll=function(e){try{var t=this;return Promise.resolve(function(e,t,r,n){try{return Promise.resolve(fetch("https://super.roomservice.dev/presence/"+r+"/"+encodeURIComponent(n),{headers:{Authorization:"Bearer: "+t}})).then((function(e){return Promise.resolve(e.json()).then((function(e){for(var t in e)if("string"==typeof e[t].value){var r=void 0;try{r=JSON.parse(e[t].value)}catch(e){}r&&(e[t].value=r)}return e}))}))}catch(e){return Promise.reject(e)}}(0,t.token,t.roomID,e)).then((function(r){return t.cache[e]=r,t.withoutExpiredAndSelf(e)}))}catch(e){return Promise.reject(e)}},t.withoutExpiredAndSelf=function(e){var t={};for(var r in this.cache[e]){var n=this.cache[e][r];r===this.actor&&delete this.cache[e][r],new Date>n.expAt?delete this.cache[e][r]:t[r]=n.value}return t},t.withoutActorOrExpired=function(e){var t={};for(var r in this.cache)for(var n in this.cache[r]){var i=this.cache[r][n];i&&(n===e&&this.cache[r][n]||new Date>i.expAt?delete this.cache[r][n]:t[n]=i.value)}return t},t.set=function(e,t,r){var n=r||60,i=Math.round((new Date).getTime()/1e3)+n;return this.sendPres(e,{room:this.roomID,key:e,value:JSON.stringify(t),expAt:i}),this.cache[e]||(this.cache[e]={}),this.cache[e][this.actor]={value:t,expAt:new Date(1e3*i)},this.withoutExpiredAndSelf(e)},t.dangerouslyUpdateClientDirectly=function(e,t){if("room:rm_guest"===e)return this.withoutActorOrExpired(t.guest);if("presence:expire"===e)return this.withoutExpiredAndSelf(t.key);if(t.room!==this.roomID)return!1;if(t.from===this.actor)return!1;var r={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]=r,this.withoutExpiredAndSelf(t.key)},n(e,[{key:"me",get:function(){return console.warn("presence.me() is deprecated and will be removed in a future version!"),this.actor}}]),e}();function m(e){for(var t=window.atob(e),r=t.length,n=new Uint8Array(r),i=0;i<r;i++)n[i]=t.charCodeAt(i);return n.buffer}var p=["mcreate","mput","mputref","mdel"],v=["lcreate","lins","linsref","lput","lputref","ldel"],y=function(){function e(e){var t=this;this.listClients={},this.mapClients={},this.expires={},this.mapCallbacksByObjID={},this.listCallbacksByObjID={},this.presenceCallbacksByKey={},this.ws=new s(e.conn),this.token=e.token,this.roomID=e.roomID,this.docID=e.checkpoint.id,this.actor=e.actor,this.checkpoint=e.checkpoint,this.InnerPresenceClient=void 0,this.ws.bind("doc:fwd",(function(e){if(e.room===t.roomID)if(!e.args||e.args.length<3)console.error("Unexpected command: ",e.args);else if(!function(e,t){if(!e)return!0;if(!t)return!1;for(var r=new Uint8Array(m(e).slice(0,9)),n=new Uint8Array(m(t).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,t.checkpoint.vs)&&e.from!==t.actor){var r=[e.args[0],e.args[1],e.args[2]],n=r[0],i=r[2];r[1]===t.docID&&(p.includes(n)?t.dispatchMapCmd(i,e):v.includes(n)?t.dispatchListCmd(i,e):console.warn("Unhandled Room Service doc:fwd command: "+n+". Consider updating the Room Service client."))}})),this.ws.bind("presence:fwd",(function(e){t.dispatchPresenceCmd(e)})),this.ws.bind("room:rm_guest",(function(e){if(e.room===t.roomID)for(var r=t.presence().dangerouslyUpdateClientDirectly("room:rm_guest",e),n=0,i=Object.entries(t.presenceCallbacksByKey);n<i.length;n++)for(var s,c=o(i[n][1]);!(s=c()).done;)(0,s.value)(r,e.guest)}))}var r=e.prototype;return r.dispatchMapCmd=function(e,t){if(!this.mapClients[e]){var r=new d({checkpoint:this.checkpoint.maps[e]||{},roomID:this.roomID,docID:this.docID,mapID:e,ws:this.ws});this.mapClients[e]=r}for(var n,i=this.mapClients[e].dangerouslyUpdateClientDirectly(t.args),s=o(this.mapCallbacksByObjID[e]||[]);!(n=s()).done;)(0,n.value)(i,t.from)},r.dispatchListCmd=function(e,t){if(!this.listClients[e]){var r=new l({checkpoint:this.checkpoint,roomID:this.roomID,docID:this.docID,listID:e,ws:this.ws,actor:this.actor});this.listClients[e]=r}for(var n,i=this.listClients[e].dangerouslyUpdateClientDirectly(t.args),s=o(this.listCallbacksByObjID[e]||[]);!(n=s()).done;)(0,n.value)(i,t.from)},r.dispatchPresenceCmd=function(e){var t=this;if(e.room===this.roomID&&e.from!==this.actor){var r=this.presence(),n=e.key,i=(new Date).getTime()/1e3,s=e.expAt-i;if(!(s<0)){if(s<43200){this.expires[n]&&clearTimeout(this.expires[n]);var c=setTimeout((function(){var i=r.dangerouslyUpdateClientDirectly("presence:expire",{key:e.key});if(i)for(var s,c=o(null!==(a=t.presenceCallbacksByKey[n])&&void 0!==a?a:[]);!(s=c()).done;){var a;(0,s.value)(i,e.from)}}),1e3*s);this.expires[n]=c}var a=r.dangerouslyUpdateClientDirectly("presence:fwd",e);if(a)for(var h,u=o(null!==(l=this.presenceCallbacksByKey[n])&&void 0!==l?l:[]);!(h=u()).done;){var l;(0,h.value)(a,e.from)}}}},r.once=function(e){try{var t,r=this;return Promise.race([new Promise((function(e,t){return setTimeout((function(){return t("timeout")}),2e3)})),new Promise((function(n){t=r.ws.bind(e,(function(e){n(e)}))}))]).then((function(){t&&r.ws.unbind(e,t)}))}catch(e){return Promise.reject(e)}},r.reconnect=function(){try{var e=this;e.errorListener||(e.errorListener=e.ws.bind("error",(function(e){console.error("Room Service encountered a server-side error. If you see this, please let us know; this could be a bug.",e)})));var t=e.once("guest:authenticated");return e.ws.send("guest:authenticate",e.token),Promise.resolve(t).then((function(){var t=e.once("room:joined");return e.ws.send("room:join",e.roomID),Promise.resolve(t).then((function(){}))}))}catch(e){return Promise.reject(e)}},r.list=function(e){if(this.listClients[e])return this.listClients[e];this.checkpoint.lists[e]||(this.ws.send("doc:cmd",{args:["lcreate",this.docID,e],room:this.roomID}),this.checkpoint.lists[e]={afters:[],ids:[],values:[]});var t=new l({checkpoint:this.checkpoint,roomID:this.roomID,docID:this.docID,listID:e,ws:this.ws,actor:this.actor});return this.listClients[e]=t,t},r.map=function(e){if(this.mapClients[e])return this.mapClients[e];this.checkpoint.maps[e]||this.ws.send("doc:cmd",{args:["mcreate",this.docID,e],room:this.roomID});var t=new d({checkpoint:this.checkpoint.maps[e]||{},roomID:this.roomID,docID:this.docID,mapID:e,ws:this.ws});return this.mapClients[e]=t,t},r.presence=function(){if(this.InnerPresenceClient)return this.InnerPresenceClient;var e=new f({roomID:this.roomID,ws:this.ws,actor:this.actor,token:this.token});try{this.InnerPresenceClient=e}catch(e){throw new Error("Don't Freeze State. See more: https://err.sh/getroomservice/browser/dont-freeze")}return this.InnerPresenceClient},r.subscribe=function(e,t,r){if("string"==typeof t)return this.subscribePresence(e,t,r);var n,i=function(e,r){t(e,r)};return e instanceof d&&(this.mapCallbacksByObjID[n=e.id]=this.mapCallbacksByObjID[n]||[],this.mapCallbacksByObjID[n].push(i)),e instanceof l&&(this.listCallbacksByObjID[n=e.id]=this.listCallbacksByObjID[n]||[],this.listCallbacksByObjID[n].push(i)),[{objID:n,fn:i}]},r.subscribePresence=function(e,r,n){e||t(!1);var i=function(e,t){n&&n(e,t)};return this.presenceCallbacksByKey[r]=this.presenceCallbacksByKey[r]||[],this.presenceCallbacksByKey[r].push(i),[{objID:r,fn:i}]},r.unsubscribe=function(e){for(var t,r=o(e);!(t=r()).done;){var n=t.value;n.objID&&(this.mapCallbacksByObjID[n.objID]=b(this.mapCallbacksByObjID[n.objID],n.fn),this.listCallbacksByObjID[n.objID]=b(this.listCallbacksByObjID[n.objID],n.fn),this.presenceCallbacksByKey[n.objID]=b(this.presenceCallbacksByKey[n.objID],n.fn)),n.event&&this.ws.unbind(n.event,n.fn)}},n(e,[{key:"me",get:function(){return this.actor}}]),e}();function b(e,t){return e?e.filter((function(e){return e!==t})):[]}var I=function(){function e(e){this.roomClients={},this.auth=e.auth}return e.prototype.room=function(e){try{var t=this;if(t.roomClients[e])return Promise.resolve(t.roomClients[e]);var r=new WebSocket("wss://super.roomservice.dev/ws");return Promise.resolve(function(e,t,r,n,i){try{return Promise.resolve(function(e,t,r){try{var n=function(r){return i?r:Promise.resolve(fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({resources:[{object:"document",reference:"default",permission:"read_write",room:t},{object:"room",reference:t,permission:"join"}]})})).then((function(e){if(401===e.status)throw new Error("The Auth Webhook returned unauthorized.");if(200!==e.status)throw new Error("The Auth Webhook returned a status code other than 200.");return Promise.resolve(e.json()).then((function(e){var t=e.resources,r=e.token,n=e.user;if(!t||!r||!n){if("Unauthorized"===e.body)throw new Error("The Auth Webhook unexpectedly return unauthorized. You may be using an invalid API key.");throw new Error("The Auth Webhook has an incorrectly formatted JSON response.")}return{token:r,guestReference:n,docID:t.find((function(e){return"document"===e.object})).id,roomID:t.find((function(e){return"room"===e.object})).id}}))}))},i=!1,o=function(){if("function"==typeof e)return Promise.resolve(e(t)).then((function(e){if(!e.user)throw new Error("The auth function must return a 'user' key.");var t=e.resources.find((function(e){return"document"===e.object})).id,r=e.resources.find((function(e){return"room"===e.object})).id;return i=!0,{token:e.token,guestReference:e.user,docID:t,roomID:r}}))}();return Promise.resolve(o&&o.then?o.then(n):n(o))}catch(e){return Promise.reject(e)}}(r,n)).then((function(t){return Promise.resolve(function(e,t,r){try{return Promise.resolve(fetch("https://super.roomservice.dev/docs/"+r,{headers:{Authorization:"Bearer: "+t}})).then((function(e){return Promise.resolve(e.json())}))}catch(e){return Promise.reject(e)}}(0,t.token,t.docID)).then((function(r){var n=new y({conn:e,actor:t.guestReference,checkpoint:r.body,token:t.token,roomID:t.roomID});return Promise.resolve(n.reconnect()).then((function(){return n}))}))}))}catch(e){return Promise.reject(e)}}(r,0,t.auth,e)).then((function(r){return t.roomClients[e]=r,r}))}catch(e){return Promise.reject(e)}},e}();exports.RoomClient=y,exports.RoomService=I,exports.default=I;
//# sourceMappingURL=browser.cjs.production.min.js.map

@@ -376,66 +376,40 @@ import invariant from 'tiny-invariant';

_proto.toTree = function toTree() {
var root = {
children: [],
id: 'root',
value: ''
};
var trees = {
root: root
};
var childrenById = new Map();
var valueById = new Map();
for (var _iterator = _createForOfIteratorHelperLoose(this.log), _step; !(_step = _iterator()).done;) {
var _childrenById$get;
var node = _step.value;
var tree = {
children: [],
id: node.id,
value: node.value
};
trees[node.id] = tree;
if (node.after === 'root') {
root.children.push(tree);
} else {
/* This can happen if three or more people are
editing this at once. For example:
+---+
+-->| A |
| +---+
|
|
|
+---+ +---+
| B |------>| C |
+---+ +---+
If B adds something after C, but A and C haven't
synced up yet, then A may not know how to apply that
change. To prevent this from diverging, we'll
ignore this branch for the time being.
*/
if (!trees[node.after]) {
continue;
}
if (!childrenById.has(node.after)) {
childrenById.set(node.after, []);
}
trees[node.after].children.push(tree);
}
(_childrenById$get = childrenById.get(node.after)) === null || _childrenById$get === void 0 ? void 0 : _childrenById$get.push(node.id);
valueById.set(node.id, node.value);
}
return root;
};
childrenById.forEach(function (children) {
// sort by logical timestamp descending so that latest inserts appear first
children.sort(function (a, b) {
var _a$split = a.split(':'),
leftCount = _a$split[0],
leftActor = _a$split[1];
_proto.sortLog = function sortLog() {
this.log.sort(function (a, b) {
var _a$id$split = a.id.split(':'),
leftCount = _a$id$split[0],
leftActor = _a$id$split[1];
var _b$split = b.split(':'),
rightCount = _b$split[0],
rightActor = _b$split[1];
var _b$id$split = b.id.split(':'),
rightCount = _b$id$split[0],
rightActor = _b$id$split[1];
if (leftCount === rightCount) {
return leftActor.localeCompare(rightActor);
}
if (leftCount === rightCount) {
return leftActor.localeCompare(rightActor);
}
return parseInt(leftCount) - parseInt(rightCount);
return parseInt(rightCount) - parseInt(leftCount);
});
});
return {
childrenById: childrenById,
valueById: valueById
};
};

@@ -448,53 +422,63 @@

this.sortLog();
var root = this.toTree(); // Search the right side of the tree
function right(t) {
if (!t.children || t.children.length === 0) {
return t;
function right(t, node) {
var children = t.childrenById.get(node);
if (!children || children.length === 0) {
return node;
}
return right(t.children[t.children.length - 1]);
return right(t, children[children.length - 1]);
}
return right(root).id;
return right(root, 'root');
};
_proto.postOrderTraverse = function postOrderTraverse() {
this.sortLog(); // -- Convert the log into a regular tree
_proto.preOrderTraverse = function preOrderTraverse() {
// -- Convert the log into a regular tree
var tree = this.toTree();
var seenNodes = new Set(); // -- Do a depth-first traversal to get the result
var root = this.toTree(); // -- Do a depth-first traversal to get the result
function postorder(t) {
if (!t.children || t.children.length === 0) {
function preOrder(t, node) {
if (seenNodes.has(node)) {
console.warn('RoomService list cycle detected. Consider updating @roomservice/browser.');
return [];
}
var children = [];
seenNodes.add(node);
var result = [];
var value = t.valueById.get(node);
for (var _iterator2 = _createForOfIteratorHelperLoose(t.children), _step2; !(_step2 = _iterator2()).done;) {
var child = _step2.value;
if (typeof child.value !== 'string') {
// Skip tombstones
if (child.value.t === '') {
children = children.concat([].concat(postorder(child)));
continue;
}
if (value) {
if (typeof value === 'string') {
result.push({
value: value,
id: node
});
} else if ('t' in value && value.t === '') ; else {
throw new Error('Unimplemented');
}
}
children = children.concat([child].concat(postorder(child)));
var children = t.childrenById.get(node);
if (!children || children.length === 0) {
return result;
}
return children;
for (var _iterator2 = _createForOfIteratorHelperLoose(children), _step2; !(_step2 = _iterator2()).done;) {
var child = _step2.value;
result = result.concat(preOrder(t, child));
}
return result;
}
return postorder(root);
return preOrder(tree, 'root');
};
_proto.toArray = function toArray() {
return this.postOrderTraverse().map(function (c) {
return c.value;
return this.preOrderTraverse().map(function (idValue) {
return idValue.value;
});

@@ -525,17 +509,17 @@ };

var InnerListClient = /*#__PURE__*/function () {
function InnerListClient(checkpoint, roomID, docID, listID, ws, actor) {
function InnerListClient(props) {
// Map indexes to item ids
this.itemIDs = [];
this.roomID = roomID;
this.docID = docID;
this.id = listID;
this.ws = ws;
this.rt = new ReverseTree(actor);
!checkpoint.lists[listID] ? process.env.NODE_ENV !== "production" ? invariant(false, "Unknown listid '" + listID + "' in checkpoint.") : invariant(false) : void 0;
this.rt["import"](checkpoint, listID);
var list = checkpoint.lists[listID];
this.roomID = props.roomID;
this.docID = props.docID;
this.id = props.listID;
this.ws = props.ws;
this.rt = new ReverseTree(props.actor);
!props.checkpoint.lists[props.listID] ? process.env.NODE_ENV !== "production" ? invariant(false, "Unknown listid '" + props.listID + "' in checkpoint.") : invariant(false) : void 0;
this.rt["import"](props.checkpoint, props.listID);
var list = props.checkpoint.lists[props.listID];
var ids = list.ids || [];
for (var i = 0; i < ids.length; i++) {
var val = checkpoint.lists[listID].values[i];
var val = props.checkpoint.lists[props.listID].values[i];

@@ -546,3 +530,3 @@ if (typeof val === 'object' && val['t'] === '') {

this.itemIDs.push(unescapeID(checkpoint, ids[i]));
this.itemIDs.push(unescapeID(props.checkpoint, ids[i]));
}

@@ -663,4 +647,18 @@ }

_proto.insertAfter = function insertAfter(index, val) {
var afterID = this.itemIDs[index];
return this.insertAt(index + 1, val);
};
_proto.insertAt = function insertAt(index, val) {
if (index < 0) {
throw 'negative indices unsupported';
}
var afterID;
if (index == 0) {
afterID = 'root';
} else {
afterID = this.itemIDs[index - 1];
}
if (!afterID) {

@@ -706,4 +704,4 @@ throw new RangeError("List '" + this.id + "' has no index: '" + index + "'");

_proto.map = function map(fn) {
return this.rt.postOrderTraverse().map(function (m, i) {
return fn(unescape(m.value), i, m.id);
return this.rt.preOrderTraverse().map(function (idValue, i) {
return fn(unescape(idValue.value), i, idValue.id);
});

@@ -722,11 +720,11 @@ };

var InnerMapClient = /*#__PURE__*/function () {
function InnerMapClient(checkpoint, roomID, docID, mapID, ws) {
this.roomID = roomID;
this.docID = docID;
this.id = mapID;
this.ws = ws;
function InnerMapClient(props) {
this.roomID = props.roomID;
this.docID = props.docID;
this.id = props.mapID;
this.ws = props.ws;
this.store = {}; // import
for (var k in checkpoint) {
var val = checkpoint[k];
for (var k in props.checkpoint) {
var val = props.checkpoint[k];

@@ -870,9 +868,9 @@ if (typeof val === 'string') {

var InnerPresenceClient = /*#__PURE__*/function () {
function InnerPresenceClient(roomID, ws, actor, token) {
function InnerPresenceClient(props) {
var _this = this;
this.roomID = roomID;
this.ws = ws;
this.actor = actor;
this.token = token;
this.roomID = props.roomID;
this.ws = props.ws;
this.actor = props.actor;
this.token = props.token;
this.cache = {};

@@ -1112,3 +1110,3 @@

} else {
console.warn("Unhandled Room Service doc:fwd command: " + cmd + ". Consider updating the Room Service client.");
console.warn('Unhandled Room Service doc:fwd command: ' + cmd + '. Consider updating the Room Service client.');
}

@@ -1142,3 +1140,9 @@ });

if (!this.mapClients[objID]) {
var m = new InnerMapClient(this.checkpoint.maps[objID] || {}, this.roomID, this.docID, objID, this.ws);
var m = new InnerMapClient({
checkpoint: this.checkpoint.maps[objID] || {},
roomID: this.roomID,
docID: this.docID,
mapID: objID,
ws: this.ws
});
this.mapClients[objID] = m;

@@ -1158,3 +1162,10 @@ }

if (!this.listClients[objID]) {
var l = new InnerListClient(this.checkpoint, this.roomID, this.docID, objID, this.ws, this.actor);
var l = new InnerListClient({
checkpoint: this.checkpoint,
roomID: this.roomID,
docID: this.docID,
listID: objID,
ws: this.ws,
actor: this.actor
});
this.listClients[objID] = l;

@@ -1290,3 +1301,10 @@ }

var l = new InnerListClient(this.checkpoint, this.roomID, this.docID, name, this.ws, this.actor);
var l = new InnerListClient({
checkpoint: this.checkpoint,
roomID: this.roomID,
docID: this.docID,
listID: name,
ws: this.ws,
actor: this.actor
});
this.listClients[name] = l;

@@ -1309,3 +1327,9 @@ return l;

var m = new InnerMapClient(this.checkpoint.maps[name] || {}, this.roomID, this.docID, name, this.ws);
var m = new InnerMapClient({
checkpoint: this.checkpoint.maps[name] || {},
roomID: this.roomID,
docID: this.docID,
mapID: name,
ws: this.ws
});
this.mapClients[name] = m;

@@ -1320,3 +1344,8 @@ return m;

var p = new InnerPresenceClient(this.roomID, this.ws, this.actor, this.token);
var p = new InnerPresenceClient({
roomID: this.roomID,
ws: this.ws,
actor: this.actor,
token: this.token
});

@@ -1323,0 +1352,0 @@ try {

@@ -10,3 +10,10 @@ import SuperlumeWebSocket from './ws';

id: string;
constructor(checkpoint: DocumentCheckpoint, roomID: string, docID: string, listID: string, ws: SuperlumeWebSocket, actor: string);
constructor(props: {
checkpoint: DocumentCheckpoint;
roomID: string;
docID: string;
listID: string;
ws: SuperlumeWebSocket;
actor: string;
});
private sendCmd;

@@ -19,2 +26,3 @@ private clone;

insertAfter(index: number, val: T): InnerListClient<T>;
insertAt(index: number, val: T): InnerListClient<T>;
private pushOne;

@@ -21,0 +29,0 @@ push(...args: T[]): InnerListClient<T>;

@@ -9,3 +9,9 @@ import { ObjectClient, MapCheckpoint } from './types';

id: string;
constructor(checkpoint: MapCheckpoint, roomID: string, docID: string, mapID: string, ws: SuperlumeWebSocket);
constructor(props: {
checkpoint: MapCheckpoint;
roomID: string;
docID: string;
mapID: string;
ws: SuperlumeWebSocket;
});
private sendCmd;

@@ -12,0 +18,0 @@ private clone;

@@ -11,3 +11,8 @@ import SuperlumeWebSocket from './ws';

private sendPres;
constructor(roomID: string, ws: SuperlumeWebSocket, actor: string, token: string);
constructor(props: {
roomID: string;
ws: SuperlumeWebSocket;
actor: string;
token: string;
});
/**

@@ -14,0 +19,0 @@ * Gets all values for an identifier, organized by user id.

@@ -7,6 +7,5 @@ import { NodeValue, DocumentCheckpoint } from './types';

}
interface Tree {
children: Tree[];
value: any;
interface IdValue {
id: string;
value: string;
}

@@ -36,7 +35,6 @@ /**

private toTree;
sortLog(): void;
lastID(): string;
postOrderTraverse(): Tree[];
preOrderTraverse(): IdValue[];
toArray(): Array<any>;
}
export {};

@@ -5,3 +5,3 @@ import { WebSocketLikeConnection, DocumentCheckpoint, AuthStrategy, Prop } from './types';

import { InnerPresenceClient } from './PresenceClient';
import { WebSocketServerMessage } from 'wsMessages';
import { WebSocketServerMessage } from './wsMessages';
declare type Listener = {

@@ -8,0 +8,0 @@ event?: Prop<WebSocketServerMessage, 'type'>;

{
"version": "2.1.5-0",
"version": "2.1.5",
"license": "MIT",

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

"lint": "tsdx lint",
"prepare": "tsdx build"
"prepare": "tsdx build",
"fmt": "prettier -w ."
},

@@ -36,2 +37,3 @@ "peerDependencies": {},

"jest": "^24.9.0",
"prettier": "^2.1.2",
"ts-jest": "^24.2.0",

@@ -38,0 +40,0 @@ "tsdx": "^0.12.3",

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
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc