@vielzeug/pulse 2.2.2 → 2.4.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/room.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { PulseAbortError as e, PulseConnectionError as t, PulseDisposedError as n, PulseError as r, PulseRoomTimeoutError as i } from "./errors.js";
2
- import { combineSignals as a, deriveAbortController as o } from "./_utils.js";
3
- import { encode as s } from "./protocol.js";
4
- import { signal as c } from "@vielzeug/ripple";
2
+ import { deriveAbortController as a } from "./_utils.js";
3
+ import { encode as o } from "./protocol.js";
4
+ import { signal as s } from "@vielzeug/ripple";
5
5
  //#region src/room.ts
6
- function l(l) {
7
- let f = c(/* @__PURE__ */ new Set()), p = /* @__PURE__ */ new Map();
8
- function m(e) {
9
- let t = p.get(e);
6
+ function c(c) {
7
+ let d = s(/* @__PURE__ */ new Set()), f = /* @__PURE__ */ new Map();
8
+ function p(e) {
9
+ let t = f.get(e);
10
10
  return t || (t = {
11
11
  confirmed: !1,
12
12
  joinSent: !1,
@@ -14,138 +14,138 @@ function l(l) {
14
14
  localPresence: void 0,
15
15
  refs: 0,
16
16
  scopes: /* @__PURE__ */ new Set()
17
- }, p.set(e, t)), t;
17
+ }, f.set(e, t)), t;
18
18
  }
19
- function h(e, t) {
20
- let n = new Set(f.value);
21
- t ? n.add(e) : n.delete(e), f.value = n;
19
+ function m(e, t) {
20
+ let n = new Set(d.value);
21
+ t ? n.add(e) : n.delete(e), d.value = n;
22
22
  }
23
- function g(e) {
24
- l.send(s({
23
+ function h(e) {
24
+ c.send(o({
25
25
  room: e,
26
26
  type: "join"
27
27
  }));
28
28
  }
29
- function _(e) {
30
- l.send(s({
29
+ function g(e) {
30
+ c.send(o({
31
31
  room: e,
32
32
  type: "leave"
33
33
  }));
34
34
  }
35
- function v(e, r) {
36
- let i = p.get(e);
35
+ function _(e, r) {
36
+ let i = f.get(e);
37
37
  if (!i) throw new n(`Room "${e}"`);
38
- if (!l.isOpen()) throw new t("Connection is not open", e);
39
- l.send(s({
38
+ if (!c.isOpen()) throw new t("Connection is not open", e);
39
+ c.send(o({
40
40
  room: e,
41
41
  state: r,
42
42
  type: "presence"
43
43
  })), i.localPresence = r;
44
44
  }
45
- function y(e, t) {
46
- let n = p.get(e);
47
- !n || !n.scopes.has(t) || (n.scopes.delete(t), n.refs--, n.refs === 0 && (n.confirmed ? (n.confirmed = !1, n.localPresence = void 0, h(e, !1), l.isOpen() && _(e), p.delete(e)) : n.joinSent ? n.leaveAfterJoin = !0 : p.delete(e)));
45
+ function v(e, t) {
46
+ let n = f.get(e);
47
+ !n || !n.scopes.has(t) || (n.scopes.delete(t), n.refs--, n.refs === 0 && (n.confirmed ? (n.confirmed = !1, n.localPresence = void 0, m(e, !1), c.isOpen() && g(e), f.delete(e)) : n.joinSent ? n.leaveAfterJoin = !0 : f.delete(e)));
48
48
  }
49
49
  return {
50
- createScope(s, f, p) {
51
- if (l.disposalSignal.aborted) return d(s, f);
52
- let h = m(s), _ = o(l.disposalSignal), b, x, S = !1, C = new Promise((e, t) => {
53
- b = () => {
54
- S || (S = !0, clearTimeout(w), E.removeEventListener("abort", M), e());
55
- }, x = (e) => {
56
- S || (S = !0, clearTimeout(w), E.removeEventListener("abort", M), t(e));
50
+ createScope(o, d, f) {
51
+ if (c.disposalSignal.aborted) return u(o, d);
52
+ let m = p(o), g = a(c.disposalSignal), y, b, x = !1, S = new Promise((e, t) => {
53
+ y = () => {
54
+ x || (x = !0, clearTimeout(C), T.removeEventListener("abort", j), e());
55
+ }, b = (e) => {
56
+ x || (x = !0, clearTimeout(C), T.removeEventListener("abort", j), t(e));
57
57
  };
58
58
  });
59
- C.catch(() => {});
60
- let w, T = [_.signal];
61
- if (p?.signal && T.push(p.signal), p?.timeout !== void 0) {
59
+ S.catch(() => {});
60
+ let C, w = [g.signal];
61
+ if (f?.signal && w.push(f.signal), f?.timeout !== void 0) {
62
62
  let e = new AbortController();
63
- w = setTimeout(() => e.abort(new i(s)), p.timeout), T.push(e.signal);
63
+ C = setTimeout(() => e.abort(new i(o)), f.timeout), w.push(e.signal);
64
64
  }
65
- let E = T.length === 1 ? T[0] : a(T[0], ...T.slice(1)), D, O, k = /* @__PURE__ */ new Set(), A = /* @__PURE__ */ new Set();
66
- f && (D = c(/* @__PURE__ */ new Map()), O = {
65
+ let T = AbortSignal.any(w), E, D, O = /* @__PURE__ */ new Set(), k = /* @__PURE__ */ new Set();
66
+ d && (E = s(/* @__PURE__ */ new Map()), D = {
67
67
  onJoin(e, t) {
68
- let n = new Map(D.value);
69
- n.set(e, t), D.value = n;
70
- for (let n of k) n(e, t);
68
+ let n = new Map(E.value);
69
+ n.set(e, t), E.value = n;
70
+ for (let n of O) n(e, t);
71
71
  },
72
72
  onLeave(e) {
73
- let t = new Map(D.value);
74
- t.delete(e), D.value = t;
75
- for (let t of A) t(e);
73
+ let t = new Map(E.value);
74
+ t.delete(e), E.value = t;
75
+ for (let t of k) t(e);
76
76
  },
77
77
  onState(e) {
78
78
  let t = /* @__PURE__ */ new Map();
79
79
  for (let [n, r] of Object.entries(e)) t.set(n, r);
80
- D.value = t;
80
+ E.value = t;
81
81
  },
82
82
  reset() {
83
- D.value = /* @__PURE__ */ new Map();
83
+ E.value = /* @__PURE__ */ new Map();
84
84
  }
85
85
  });
86
- let j = {
87
- isSettled: () => S,
88
- joined: C,
89
- name: s,
90
- presenceHandlers: O,
91
- rejectJoined: x,
92
- resolveJoined: b
93
- }, M = () => {
94
- clearTimeout(w), _.abort();
95
- let t = E.reason, n = t instanceof r ? t : new e();
96
- j.rejectJoined(n), y(s, j);
86
+ let A = {
87
+ isSettled: () => x,
88
+ joined: S,
89
+ name: o,
90
+ presenceHandlers: D,
91
+ rejectJoined: b,
92
+ resolveJoined: y
93
+ }, j = () => {
94
+ clearTimeout(C), g.abort();
95
+ let t = T.reason, n = t instanceof r ? t : new e();
96
+ A.rejectJoined(n), v(o, A);
97
97
  };
98
- if (h.refs++, h.scopes.add(j), E.aborted) return M(), u(j, _.signal, D, k, A, s, v);
99
- if (E.addEventListener("abort", M, { once: !0 }), h.confirmed) j.resolveJoined();
100
- else if (!h.joinSent && l.isOpen()) {
101
- h.joinSent = !0;
98
+ if (m.refs++, m.scopes.add(A), T.aborted) return j(), l(A, g.signal, E, O, k, o, _);
99
+ if (T.addEventListener("abort", j, { once: !0 }), m.confirmed) A.resolveJoined();
100
+ else if (!m.joinSent && c.isOpen()) {
101
+ m.joinSent = !0;
102
102
  try {
103
- g(s);
103
+ h(o);
104
104
  } catch (e) {
105
- h.joinSent = !1, j.rejectJoined(e instanceof r ? e : new t("Failed to send join", s));
105
+ m.joinSent = !1, A.rejectJoined(e instanceof r ? e : new t("Failed to send join", o));
106
106
  }
107
107
  }
108
- return u(j, _.signal, D, k, A, s, v, () => {
109
- _.signal.aborted || (clearTimeout(w), E.removeEventListener("abort", M), _.abort(), S || j.rejectJoined(new n(`Room "${s}"`)), y(s, j));
108
+ return l(A, g.signal, E, O, k, o, _, () => {
109
+ g.signal.aborted || (clearTimeout(C), T.removeEventListener("abort", j), g.abort(), x || A.rejectJoined(new n(`Room "${o}"`)), v(o, A));
110
110
  });
111
111
  },
112
112
  dispose() {
113
- f.value = /* @__PURE__ */ new Set(), p.clear();
113
+ d.value = /* @__PURE__ */ new Set(), f.clear();
114
114
  },
115
115
  handleJoined(e) {
116
- let t = p.get(e);
116
+ let t = f.get(e);
117
117
  if (t) {
118
- if (t.confirmed = !0, t.joinSent = !1, h(e, !0), t.leaveAfterJoin) {
119
- t.leaveAfterJoin = !1, t.confirmed = !1, h(e, !1), l.isOpen() && _(e), p.delete(e);
118
+ if (t.confirmed = !0, t.joinSent = !1, m(e, !0), t.leaveAfterJoin) {
119
+ t.leaveAfterJoin = !1, t.confirmed = !1, m(e, !1), c.isOpen() && g(e), f.delete(e);
120
120
  return;
121
121
  }
122
122
  for (let e of t.scopes) e.isSettled() || e.resolveJoined();
123
123
  }
124
124
  },
125
125
  handleLeft(e) {
126
- let t = p.get(e);
127
- t && (t.confirmed = !1, t.joinSent = !1, h(e, !1));
126
+ let t = f.get(e);
127
+ t && (t.confirmed = !1, t.joinSent = !1, m(e, !1));
128
128
  },
129
129
  handlePresenceJoin(e, t, n) {
130
- let r = p.get(e);
130
+ let r = f.get(e);
131
131
  if (r) for (let e of r.scopes) e.presenceHandlers?.onJoin(t, n);
132
132
  },
133
133
  handlePresenceLeave(e, t) {
134
- let n = p.get(e);
134
+ let n = f.get(e);
135
135
  if (n) for (let e of n.scopes) e.presenceHandlers?.onLeave(t);
136
136
  },
137
137
  handlePresenceState(e, t) {
138
- let n = p.get(e);
138
+ let n = f.get(e);
139
139
  if (n) for (let e of n.scopes) e.presenceHandlers?.onState(t);
140
140
  },
141
141
  rejectAll(e) {
142
- for (let t of p.values()) for (let n of t.scopes) n.isSettled() || n.rejectJoined(e);
142
+ for (let t of f.values()) for (let n of t.scopes) n.isSettled() || n.rejectJoined(e);
143
143
  },
144
144
  reset() {
145
- f.value = /* @__PURE__ */ new Set();
146
- for (let [e, t] of p) {
145
+ d.value = /* @__PURE__ */ new Set();
146
+ for (let [e, t] of f) {
147
147
  if (t.refs === 0) {
148
- p.delete(e);
148
+ f.delete(e);
149
149
  continue;
150
150
  }
151
151
  t.confirmed = !1, t.joinSent = !1;
@@ -153,15 +153,15 @@ function l(l) {
153
153
  }
154
154
  },
155
155
  restore() {
156
- for (let [e, t] of p) if (t.refs !== 0) {
156
+ for (let [e, t] of f) if (t.refs !== 0) {
157
157
  t.confirmed = !1, t.joinSent = !0;
158
158
  try {
159
- g(e);
159
+ h(e);
160
160
  } catch {
161
161
  t.joinSent = !1;
162
162
  }
163
163
  if (t.localPresence !== void 0) try {
164
- l.send(s({
164
+ c.send(o({
165
165
  room: e,
166
166
  state: t.localPresence,
167
167
  type: "presence"
@@ -169,10 +169,10 @@ function l(l) {
169
169
  } catch {}
170
170
  }
171
171
  },
172
- rooms: f
172
+ rooms: d
173
173
  };
174
174
  }
175
- function u(e, t, r, i, a, o, s, c) {
175
+ function l(e, t, r, i, a, o, s, c) {
176
176
  let l = c ?? (() => {});
177
177
  return r ? {
178
178
  get disposalSignal() {
@@ -220,7 +220,7 @@ function u(e, t, r, i, a, o, s, c) {
220
220
  [Symbol.dispose]: l
221
221
  };
222
222
  }
223
- function d(e, t) {
223
+ function u(e, t) {
224
224
  let r = new AbortController();
225
225
  r.abort(new n());
226
226
  let i = Promise.reject(new n(`Room "${e}"`));
@@ -236,7 +236,7 @@ function d(e, t) {
236
236
  onLeave() {
237
237
  throw new n(`Room "${e}"`);
238
238
  },
239
- presence: c(/* @__PURE__ */ new Map()),
239
+ presence: s(/* @__PURE__ */ new Map()),
240
240
  updatePresence() {
241
241
  throw new n(`Room "${e}"`);
242
242
  },
@@ -251,6 +251,6 @@ function d(e, t) {
251
251
  };
252
252
  }
253
253
  //#endregion
254
- export { l as createRoomRegistry };
254
+ export { c as createRoomRegistry };
255
255
 
256
256
  //# sourceMappingURL=room.js.map
package/dist/room.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"room.js","names":[],"sources":["../src/room.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/ripple';\nimport { combineSignals, deriveAbortController } from './_utils';\nimport { PulseAbortError, PulseConnectionError, PulseDisposedError, PulseError, PulseRoomTimeoutError } from './errors';\nimport { encode } from './protocol';\nimport type { PresenceRoomScope, RoomOptions, RoomScopeBase, Unsubscribe } from './types';\n\ntype PresenceHandlers = {\n onState(members: Record<string, unknown>): void;\n onJoin(id: string, state: unknown): void;\n onLeave(id: string): void;\n reset(): void;\n};\n\ntype RoomState = {\n refs: number;\n confirmed: boolean;\n joinSent: boolean;\n leaveAfterJoin: boolean;\n localPresence: unknown | undefined;\n scopes: Set<ScopeInternal>;\n};\n\ntype ScopeInternal = {\n readonly name: string;\n readonly joined: Promise<void>;\n resolveJoined(): void;\n rejectJoined(error: PulseError): void;\n isSettled(): boolean;\n presenceHandlers?: PresenceHandlers;\n};\n\ntype RegistryOptions = {\n isOpen: () => boolean;\n send: (frame: string) => void;\n disposalSignal: AbortSignal;\n};\n\nexport type RoomRegistry = {\n readonly rooms: Signal<ReadonlySet<string>>;\n createScope(name: string, hasPresence: boolean, opts: RoomOptions | undefined): RoomScopeBase | PresenceRoomScope;\n handleJoined(room: string): void;\n handleLeft(room: string): void;\n handlePresenceState(room: string, members: Record<string, unknown>): void;\n handlePresenceJoin(room: string, id: string, state: unknown): void;\n handlePresenceLeave(room: string, id: string): void;\n restore(): void;\n reset(): void;\n rejectAll(error: PulseError): void;\n dispose(): void;\n};\n\n/**\n * Manages ref-counted room memberships, pending join tracking, and presence state.\n * @internal\n */\nexport function createRoomRegistry(opts: RegistryOptions): RoomRegistry {\n const rooms = signal<ReadonlySet<string>>(new Set());\n const states = new Map<string, RoomState>();\n\n function getOrCreate(name: string): RoomState {\n let state = states.get(name);\n\n if (!state) {\n state = {\n confirmed: false,\n joinSent: false,\n leaveAfterJoin: false,\n localPresence: undefined,\n refs: 0,\n scopes: new Set(),\n };\n states.set(name, state);\n }\n\n return state;\n }\n\n function setRoom(name: string, joined: boolean): void {\n const next = new Set(rooms.value);\n if (joined) next.add(name);\n else next.delete(name);\n rooms.value = next;\n }\n\n function sendJoin(name: string): void {\n opts.send(encode({ room: name, type: 'join' }));\n }\n\n function sendLeave(name: string): void {\n opts.send(encode({ room: name, type: 'leave' }));\n }\n\n function updatePresence(name: string, state: unknown): void {\n const roomState = states.get(name);\n if (!roomState) throw new PulseDisposedError(`Room \"${name}\"`);\n if (!opts.isOpen()) throw new PulseConnectionError('Connection is not open', name);\n opts.send(encode({ room: name, state, type: 'presence' }));\n roomState.localPresence = state;\n }\n\n function releaseScope(name: string, scope: ScopeInternal): void {\n const state = states.get(name);\n if (!state || !state.scopes.has(scope)) return;\n\n state.scopes.delete(scope);\n state.refs--;\n\n if (state.refs === 0) {\n if (state.confirmed) {\n state.confirmed = false;\n state.localPresence = undefined;\n setRoom(name, false);\n if (opts.isOpen()) sendLeave(name);\n states.delete(name);\n } else if (state.joinSent) {\n state.leaveAfterJoin = true;\n // Keep state alive until handleJoined processes the compensating leave\n } else {\n states.delete(name);\n }\n }\n }\n\n return {\n createScope(name, hasPresence, joinOpts) {\n if (opts.disposalSignal.aborted) {\n return createDeadScope(name, hasPresence);\n }\n\n const state = getOrCreate(name);\n const ctrl = deriveAbortController(opts.disposalSignal);\n\n let resolveJoined!: () => void;\n let rejectJoined!: (error: PulseError) => void;\n let settled = false;\n\n const joined = new Promise<void>((resolve, reject) => {\n resolveJoined = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n resolve();\n };\n rejectJoined = (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n reject(error);\n };\n });\n // Suppress unhandled rejection when joined is never awaited\n joined.catch(() => {});\n\n // Timeout + abort handling\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const signals: AbortSignal[] = [ctrl.signal];\n\n if (joinOpts?.signal) signals.push(joinOpts.signal);\n\n if (joinOpts?.timeout !== undefined) {\n const timeoutCtrl = new AbortController();\n timeoutId = setTimeout(() => timeoutCtrl.abort(new PulseRoomTimeoutError(name)), joinOpts.timeout);\n signals.push(timeoutCtrl.signal);\n }\n\n const combined = signals.length === 1 ? signals[0]! : combineSignals(signals[0]!, ...signals.slice(1));\n\n // Presence state\n let presenceSignal: Signal<Map<string, unknown>> | undefined;\n let presenceHandlers: PresenceHandlers | undefined;\n const joinHandlers = new Set<(memberId: string, state: unknown) => void>();\n const leaveHandlers = new Set<(memberId: string) => void>();\n\n if (hasPresence) {\n presenceSignal = signal(new Map<string, unknown>());\n presenceHandlers = {\n onJoin(id, memberState) {\n const next = new Map(presenceSignal!.value);\n next.set(id, memberState);\n presenceSignal!.value = next;\n for (const handler of joinHandlers) handler(id, memberState);\n },\n onLeave(id) {\n const next = new Map(presenceSignal!.value);\n next.delete(id);\n presenceSignal!.value = next;\n for (const handler of leaveHandlers) handler(id);\n },\n onState(members) {\n const next = new Map<string, unknown>();\n for (const [id, memberState] of Object.entries(members)) next.set(id, memberState);\n presenceSignal!.value = next;\n },\n reset() {\n presenceSignal!.value = new Map();\n },\n };\n }\n\n const scope: ScopeInternal = {\n isSettled: () => settled,\n joined,\n name,\n presenceHandlers,\n rejectJoined,\n resolveJoined,\n };\n\n // Abort handler — rejects joined and auto-disposes\n const onAbort = (): void => {\n clearTimeout(timeoutId);\n ctrl.abort();\n const reason = combined.reason;\n const error = reason instanceof PulseError ? reason : new PulseAbortError();\n scope.rejectJoined(error);\n releaseScope(name, scope);\n };\n\n // Register scope BEFORE setting up abort, so releaseScope is safe\n state.refs++;\n state.scopes.add(scope);\n\n if (combined.aborted) {\n onAbort();\n return buildPublicScope(scope, ctrl.signal, presenceSignal, joinHandlers, leaveHandlers, name, updatePresence);\n }\n\n combined.addEventListener('abort', onAbort, { once: true });\n\n // Start join\n if (state.confirmed) {\n scope.resolveJoined();\n } else if (!state.joinSent && opts.isOpen()) {\n state.joinSent = true;\n try {\n sendJoin(name);\n } catch (error) {\n state.joinSent = false;\n scope.rejectJoined(\n error instanceof PulseError ? error : new PulseConnectionError('Failed to send join', name),\n );\n }\n }\n\n // Build dispose function\n const disposeScope = (): void => {\n if (ctrl.signal.aborted) return;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n ctrl.abort();\n if (!settled) scope.rejectJoined(new PulseDisposedError(`Room \"${name}\"`));\n releaseScope(name, scope);\n };\n\n return buildPublicScope(\n scope,\n ctrl.signal,\n presenceSignal,\n joinHandlers,\n leaveHandlers,\n name,\n updatePresence,\n disposeScope,\n );\n },\n\n dispose() {\n rooms.value = new Set();\n states.clear();\n },\n\n handleJoined(room) {\n const state = states.get(room);\n if (!state) return;\n\n state.confirmed = true;\n state.joinSent = false;\n setRoom(room, true);\n\n if (state.leaveAfterJoin) {\n state.leaveAfterJoin = false;\n state.confirmed = false;\n setRoom(room, false);\n if (opts.isOpen()) sendLeave(room);\n states.delete(room);\n return;\n }\n\n for (const scope of state.scopes) {\n if (!scope.isSettled()) scope.resolveJoined();\n }\n },\n\n handleLeft(room) {\n const state = states.get(room);\n if (!state) return;\n\n state.confirmed = false;\n state.joinSent = false;\n setRoom(room, false);\n },\n\n handlePresenceJoin(room, id, memberState) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onJoin(id, memberState);\n },\n\n handlePresenceLeave(room, id) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onLeave(id);\n },\n\n handlePresenceState(room, members) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onState(members);\n },\n\n rejectAll(error) {\n for (const state of states.values()) {\n for (const scope of state.scopes) {\n if (!scope.isSettled()) scope.rejectJoined(error);\n }\n }\n },\n\n reset() {\n rooms.value = new Set();\n for (const [name, state] of states) {\n if (state.refs === 0) {\n states.delete(name);\n continue;\n }\n state.confirmed = false;\n state.joinSent = false;\n for (const scope of state.scopes) scope.presenceHandlers?.reset();\n }\n },\n\n restore() {\n for (const [name, state] of states) {\n if (state.refs === 0) continue;\n\n state.confirmed = false;\n state.joinSent = true;\n\n try {\n sendJoin(name);\n } catch {\n state.joinSent = false;\n }\n\n if (state.localPresence !== undefined) {\n try {\n opts.send(encode({ room: name, state: state.localPresence, type: 'presence' }));\n } catch {\n // non-fatal; next updatePresence retries\n }\n }\n }\n },\n rooms,\n };\n}\n\nfunction buildPublicScope(\n scope: ScopeInternal,\n disposalSignal: AbortSignal,\n presenceSignal: Signal<Map<string, unknown>> | undefined,\n joinHandlers: Set<(memberId: string, state: unknown) => void>,\n leaveHandlers: Set<(memberId: string) => void>,\n name: string,\n updatePresence: (name: string, state: unknown) => void,\n disposeFn?: () => void,\n): RoomScopeBase | PresenceRoomScope {\n const dispose = disposeFn ?? (() => {});\n\n if (presenceSignal) {\n const publicScope: PresenceRoomScope = {\n get disposalSignal() {\n return disposalSignal;\n },\n dispose,\n get disposed() {\n return disposalSignal.aborted;\n },\n get joined() {\n return scope.joined;\n },\n get name() {\n return scope.name;\n },\n onJoin(handler: (memberId: string, state: unknown) => void): Unsubscribe {\n if (disposalSignal.aborted) throw new PulseDisposedError(`Room \"${name}\"`);\n joinHandlers.add(handler);\n return () => joinHandlers.delete(handler);\n },\n onLeave(handler: (memberId: string) => void): Unsubscribe {\n if (disposalSignal.aborted) throw new PulseDisposedError(`Room \"${name}\"`);\n leaveHandlers.add(handler);\n return () => leaveHandlers.delete(handler);\n },\n get presence() {\n return presenceSignal;\n },\n updatePresence(state: unknown) {\n updatePresence(name, state);\n },\n [Symbol.dispose]: dispose,\n };\n return publicScope;\n }\n\n const publicScope: RoomScopeBase = {\n get disposalSignal() {\n return disposalSignal;\n },\n dispose,\n get disposed() {\n return disposalSignal.aborted;\n },\n get joined() {\n return scope.joined;\n },\n get name() {\n return scope.name;\n },\n [Symbol.dispose]: dispose,\n };\n return publicScope;\n}\n\nfunction createDeadScope(name: string, hasPresence: boolean): RoomScopeBase | PresenceRoomScope {\n const disposalCtrl = new AbortController();\n disposalCtrl.abort(new PulseDisposedError());\n\n const joined = Promise.reject(new PulseDisposedError(`Room \"${name}\"`));\n joined.catch(() => {});\n\n if (hasPresence) {\n return {\n disposalSignal: disposalCtrl.signal,\n dispose() {},\n disposed: true,\n joined,\n name,\n onJoin() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n onLeave() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n presence: signal(new Map()),\n updatePresence() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n [Symbol.dispose]() {},\n };\n }\n\n return {\n disposalSignal: disposalCtrl.signal,\n dispose() {},\n disposed: true,\n joined,\n name,\n [Symbol.dispose]() {},\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"room.js","names":[],"sources":["../src/room.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/ripple';\nimport { deriveAbortController } from './_utils';\nimport { PulseAbortError, PulseConnectionError, PulseDisposedError, PulseError, PulseRoomTimeoutError } from './errors';\nimport { encode } from './protocol';\nimport type { PresenceRoomScope, RoomOptions, RoomScopeBase, Unsubscribe } from './types';\n\ntype PresenceHandlers = {\n onState(members: Record<string, unknown>): void;\n onJoin(id: string, state: unknown): void;\n onLeave(id: string): void;\n reset(): void;\n};\n\ntype RoomState = {\n refs: number;\n confirmed: boolean;\n joinSent: boolean;\n leaveAfterJoin: boolean;\n localPresence: unknown | undefined;\n scopes: Set<ScopeInternal>;\n};\n\ntype ScopeInternal = {\n readonly name: string;\n readonly joined: Promise<void>;\n resolveJoined(): void;\n rejectJoined(error: PulseError): void;\n isSettled(): boolean;\n presenceHandlers?: PresenceHandlers;\n};\n\ntype RegistryOptions = {\n isOpen: () => boolean;\n send: (frame: string) => void;\n disposalSignal: AbortSignal;\n};\n\nexport type RoomRegistry = {\n readonly rooms: Signal<ReadonlySet<string>>;\n createScope(name: string, hasPresence: boolean, opts: RoomOptions | undefined): RoomScopeBase | PresenceRoomScope;\n handleJoined(room: string): void;\n handleLeft(room: string): void;\n handlePresenceState(room: string, members: Record<string, unknown>): void;\n handlePresenceJoin(room: string, id: string, state: unknown): void;\n handlePresenceLeave(room: string, id: string): void;\n restore(): void;\n reset(): void;\n rejectAll(error: PulseError): void;\n dispose(): void;\n};\n\n/**\n * Manages ref-counted room memberships, pending join tracking, and presence state.\n * @internal\n */\nexport function createRoomRegistry(opts: RegistryOptions): RoomRegistry {\n const rooms = signal<ReadonlySet<string>>(new Set());\n const states = new Map<string, RoomState>();\n\n function getOrCreate(name: string): RoomState {\n let state = states.get(name);\n\n if (!state) {\n state = {\n confirmed: false,\n joinSent: false,\n leaveAfterJoin: false,\n localPresence: undefined,\n refs: 0,\n scopes: new Set(),\n };\n states.set(name, state);\n }\n\n return state;\n }\n\n function setRoom(name: string, joined: boolean): void {\n const next = new Set(rooms.value);\n if (joined) next.add(name);\n else next.delete(name);\n rooms.value = next;\n }\n\n function sendJoin(name: string): void {\n opts.send(encode({ room: name, type: 'join' }));\n }\n\n function sendLeave(name: string): void {\n opts.send(encode({ room: name, type: 'leave' }));\n }\n\n function updatePresence(name: string, state: unknown): void {\n const roomState = states.get(name);\n if (!roomState) throw new PulseDisposedError(`Room \"${name}\"`);\n if (!opts.isOpen()) throw new PulseConnectionError('Connection is not open', name);\n opts.send(encode({ room: name, state, type: 'presence' }));\n roomState.localPresence = state;\n }\n\n function releaseScope(name: string, scope: ScopeInternal): void {\n const state = states.get(name);\n if (!state || !state.scopes.has(scope)) return;\n\n state.scopes.delete(scope);\n state.refs--;\n\n if (state.refs === 0) {\n if (state.confirmed) {\n state.confirmed = false;\n state.localPresence = undefined;\n setRoom(name, false);\n if (opts.isOpen()) sendLeave(name);\n states.delete(name);\n } else if (state.joinSent) {\n state.leaveAfterJoin = true;\n // Keep state alive until handleJoined processes the compensating leave\n } else {\n states.delete(name);\n }\n }\n }\n\n return {\n createScope(name, hasPresence, joinOpts) {\n if (opts.disposalSignal.aborted) {\n return createDeadScope(name, hasPresence);\n }\n\n const state = getOrCreate(name);\n const ctrl = deriveAbortController(opts.disposalSignal);\n\n let resolveJoined!: () => void;\n let rejectJoined!: (error: PulseError) => void;\n let settled = false;\n\n const joined = new Promise<void>((resolve, reject) => {\n resolveJoined = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n resolve();\n };\n rejectJoined = (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n reject(error);\n };\n });\n // Suppress unhandled rejection when joined is never awaited\n joined.catch(() => {});\n\n // Timeout + abort handling\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const signals: AbortSignal[] = [ctrl.signal];\n\n if (joinOpts?.signal) signals.push(joinOpts.signal);\n\n if (joinOpts?.timeout !== undefined) {\n const timeoutCtrl = new AbortController();\n timeoutId = setTimeout(() => timeoutCtrl.abort(new PulseRoomTimeoutError(name)), joinOpts.timeout);\n signals.push(timeoutCtrl.signal);\n }\n\n const combined = AbortSignal.any(signals);\n\n // Presence state\n let presenceSignal: Signal<Map<string, unknown>> | undefined;\n let presenceHandlers: PresenceHandlers | undefined;\n const joinHandlers = new Set<(memberId: string, state: unknown) => void>();\n const leaveHandlers = new Set<(memberId: string) => void>();\n\n if (hasPresence) {\n presenceSignal = signal(new Map<string, unknown>());\n presenceHandlers = {\n onJoin(id, memberState) {\n const next = new Map(presenceSignal!.value);\n next.set(id, memberState);\n presenceSignal!.value = next;\n for (const handler of joinHandlers) handler(id, memberState);\n },\n onLeave(id) {\n const next = new Map(presenceSignal!.value);\n next.delete(id);\n presenceSignal!.value = next;\n for (const handler of leaveHandlers) handler(id);\n },\n onState(members) {\n const next = new Map<string, unknown>();\n for (const [id, memberState] of Object.entries(members)) next.set(id, memberState);\n presenceSignal!.value = next;\n },\n reset() {\n presenceSignal!.value = new Map();\n },\n };\n }\n\n const scope: ScopeInternal = {\n isSettled: () => settled,\n joined,\n name,\n presenceHandlers,\n rejectJoined,\n resolveJoined,\n };\n\n // Abort handler — rejects joined and auto-disposes\n const onAbort = (): void => {\n clearTimeout(timeoutId);\n ctrl.abort();\n const reason = combined.reason;\n const error = reason instanceof PulseError ? reason : new PulseAbortError();\n scope.rejectJoined(error);\n releaseScope(name, scope);\n };\n\n // Register scope BEFORE setting up abort, so releaseScope is safe\n state.refs++;\n state.scopes.add(scope);\n\n if (combined.aborted) {\n onAbort();\n return buildPublicScope(scope, ctrl.signal, presenceSignal, joinHandlers, leaveHandlers, name, updatePresence);\n }\n\n combined.addEventListener('abort', onAbort, { once: true });\n\n // Start join\n if (state.confirmed) {\n scope.resolveJoined();\n } else if (!state.joinSent && opts.isOpen()) {\n state.joinSent = true;\n try {\n sendJoin(name);\n } catch (error) {\n state.joinSent = false;\n scope.rejectJoined(\n error instanceof PulseError ? error : new PulseConnectionError('Failed to send join', name),\n );\n }\n }\n\n // Build dispose function\n const disposeScope = (): void => {\n if (ctrl.signal.aborted) return;\n clearTimeout(timeoutId);\n combined.removeEventListener('abort', onAbort);\n ctrl.abort();\n if (!settled) scope.rejectJoined(new PulseDisposedError(`Room \"${name}\"`));\n releaseScope(name, scope);\n };\n\n return buildPublicScope(\n scope,\n ctrl.signal,\n presenceSignal,\n joinHandlers,\n leaveHandlers,\n name,\n updatePresence,\n disposeScope,\n );\n },\n\n dispose() {\n rooms.value = new Set();\n states.clear();\n },\n\n handleJoined(room) {\n const state = states.get(room);\n if (!state) return;\n\n state.confirmed = true;\n state.joinSent = false;\n setRoom(room, true);\n\n if (state.leaveAfterJoin) {\n state.leaveAfterJoin = false;\n state.confirmed = false;\n setRoom(room, false);\n if (opts.isOpen()) sendLeave(room);\n states.delete(room);\n return;\n }\n\n for (const scope of state.scopes) {\n if (!scope.isSettled()) scope.resolveJoined();\n }\n },\n\n handleLeft(room) {\n const state = states.get(room);\n if (!state) return;\n\n state.confirmed = false;\n state.joinSent = false;\n setRoom(room, false);\n },\n\n handlePresenceJoin(room, id, memberState) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onJoin(id, memberState);\n },\n\n handlePresenceLeave(room, id) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onLeave(id);\n },\n\n handlePresenceState(room, members) {\n const state = states.get(room);\n if (!state) return;\n for (const scope of state.scopes) scope.presenceHandlers?.onState(members);\n },\n\n rejectAll(error) {\n for (const state of states.values()) {\n for (const scope of state.scopes) {\n if (!scope.isSettled()) scope.rejectJoined(error);\n }\n }\n },\n\n reset() {\n rooms.value = new Set();\n for (const [name, state] of states) {\n if (state.refs === 0) {\n states.delete(name);\n continue;\n }\n state.confirmed = false;\n state.joinSent = false;\n for (const scope of state.scopes) scope.presenceHandlers?.reset();\n }\n },\n\n restore() {\n for (const [name, state] of states) {\n if (state.refs === 0) continue;\n\n state.confirmed = false;\n state.joinSent = true;\n\n try {\n sendJoin(name);\n } catch {\n state.joinSent = false;\n }\n\n if (state.localPresence !== undefined) {\n try {\n opts.send(encode({ room: name, state: state.localPresence, type: 'presence' }));\n } catch {\n // non-fatal; next updatePresence retries\n }\n }\n }\n },\n rooms,\n };\n}\n\nfunction buildPublicScope(\n scope: ScopeInternal,\n disposalSignal: AbortSignal,\n presenceSignal: Signal<Map<string, unknown>> | undefined,\n joinHandlers: Set<(memberId: string, state: unknown) => void>,\n leaveHandlers: Set<(memberId: string) => void>,\n name: string,\n updatePresence: (name: string, state: unknown) => void,\n disposeFn?: () => void,\n): RoomScopeBase | PresenceRoomScope {\n const dispose = disposeFn ?? (() => {});\n\n if (presenceSignal) {\n const publicScope: PresenceRoomScope = {\n get disposalSignal() {\n return disposalSignal;\n },\n dispose,\n get disposed() {\n return disposalSignal.aborted;\n },\n get joined() {\n return scope.joined;\n },\n get name() {\n return scope.name;\n },\n onJoin(handler: (memberId: string, state: unknown) => void): Unsubscribe {\n if (disposalSignal.aborted) throw new PulseDisposedError(`Room \"${name}\"`);\n joinHandlers.add(handler);\n return () => joinHandlers.delete(handler);\n },\n onLeave(handler: (memberId: string) => void): Unsubscribe {\n if (disposalSignal.aborted) throw new PulseDisposedError(`Room \"${name}\"`);\n leaveHandlers.add(handler);\n return () => leaveHandlers.delete(handler);\n },\n get presence() {\n return presenceSignal;\n },\n updatePresence(state: unknown) {\n updatePresence(name, state);\n },\n [Symbol.dispose]: dispose,\n };\n return publicScope;\n }\n\n const publicScope: RoomScopeBase = {\n get disposalSignal() {\n return disposalSignal;\n },\n dispose,\n get disposed() {\n return disposalSignal.aborted;\n },\n get joined() {\n return scope.joined;\n },\n get name() {\n return scope.name;\n },\n [Symbol.dispose]: dispose,\n };\n return publicScope;\n}\n\nfunction createDeadScope(name: string, hasPresence: boolean): RoomScopeBase | PresenceRoomScope {\n const disposalCtrl = new AbortController();\n disposalCtrl.abort(new PulseDisposedError());\n\n const joined = Promise.reject(new PulseDisposedError(`Room \"${name}\"`));\n joined.catch(() => {});\n\n if (hasPresence) {\n return {\n disposalSignal: disposalCtrl.signal,\n dispose() {},\n disposed: true,\n joined,\n name,\n onJoin() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n onLeave() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n presence: signal(new Map()),\n updatePresence() {\n throw new PulseDisposedError(`Room \"${name}\"`);\n },\n [Symbol.dispose]() {},\n };\n }\n\n return {\n disposalSignal: disposalCtrl.signal,\n dispose() {},\n disposed: true,\n joined,\n name,\n [Symbol.dispose]() {},\n };\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -87,8 +87,6 @@ export type PulseOptions = {
87
87
  * `true` uses defaults. `false` disables. Default: `false`.
88
88
  */
89
89
  heartbeat?: boolean | HeartbeatOptions;
90
- /** Receives typed transport and protocol failures. */
91
- onError?: (error: PulseError) => void;
92
90
  /** Sub-protocols to pass to the WebSocket constructor. */
93
91
  protocols?: string | string[];
94
92
  /**
@@ -99,6 +97,19 @@ export type PulseOptions = {
99
97
  /** Transform or filter application messages before serialization. */
100
98
  transform?: OutgoingTransform;
101
99
  };
100
+ /**
101
+ * Runtime events emitted by {@link Pulse.tap}.
102
+ * Subscribe via `pulse.tap(handler)` — handler errors are swallowed.
103
+ */
104
+ export type PulseEvent = {
105
+ readonly status: PulseStatus;
106
+ readonly type: 'status-change';
107
+ } | {
108
+ readonly error: PulseError;
109
+ readonly type: 'error';
110
+ } | {
111
+ readonly type: 'dispose';
112
+ };
102
113
  /**
103
114
  * An isolated message namespace multiplexed over the shared WebSocket connection.
104
115
  * Obtain one via `pulse.channel(name)`. Each call returns an independent scope;
@@ -230,6 +241,13 @@ export type Pulse<S extends PulseSchema = PulseSchema> = {
230
241
  send<K extends EventKey<ClientEvents<S>>>(event: K, payload: ClientEvents<S>[K]): void;
231
242
  /** Reactive connection status. */
232
243
  readonly status: Readable<PulseStatus>;
244
+ /**
245
+ * Observe runtime events (status-change, error, dispose) without affecting
246
+ * pulse behavior. Handler errors are swallowed. Returns an unsubscribe function.
247
+ */
248
+ tap(handler: (event: PulseEvent) => void, options?: {
249
+ readonly signal?: AbortSignal;
250
+ }): Unsubscribe;
233
251
  /**
234
252
  * Resolve on the next emission of the given server event.
235
253
  * Rejects when `opts.signal` aborts or the instance is disposed.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/pulse",
3
- "version": "2.2.2",
3
+ "version": "2.4.0",
4
4
  "description": "Typed WebSocket client with channel multiplexing, presence tracking, auto-reconnect, and heartbeat",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,6 +24,7 @@
24
24
  "types": "./dist/index.d.ts"
25
25
  }
26
26
  },
27
+ "sideEffects": false,
27
28
  "publishConfig": {
28
29
  "access": "public",
29
30
  "registry": "https://registry.npmjs.org/"
@@ -39,7 +40,7 @@
39
40
  "test": "vitest"
40
41
  },
41
42
  "dependencies": {
42
- "@vielzeug/ripple": "2.2.3"
43
+ "@vielzeug/ripple": "2.3.0"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@types/node": "^26.2.0",