@inditextech/weave-store-websockets 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js ADDED
@@ -0,0 +1,352 @@
1
+ var G = Object.defineProperty;
2
+ var H = (e, n, t) => n in e ? G(e, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[n] = t;
3
+ var d = (e, n, t) => (H(e, typeof n != "symbol" ? n + "" : n, t), t);
4
+ import { WebSocketServer as q } from "ws";
5
+ import * as g from "yjs";
6
+ import { D as Y, s as Q, w as A, e as Z, t as T, h as N, j as V, p as E, q as ee, r as te, z as ne, B as se, x as re, l as ae, k as oe, A as ie, g as ce } from "./awareness-C8fdGy2v.js";
7
+ import { W as st, C as rt } from "./awareness-C8fdGy2v.js";
8
+ import le from "http";
9
+ var b = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
10
+ function fe(e) {
11
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
12
+ }
13
+ var pe = "Expected a function", K = NaN, de = "[object Symbol]", ue = /^\s+|\s+$/g, ye = /^[-+]0x[0-9a-f]+$/i, ge = /^0b[01]+$/i, he = /^0o[0-7]+$/i, me = parseInt, we = typeof b == "object" && b && b.Object === Object && b, Se = typeof self == "object" && self && self.Object === Object && self, Ce = we || Se || Function("return this")(), Ae = Object.prototype, Te = Ae.toString, Ee = Math.max, ve = Math.min, B = function() {
14
+ return Ce.Date.now();
15
+ };
16
+ function Le(e, n, t) {
17
+ var r, s, i, a, o, p, l = 0, h = !1, f = !1, u = !0;
18
+ if (typeof e != "function")
19
+ throw new TypeError(pe);
20
+ n = D(n) || 0, R(t) && (h = !!t.leading, f = "maxWait" in t, i = f ? Ee(D(t.maxWait) || 0, n) : i, u = "trailing" in t ? !!t.trailing : u);
21
+ function O(c) {
22
+ var y = r, S = s;
23
+ return r = s = void 0, l = c, a = e.apply(S, y), a;
24
+ }
25
+ function X(c) {
26
+ return l = c, o = setTimeout(L, n), h ? O(c) : a;
27
+ }
28
+ function J(c) {
29
+ var y = c - p, S = c - l, x = n - y;
30
+ return f ? ve(x, i - S) : x;
31
+ }
32
+ function W(c) {
33
+ var y = c - p, S = c - l;
34
+ return p === void 0 || y >= n || y < 0 || f && S >= i;
35
+ }
36
+ function L() {
37
+ var c = B();
38
+ if (W(c))
39
+ return j(c);
40
+ o = setTimeout(L, J(c));
41
+ }
42
+ function j(c) {
43
+ return o = void 0, u && r ? O(c) : (r = s = void 0, a);
44
+ }
45
+ function $() {
46
+ o !== void 0 && clearTimeout(o), l = 0, r = p = s = o = void 0;
47
+ }
48
+ function z() {
49
+ return o === void 0 ? a : j(B());
50
+ }
51
+ function U() {
52
+ var c = B(), y = W(c);
53
+ if (r = arguments, s = this, p = c, y) {
54
+ if (o === void 0)
55
+ return X(p);
56
+ if (f)
57
+ return o = setTimeout(L, n), O(p);
58
+ }
59
+ return o === void 0 && (o = setTimeout(L, n)), a;
60
+ }
61
+ return U.cancel = $, U.flush = z, U;
62
+ }
63
+ function R(e) {
64
+ var n = typeof e;
65
+ return !!e && (n == "object" || n == "function");
66
+ }
67
+ function be(e) {
68
+ return !!e && typeof e == "object";
69
+ }
70
+ function Ie(e) {
71
+ return typeof e == "symbol" || be(e) && Te.call(e) == de;
72
+ }
73
+ function D(e) {
74
+ if (typeof e == "number")
75
+ return e;
76
+ if (Ie(e))
77
+ return K;
78
+ if (R(e)) {
79
+ var n = typeof e.valueOf == "function" ? e.valueOf() : e;
80
+ e = R(n) ? n + "" : n;
81
+ }
82
+ if (typeof e != "string")
83
+ return e === 0 ? e : +e;
84
+ e = e.replace(ue, "");
85
+ var t = ge.test(e);
86
+ return t || he.test(e) ? me(e.slice(2), t ? 2 : 8) : ye.test(e) ? K : +e;
87
+ }
88
+ var _e = Le;
89
+ const Oe = /* @__PURE__ */ fe(_e), M = process.env.CALLBACK_URL ? new URL(process.env.CALLBACK_URL) : null, Ue = Y(
90
+ process.env.CALLBACK_TIMEOUT || "5000"
91
+ ), P = process.env.CALLBACK_OBJECTS ? JSON.parse(process.env.CALLBACK_OBJECTS) : {}, Be = !!M, Re = (e, n, t) => {
92
+ const s = {
93
+ room: t.name,
94
+ data: {}
95
+ };
96
+ Object.keys(P).forEach((a) => {
97
+ const o = P[a];
98
+ s.data[a] = {
99
+ type: o,
100
+ content: ke(a, o, t).toJSON()
101
+ };
102
+ }), M && Me(M, Ue, s);
103
+ }, Me = (e, n, t) => {
104
+ t = JSON.stringify(t);
105
+ const r = {
106
+ hostname: e.hostname,
107
+ port: e.port,
108
+ path: e.pathname,
109
+ timeout: n,
110
+ method: "POST",
111
+ headers: {
112
+ "Content-Type": "application/json",
113
+ "Content-Length": Buffer.byteLength(t)
114
+ }
115
+ }, s = le.request(r);
116
+ s.on("timeout", () => {
117
+ console.warn("Callback request timed out."), s.abort();
118
+ }), s.on("error", (i) => {
119
+ console.error("Callback request error.", i), s.abort();
120
+ }), s.write(t), s.end();
121
+ }, ke = (e, n, t) => {
122
+ switch (n) {
123
+ case "Array":
124
+ return t.getArray(e);
125
+ case "Map":
126
+ return t.getMap(e);
127
+ case "Text":
128
+ return t.getText(e);
129
+ case "XmlFragment":
130
+ return t.getXmlFragment(e);
131
+ case "XmlElement":
132
+ return t.getXmlElement(e);
133
+ default:
134
+ return {};
135
+ }
136
+ };
137
+ let m;
138
+ const We = parseInt(
139
+ process.env.CALLBACK_DEBOUNCE_WAIT || "2000"
140
+ ), je = parseInt(
141
+ process.env.CALLBACK_DEBOUNCE_MAXWAIT || "10000"
142
+ ), xe = 0, Ke = 1, De = process.env.GC !== "false" && process.env.GC !== "0", F = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Map(), _ = 0, k = 1, Pe = (e, n, t) => {
143
+ const r = E();
144
+ A(r, _), ce(r, e);
145
+ const s = T(r);
146
+ t.conns.forEach((i, a) => v(t, a, s));
147
+ };
148
+ let Fe = () => Promise.resolve();
149
+ class Ne extends g.Doc {
150
+ constructor(t) {
151
+ super({ gc: De });
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ d(this, "name");
154
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
155
+ d(this, "conns");
156
+ d(this, "awareness");
157
+ d(this, "whenInitialized");
158
+ this.name = t, this.conns = /* @__PURE__ */ new Map(), this.awareness = new ie(this), this.awareness.setLocalState(null);
159
+ const r = ({
160
+ added: s,
161
+ updated: i,
162
+ removed: a
163
+ }, o) => {
164
+ const p = s.concat(i, a);
165
+ if (o !== null) {
166
+ const f = (
167
+ /** @type {Set<number>} */
168
+ this.conns.get(o)
169
+ );
170
+ f !== void 0 && (s.forEach((u) => {
171
+ f.add(u);
172
+ }), a.forEach((u) => {
173
+ f.delete(u);
174
+ }));
175
+ }
176
+ const l = E();
177
+ A(l, k), N(
178
+ l,
179
+ V(this.awareness, p)
180
+ );
181
+ const h = T(l);
182
+ this.conns.forEach((f, u) => {
183
+ v(this, u, h);
184
+ });
185
+ };
186
+ this.awareness.on("update", r), this.on("update", Pe), Be && this.on(
187
+ "update",
188
+ Oe(Re, We, {
189
+ maxWait: je
190
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
191
+ })
192
+ ), this.whenInitialized = Fe();
193
+ }
194
+ }
195
+ const Ve = (e, n, t = !0) => Q(F, e, async () => {
196
+ let r;
197
+ m && m.fetchRoom && (r = await m.fetchRoom(e));
198
+ const s = new Ne(e);
199
+ return s.gc = t, F.set(e, s), r ? g.applyUpdate(s, r) : n(s), await Ge(e, s), s;
200
+ }), Xe = (e, n, t) => {
201
+ try {
202
+ const r = E(), s = ee(t);
203
+ switch (te(s)) {
204
+ case _:
205
+ A(r, _), re(s, r, n, e), ae(r) > 1 && v(n, e, T(r));
206
+ break;
207
+ case k: {
208
+ ne(
209
+ n.awareness,
210
+ se(s),
211
+ e
212
+ );
213
+ break;
214
+ }
215
+ }
216
+ } catch (r) {
217
+ console.error(r);
218
+ }
219
+ }, w = (e, n) => {
220
+ if (e.conns.has(n)) {
221
+ const t = e.conns.get(n);
222
+ e.conns.delete(n), I.has(e.name) && clearInterval(I.get(e.name)), oe(
223
+ e.awareness,
224
+ Array.from(t),
225
+ null
226
+ );
227
+ }
228
+ n.close();
229
+ }, v = (e, n, t) => {
230
+ n.readyState !== xe && n.readyState !== Ke && w(e, n);
231
+ try {
232
+ n.send(t, {}, (r) => {
233
+ r != null && w(e, n);
234
+ });
235
+ } catch {
236
+ w(e, n);
237
+ }
238
+ }, Je = 3e4, $e = (e) => {
239
+ m = e;
240
+ }, ze = (e, n) => async (t, r, { gc: s = !0 } = {}) => {
241
+ const i = e(r);
242
+ if (!i)
243
+ return;
244
+ t.binaryType = "arraybuffer";
245
+ const a = await Ve(i, n, s);
246
+ a.conns.set(t, /* @__PURE__ */ new Set()), t.on(
247
+ "message",
248
+ (l) => Xe(t, a, new Uint8Array(l))
249
+ );
250
+ let o = !0;
251
+ const p = setInterval(() => {
252
+ if (!o)
253
+ a.conns.has(t) && w(a, t), clearInterval(p);
254
+ else if (a.conns.has(t)) {
255
+ o = !1;
256
+ try {
257
+ t.ping();
258
+ } catch {
259
+ w(a, t), clearInterval(p);
260
+ }
261
+ }
262
+ }, Je);
263
+ t.on("close", () => {
264
+ w(a, t), clearInterval(p);
265
+ }), t.on("pong", () => {
266
+ o = !0;
267
+ });
268
+ {
269
+ const l = E();
270
+ A(l, _), Z(l, a), v(a, t, T(l));
271
+ const h = a.awareness.getStates();
272
+ if (h.size > 0) {
273
+ const f = E();
274
+ A(f, k), N(
275
+ f,
276
+ V(
277
+ a.awareness,
278
+ Array.from(h.keys())
279
+ )
280
+ ), v(a, t, T(f));
281
+ }
282
+ }
283
+ };
284
+ async function Ge(e, n) {
285
+ if (!I.has(e)) {
286
+ const t = async () => {
287
+ const s = g.encodeStateAsUpdate(n);
288
+ if (m && m.persistRoom)
289
+ try {
290
+ await m.persistRoom(e, s);
291
+ } catch (i) {
292
+ console.error(i);
293
+ }
294
+ };
295
+ t();
296
+ const r = setInterval(
297
+ t,
298
+ parseInt(process.env.WEAVE_WEBSOCKETS_STATE_SYNC_FREQUENCY_SEG ?? "10") * 1e3
299
+ );
300
+ I.set(e, r);
301
+ }
302
+ }
303
+ const C = function(e) {
304
+ const n = new g.Map();
305
+ n.set("key", e), n.set("type", "layer");
306
+ const t = new g.Map();
307
+ return t.set("id", e), t.set("nodeType", "layer"), t.set("children", new g.Array()), n.set("props", t), n;
308
+ };
309
+ function He(e) {
310
+ const n = new g.Array();
311
+ n.insert(0, [
312
+ C("gridLayer"),
313
+ C("mainLayer"),
314
+ C("selectionLayer"),
315
+ C("usersPointersLayer"),
316
+ C("utilityLayer")
317
+ ]);
318
+ const t = new g.Map();
319
+ t.set("id", "stage"), t.set("children", n), e.getMap("weave").set("key", "stage"), e.getMap("weave").set("type", "stage"), e.getMap("weave").set("props", t);
320
+ }
321
+ class et {
322
+ constructor({
323
+ initialState: n = He,
324
+ performUpgrade: t,
325
+ extractRoomId: r,
326
+ persistRoom: s,
327
+ fetchRoom: i
328
+ }) {
329
+ d(this, "initialState");
330
+ d(this, "performUpgrade");
331
+ d(this, "extractRoomId");
332
+ d(this, "wss");
333
+ d(this, "persistRoom");
334
+ d(this, "fetchRoom");
335
+ this.initialState = n, this.performUpgrade = t, this.extractRoomId = r, this.persistRoom = s, this.fetchRoom = i, this.wss = new q({ noServer: !0 }), $e(this), this.wss.on(
336
+ "connection",
337
+ ze(this.extractRoomId, this.initialState)
338
+ );
339
+ }
340
+ handleUpgrade(n) {
341
+ n.on("upgrade", async (t, r, s) => {
342
+ await this.performUpgrade(t) && this.wss.handleUpgrade(t, r, s, (a) => {
343
+ this.wss.emit("connection", a, t);
344
+ });
345
+ });
346
+ }
347
+ }
348
+ export {
349
+ st as WEAVE_STORE_WEBSOCKETS,
350
+ rt as WEAVE_STORE_WEBSOCKETS_CONNECTION_STATUS,
351
+ et as WeaveWebsocketsServer
352
+ };
Binary file
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@inditextech/weave-store-websockets",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "author": "Jesus Manuel Piñeiro Cid <jesusmpc@inditex.com>",
7
+ "homepage": "https://inditextech.github.io/weavejs",
8
+ "repository": "github:InditexTech/weavejs",
9
+ "maintainers": [
10
+ {
11
+ "name": "Jesus Manuel Piñeiro Cid",
12
+ "email": "jesusmpc@inditex.com"
13
+ }
14
+ ],
15
+ "exports": {
16
+ "./client": {
17
+ "import": "./dist/client.js",
18
+ "require": "./dist/client.cjs"
19
+ },
20
+ "./server": {
21
+ "import": "./dist/server.js",
22
+ "require": "./dist/server.cjs"
23
+ }
24
+ },
25
+ "types": "dist/store-websockets.d.ts",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "build:snapshot": "vite build --mode=development --sourcemap --emptyOutDir",
31
+ "build": "vite build --mode=production --minify --emptyOutDir",
32
+ "bump:snapshot": "npm version $npm_package_version.$(date \"+%s\")",
33
+ "bundle:analyze": "vite-bundle-visualizer",
34
+ "check": "echo \"Monorepo test script\" && exit 0",
35
+ "dev": "vite build --watch",
36
+ "dev:server": "tsx --env-file=.env ./dev-server/server.ts",
37
+ "dist:tag": "npm dist-tag add \"$(jq -r .name package.json)@$(jq -r .version package.json)\" \"$PR_TAG\" --registry=\"$NPM_PUBLISHING_REGISTRY\" --verbose",
38
+ "format": "npm run lint -- --quiet --fix --fix-type layout",
39
+ "link": "npm link",
40
+ "lint:fix": "npm run lint -- --fix",
41
+ "lint": "eslint ./src",
42
+ "publish:snapshot": "npm publish",
43
+ "release:perform": "npm publish --access public",
44
+ "release:prepare": "npm run verify",
45
+ "test": "vitest --passWithNoTests",
46
+ "types:check": "tsc --noEmit",
47
+ "verify": "npm run lint && npm run test && npm run build",
48
+ "version:development": "npm version $(npm version minor)-SNAPSHOT",
49
+ "version:release": "npm version $RELEASE_VERSION -m \"[npm-scripts] prepare release $RELEASE_VERSION\" --tag-version-prefix \"\""
50
+ },
51
+ "devDependencies": {
52
+ "@inditextech/weave-sdk": "0.1.0",
53
+ "@inditextech/weave-types": "0.1.0",
54
+ "@types/express": "^5.0.1",
55
+ "@types/lodash.debounce": "^4.0.9",
56
+ "@types/ws": "^8.18.1",
57
+ "@typescript-eslint/eslint-plugin": "8.26.0",
58
+ "@typescript-eslint/parser": "8.26.0",
59
+ "@vitest/coverage-v8": "1.6.0",
60
+ "@vitest/ui": "1.6.0",
61
+ "eslint": "8.57.1",
62
+ "express": "^5.1.0",
63
+ "globals": "15.14.0",
64
+ "typescript-eslint": "8.22.0",
65
+ "vite": "5.2.9",
66
+ "vite-bundle-visualizer": "1.1.0",
67
+ "vite-plugin-compression2": "1.0.0",
68
+ "vite-plugin-dts": "4.0.3",
69
+ "vitest": "1.6.0",
70
+ "vitest-sonar-reporter": "2.0.0",
71
+ "ws": "^8.18.1"
72
+ },
73
+ "peerDependencies": {
74
+ "y-websocket": ">= 2.1.0",
75
+ "yjs": ">= 13.6.23"
76
+ },
77
+ "engines": {
78
+ "node": "^18.12 || ^20.11 || ^22.11",
79
+ "npm": ">= 8.19.x"
80
+ },
81
+ "nx": {
82
+ "implicitDependencies": [
83
+ "@inditextech/weave-sdk",
84
+ "@inditextech/weave-types"
85
+ ]
86
+ }
87
+ }