@liveblocks/yjs
Advanced tools
Comparing version 1.1.1-dual5 to 1.1.1-dual6
@@ -1,2 +0,219 @@ | ||
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }var g=Object.defineProperty;var m=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var b=(n,s,e)=>s in n?g(n,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[s]=e,i=(n,s)=>{for(var e in s||(s={}))_.call(s,e)&&b(n,e,s[e]);if(m)for(var e of m(s))j.call(s,e)&&b(n,e,s[e]);return n};var _jsbase64 = require('js-base64');var p=()=>new Map;var y=(n,s,e)=>{let t=n.get(s);return t===void 0&&n.set(s,t=e()),t};var x=()=>new Set;var v=Array.from;var D=Array.isArray;var a=class{constructor(){this._observers=p()}on(s,e){y(this._observers,s,x).add(e)}once(s,e){let t=(...o)=>{this.off(s,t),e(...o)};this.on(s,t)}off(s,e){let t=this._observers.get(s);t!==void 0&&(t.delete(e),t.size===0&&this._observers.delete(s))}emit(s,e){return v((this._observers.get(s)||p()).values()).forEach(t=>t(...e))}destroy(){this._observers=p()}};var _yjs = require('yjs'); var u = _interopRequireWildcard(_yjs);var d="__yjs",h= exports.Awareness =class extends a{constructor(e,t){super();this.states=new Map;this.meta=new Map;this._checkInterval=0;this.doc=e,this.room=t,this.clientID=e.clientID,this.othersUnsub=this.room.events.others.subscribe(({event:o})=>{o.type==="leave"&&this.emit("change",[{added:[],updated:[],removed:[o.user.connectionId]},"local"]),o.type==="enter"&&this.emit("change",[{added:[o.user.connectionId],updated:[],removed:[]},"local"]),o.type==="update"&&this.emit("change",[{added:[],updated:[o.user.connectionId],removed:[]},"local"])})}destroy(){this.emit("destroy",[this]),this.othersUnsub(),this.setLocalState(null),super.destroy()}getLocalState(){let e=this.room.getPresence();return Object.keys(e).length===0||typeof e[d]=="undefined"?null:e[d]}setLocalState(e){var o;let t=(o=this.room.getSelf())==null?void 0:o.presence[d];this.room.updatePresence({__yjs:i(i({},t||{}),e||{})})}setLocalStateField(e,t){var c;let o=(c=this.room.getSelf())==null?void 0:c.presence[d],r={[e]:t};this.room.updatePresence({__yjs:i(i({},o||{}),r)})}getStates(){return this.room.getOthers().reduce((o,r)=>(r.connectionId&&o.set(r.connectionId,r.presence[d]||{}),o),new Map)}},f= exports.default =class extends a{constructor(e,t){var r;super();this.unsubscribers=[];this._synced=!1;this.syncDoc=()=>{var t;this.synced=!1,this.doc.clientID=((t=this.room.getSelf())==null?void 0:t.connectionId)||this.doc.clientID,this.awareness.clientID=this.doc.clientID;let e=_jsbase64.Base64.fromUint8Array(u.encodeStateVector(this.doc));this.room.fetchYDoc(e)};this.updateHandler=(e,t)=>{if(t!=="backend"){let o=_jsbase64.Base64.fromUint8Array(e);this.room.updateYDoc(o)}};this.doc=t,this.room=e;let o=(r=this.room.getSelf())==null?void 0:r.connectionId;o&&(this.doc.clientID=o),this.awareness=new h(this.doc,this.room),this.doc.on("update",this.updateHandler),this.unsubscribers.push(this.room.events.status.subscribe(c=>{c==="connected"&&this.syncDoc()})),this.unsubscribers.push(this.room.events.ydoc.subscribe(c=>{u.applyUpdate(this.doc,_jsbase64.Base64.toUint8Array(c),"backend"),this.synced=!0})),this.syncDoc()}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){this.doc.off("update",this.updateHandler),this.unsubscribers.forEach(e=>e()),this.awareness.destroy()}disconnect(){}connect(){}};exports.Awareness = h; exports.default = f; | ||
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/index.ts | ||
var _jsbase64 = require('js-base64'); | ||
// ../../node_modules/lib0/map.js | ||
var create = () => /* @__PURE__ */ new Map(); | ||
var setIfUndefined = (map, key, createT) => { | ||
let set = map.get(key); | ||
if (set === void 0) { | ||
map.set(key, set = createT()); | ||
} | ||
return set; | ||
}; | ||
// ../../node_modules/lib0/set.js | ||
var create2 = () => /* @__PURE__ */ new Set(); | ||
// ../../node_modules/lib0/array.js | ||
var from = Array.from; | ||
var isArray = Array.isArray; | ||
// ../../node_modules/lib0/observable.js | ||
var Observable = class { | ||
constructor() { | ||
this._observers = create(); | ||
} | ||
/** | ||
* @param {N} name | ||
* @param {function} f | ||
*/ | ||
on(name, f) { | ||
setIfUndefined(this._observers, name, create2).add(f); | ||
} | ||
/** | ||
* @param {N} name | ||
* @param {function} f | ||
*/ | ||
once(name, f) { | ||
const _f = (...args) => { | ||
this.off(name, _f); | ||
f(...args); | ||
}; | ||
this.on(name, _f); | ||
} | ||
/** | ||
* @param {N} name | ||
* @param {function} f | ||
*/ | ||
off(name, f) { | ||
const observers = this._observers.get(name); | ||
if (observers !== void 0) { | ||
observers.delete(f); | ||
if (observers.size === 0) { | ||
this._observers.delete(name); | ||
} | ||
} | ||
} | ||
/** | ||
* Emit a named event. All registered event listeners that listen to the | ||
* specified name will receive the event. | ||
* | ||
* @todo This should catch exceptions | ||
* | ||
* @param {N} name The event name. | ||
* @param {Array<any>} args The arguments that are applied to the event listener. | ||
*/ | ||
emit(name, args) { | ||
return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args)); | ||
} | ||
destroy() { | ||
this._observers = create(); | ||
} | ||
}; | ||
// src/index.ts | ||
var _yjs = require('yjs'); var Y = _interopRequireWildcard(_yjs); | ||
var Y_PRESENCE_KEY = "__yjs"; | ||
var Awareness = class extends Observable { | ||
constructor(doc, room) { | ||
super(); | ||
this.states = /* @__PURE__ */ new Map(); | ||
// Meta is used to keep track and timeout users who disconnect. Liveblocks provides this for us, so we don't need to | ||
// manage it here. Unfortunately, it's expected to exist by various integrations, so it's an empty map. | ||
this.meta = /* @__PURE__ */ new Map(); | ||
// _checkInterval this would hold a timer to remove users, but Liveblock's presence already handles this | ||
// unfortunately it's typed by various integrations | ||
this._checkInterval = 0; | ||
this.doc = doc; | ||
this.room = room; | ||
this.clientID = doc.clientID; | ||
this.othersUnsub = this.room.events.others.subscribe(({ event }) => { | ||
if (event.type === "leave") { | ||
this.emit("change", [ | ||
{ added: [], updated: [], removed: [event.user.connectionId] }, | ||
"local" | ||
]); | ||
} | ||
if (event.type === "enter") { | ||
this.emit("change", [ | ||
{ added: [event.user.connectionId], updated: [], removed: [] }, | ||
"local" | ||
]); | ||
} | ||
if (event.type === "update") { | ||
this.emit("change", [ | ||
{ added: [], updated: [event.user.connectionId], removed: [] }, | ||
"local" | ||
]); | ||
} | ||
}); | ||
} | ||
destroy() { | ||
this.emit("destroy", [this]); | ||
this.othersUnsub(); | ||
this.setLocalState(null); | ||
super.destroy(); | ||
} | ||
getLocalState() { | ||
const presence = this.room.getPresence(); | ||
if (Object.keys(presence).length === 0 || typeof presence[Y_PRESENCE_KEY] === "undefined") { | ||
return null; | ||
} | ||
return presence[Y_PRESENCE_KEY]; | ||
} | ||
setLocalState(state) { | ||
const presence = _optionalChain([this, 'access', _ => _.room, 'access', _2 => _2.getSelf, 'call', _3 => _3(), 'optionalAccess', _4 => _4.presence, 'access', _5 => _5[Y_PRESENCE_KEY]]); | ||
this.room.updatePresence({ | ||
__yjs: { ...presence || {}, ...state || {} } | ||
}); | ||
} | ||
setLocalStateField(field, value) { | ||
const presence = _optionalChain([this, 'access', _6 => _6.room, 'access', _7 => _7.getSelf, 'call', _8 => _8(), 'optionalAccess', _9 => _9.presence, 'access', _10 => _10[Y_PRESENCE_KEY]]); | ||
const update = { [field]: value }; | ||
this.room.updatePresence({ | ||
__yjs: { ...presence || {}, ...update } | ||
}); | ||
} | ||
// Translate liveblocks presence to yjs awareness | ||
getStates() { | ||
const others = this.room.getOthers(); | ||
const states = others.reduce((acc, currentValue) => { | ||
if (currentValue.connectionId) { | ||
acc.set( | ||
currentValue.connectionId, | ||
currentValue.presence[Y_PRESENCE_KEY] || {} | ||
); | ||
} | ||
return acc; | ||
}, /* @__PURE__ */ new Map()); | ||
return states; | ||
} | ||
}; | ||
var LiveblocksProvider = class extends Observable { | ||
constructor(room, doc) { | ||
super(); | ||
this.unsubscribers = []; | ||
this._synced = false; | ||
this.syncDoc = () => { | ||
this.synced = false; | ||
this.doc.clientID = _optionalChain([this, 'access', _11 => _11.room, 'access', _12 => _12.getSelf, 'call', _13 => _13(), 'optionalAccess', _14 => _14.connectionId]) || this.doc.clientID; | ||
this.awareness.clientID = this.doc.clientID; | ||
const encodedVector = _jsbase64.Base64.fromUint8Array(Y.encodeStateVector(this.doc)); | ||
this.room.fetchYDoc(encodedVector); | ||
}; | ||
this.updateHandler = (update, origin) => { | ||
if (origin !== "backend") { | ||
const encodedUpdate = _jsbase64.Base64.fromUint8Array(update); | ||
this.room.updateYDoc(encodedUpdate); | ||
} | ||
}; | ||
this.doc = doc; | ||
this.room = room; | ||
const connectionId = _optionalChain([this, 'access', _15 => _15.room, 'access', _16 => _16.getSelf, 'call', _17 => _17(), 'optionalAccess', _18 => _18.connectionId]); | ||
if (connectionId) { | ||
this.doc.clientID = connectionId; | ||
} | ||
this.awareness = new Awareness(this.doc, this.room); | ||
this.doc.on("update", this.updateHandler); | ||
this.unsubscribers.push( | ||
this.room.events.status.subscribe((status) => { | ||
if (status === "connected") { | ||
this.syncDoc(); | ||
} | ||
}) | ||
); | ||
this.unsubscribers.push( | ||
this.room.events.ydoc.subscribe((update) => { | ||
Y.applyUpdate(this.doc, _jsbase64.Base64.toUint8Array(update), "backend"); | ||
this.synced = true; | ||
}) | ||
); | ||
this.syncDoc(); | ||
} | ||
// The sync'd property is required by some provider implementations | ||
get synced() { | ||
return this._synced; | ||
} | ||
set synced(state) { | ||
if (this._synced !== state) { | ||
this._synced = state; | ||
this.emit("synced", [state]); | ||
this.emit("sync", [state]); | ||
} | ||
} | ||
destroy() { | ||
this.doc.off("update", this.updateHandler); | ||
this.unsubscribers.forEach((unsub) => unsub()); | ||
this.awareness.destroy(); | ||
} | ||
// Some provider implementations expect to be able to call connect/disconnect, implement as noop | ||
disconnect() { | ||
} | ||
connect() { | ||
} | ||
}; | ||
exports.Awareness = Awareness; exports.default = LiveblocksProvider; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@liveblocks/yjs", | ||
"version": "1.1.1-dual5", | ||
"version": "1.1.1-dual6", | ||
"description": "An integration with . Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", | ||
@@ -36,4 +36,4 @@ "license": "Apache-2.0", | ||
"dependencies": { | ||
"@liveblocks/client": "1.1.1-dual5", | ||
"@liveblocks/core": "1.1.1-dual5", | ||
"@liveblocks/client": "1.1.1-dual6", | ||
"@liveblocks/core": "1.1.1-dual6", | ||
"js-base64": "^3.7.5" | ||
@@ -40,0 +40,0 @@ }, |
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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
59336
469
1
1
+ Added@liveblocks/client@1.1.1-dual6(transitive)
+ Added@liveblocks/core@1.1.1-dual6(transitive)
- Removed@liveblocks/client@1.1.1-dual5(transitive)
- Removed@liveblocks/core@1.1.1-dual5(transitive)
Updated@liveblocks/core@1.1.1-dual6