@vielzeug/pulse 2.1.2 → 2.2.1

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/presence.js DELETED
@@ -1,74 +0,0 @@
1
- import { PulseDisposedError as e } from "./errors.js";
2
- import { deriveAbortController as t } from "./_utils.js";
3
- import { signal as n } from "@vielzeug/ripple";
4
- //#region src/presence.ts
5
- function r(r, i, a, o, s, c) {
6
- let l = t(o), u = l.signal.aborted;
7
- l.signal.addEventListener("abort", () => {
8
- u = !0;
9
- }, { once: !0 });
10
- let d = n(/* @__PURE__ */ new Map());
11
- s?.(() => {
12
- d.value = /* @__PURE__ */ new Map();
13
- });
14
- let f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set(), m = [
15
- a.onState((e) => {
16
- if (e.room !== r) return;
17
- let t = /* @__PURE__ */ new Map();
18
- for (let [n, r] of Object.entries(e.members)) t.set(n, r);
19
- d.value = t;
20
- }),
21
- a.onJoin((e) => {
22
- if (e.room !== r) return;
23
- let t = new Map(d.value);
24
- t.set(e.id, e.state), d.value = t;
25
- for (let t of f) t(e.id, e.state);
26
- }),
27
- a.onLeave((e) => {
28
- if (e.room !== r) return;
29
- let t = new Map(d.value);
30
- t.delete(e.id), d.value = t;
31
- for (let t of p) t(e.id);
32
- })
33
- ];
34
- return {
35
- get disposalSignal() {
36
- return l.signal;
37
- },
38
- dispose() {
39
- if (!u) {
40
- u = !0, l.abort();
41
- for (let e of m) e();
42
- m.length = 0, f.clear(), p.clear(), c?.();
43
- }
44
- },
45
- get disposed() {
46
- return u;
47
- },
48
- onJoin(t) {
49
- if (u) throw new e(`Presence "${r}"`);
50
- return f.add(t), () => f.delete(t);
51
- },
52
- onLeave(t) {
53
- if (u) throw new e(`Presence "${r}"`);
54
- return p.add(t), () => p.delete(t);
55
- },
56
- get room() {
57
- return r;
58
- },
59
- get state() {
60
- return d;
61
- },
62
- [Symbol.dispose]() {
63
- this.dispose();
64
- },
65
- update(t) {
66
- if (u) throw new e(`Presence "${r}"`);
67
- i(r, t);
68
- }
69
- };
70
- }
71
- //#endregion
72
- export { r as createPresence };
73
-
74
- //# sourceMappingURL=presence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"presence.js","names":[],"sources":["../src/presence.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/ripple';\nimport { deriveAbortController } from './_utils';\nimport { PulseDisposedError } from './errors';\nimport type { InPresenceJoinFrame, InPresenceLeaveFrame, InPresenceStateFrame } from './protocol';\nimport type { PresenceChannel, Unsubscribe } from './types';\n\ntype UpdateFn<T> = (room: string, state: T) => void;\n\nexport type PresenceEvents = {\n onJoin(handler: (frame: InPresenceJoinFrame) => void): Unsubscribe;\n onLeave(handler: (frame: InPresenceLeaveFrame) => void): Unsubscribe;\n onState(handler: (frame: InPresenceStateFrame) => void): Unsubscribe;\n};\n\n/**\n * Create a presence channel that reactively tracks room member states.\n * @internal\n */\nexport function createPresence<T>(\n room: string,\n update: UpdateFn<T>,\n events: PresenceEvents,\n disposalSignal: AbortSignal,\n registerReset?: (reset: () => void) => void,\n onDispose?: () => void,\n): PresenceChannel<T> {\n const ctrl = deriveAbortController(disposalSignal);\n\n let disposed = ctrl.signal.aborted;\n\n ctrl.signal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n },\n { once: true },\n );\n\n const members: Signal<Map<string, T>> = signal(new Map<string, T>());\n\n registerReset?.(() => {\n members.value = new Map<string, T>();\n });\n\n const joinHandlers = new Set<(memberId: string, state: T) => void>();\n const leaveHandlers = new Set<(memberId: string) => void>();\n\n const unsubs: Array<() => void> = [\n events.onState((frame) => {\n if (frame.room !== room) return;\n\n const next = new Map<string, T>();\n\n for (const [id, state] of Object.entries(frame.members)) {\n next.set(id, state as T);\n }\n\n members.value = next;\n }),\n events.onJoin((frame) => {\n if (frame.room !== room) return;\n\n const next = new Map(members.value);\n\n next.set(frame.id, frame.state as T);\n members.value = next;\n\n for (const handler of joinHandlers) {\n handler(frame.id, frame.state as T);\n }\n }),\n events.onLeave((frame) => {\n if (frame.room !== room) return;\n\n const next = new Map(members.value);\n\n next.delete(frame.id);\n members.value = next;\n\n for (const handler of leaveHandlers) {\n handler(frame.id);\n }\n }),\n ];\n\n const presence: PresenceChannel<T> = {\n get disposalSignal() {\n return ctrl.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n ctrl.abort();\n\n for (const unsub of unsubs) unsub();\n\n unsubs.length = 0;\n joinHandlers.clear();\n leaveHandlers.clear();\n onDispose?.();\n },\n\n get disposed() {\n return disposed;\n },\n\n onJoin(handler: (memberId: string, state: T) => void): Unsubscribe {\n if (disposed) {\n throw new PulseDisposedError(`Presence \"${room}\"`);\n }\n\n joinHandlers.add(handler);\n\n return () => joinHandlers.delete(handler);\n },\n\n onLeave(handler: (memberId: string) => void): Unsubscribe {\n if (disposed) {\n throw new PulseDisposedError(`Presence \"${room}\"`);\n }\n\n leaveHandlers.add(handler);\n\n return () => leaveHandlers.delete(handler);\n },\n\n get room() {\n return room;\n },\n\n get state() {\n return members;\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n\n update(state: T): void {\n if (disposed) throw new PulseDisposedError(`Presence \"${room}\"`);\n\n update(room, state);\n },\n };\n\n return presence;\n}\n"],"mappings":";;;;AAkBA,SAAgB,EACd,GACA,GACA,GACA,GACA,GACA,GACoB;CACpB,IAAM,IAAO,EAAsB,CAAc,GAE7C,IAAW,EAAK,OAAO;CAE3B,EAAK,OAAO,iBACV,eACM;EACJ,IAAW;CACb,GACA,EAAE,MAAM,GAAK,CACf;CAEA,IAAM,IAAkC,kBAAO,IAAI,IAAe,CAAC;CAEnE,UAAsB;EACpB,EAAQ,wBAAQ,IAAI,IAAe;CACrC,CAAC;CAED,IAAM,oBAAe,IAAI,IAA0C,GAC7D,oBAAgB,IAAI,IAAgC,GAEpD,IAA4B;EAChC,EAAO,SAAS,MAAU;GACxB,IAAI,EAAM,SAAS,GAAM;GAEzB,IAAM,oBAAO,IAAI,IAAe;GAEhC,KAAK,IAAM,CAAC,GAAI,MAAU,OAAO,QAAQ,EAAM,OAAO,GACpD,EAAK,IAAI,GAAI,CAAU;GAGzB,EAAQ,QAAQ;EAClB,CAAC;EACD,EAAO,QAAQ,MAAU;GACvB,IAAI,EAAM,SAAS,GAAM;GAEzB,IAAM,IAAO,IAAI,IAAI,EAAQ,KAAK;GAGlC,AADA,EAAK,IAAI,EAAM,IAAI,EAAM,KAAU,GACnC,EAAQ,QAAQ;GAEhB,KAAK,IAAM,KAAW,GACpB,EAAQ,EAAM,IAAI,EAAM,KAAU;EAEtC,CAAC;EACD,EAAO,SAAS,MAAU;GACxB,IAAI,EAAM,SAAS,GAAM;GAEzB,IAAM,IAAO,IAAI,IAAI,EAAQ,KAAK;GAGlC,AADA,EAAK,OAAO,EAAM,EAAE,GACpB,EAAQ,QAAQ;GAEhB,KAAK,IAAM,KAAW,GACpB,EAAQ,EAAM,EAAE;EAEpB,CAAC;CACH;CAgEA,OAAO;EA7DL,IAAI,iBAAiB;GACnB,OAAO,EAAK;EACd;EAEA,UAAU;GACJ,QAGJ;IADA,IAAW,IACX,EAAK,MAAM;IAEX,KAAK,IAAM,KAAS,GAAQ,EAAM;IAKlC,AAHA,EAAO,SAAS,GAChB,EAAa,MAAM,GACnB,EAAc,MAAM,GACpB,IAAY;GAPD;EAQb;EAEA,IAAI,WAAW;GACb,OAAO;EACT;EAEA,OAAO,GAA4D;GACjE,IAAI,GACF,MAAM,IAAI,EAAmB,aAAa,EAAK,EAAE;GAKnD,OAFA,EAAa,IAAI,CAAO,SAEX,EAAa,OAAO,CAAO;EAC1C;EAEA,QAAQ,GAAkD;GACxD,IAAI,GACF,MAAM,IAAI,EAAmB,aAAa,EAAK,EAAE;GAKnD,OAFA,EAAc,IAAI,CAAO,SAEZ,EAAc,OAAO,CAAO;EAC3C;EAEA,IAAI,OAAO;GACT,OAAO;EACT;EAEA,IAAI,QAAQ;GACV,OAAO;EACT;EAEA,CAAC,OAAO,WAAW;GACjB,KAAK,QAAQ;EACf;EAEA,OAAO,GAAgB;GACrB,IAAI,GAAU,MAAM,IAAI,EAAmB,aAAa,EAAK,EAAE;GAE/D,EAAO,GAAM,CAAK;EACpB;CAGK;AACT"}