@voltro/plugin-broadcast 0.33.0 → 0.35.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/CHANGELOG.md +1968 -0
- package/dist/index.js +39 -39
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -247,12 +247,12 @@ var r = "voltro", i = (e) => e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-"
|
|
|
247
247
|
}, E = (e) => {
|
|
248
248
|
for (let t of e) if (D(t)) return t;
|
|
249
249
|
return null;
|
|
250
|
-
}, D = (e) => typeof e.broadcast == "object" && e.broadcast !== null && typeof e.broadcast.provider == "object", O = {
|
|
250
|
+
}, D = (e) => typeof e.broadcast == "object" && e.broadcast !== null && typeof e.broadcast.provider == "object", O = ({ origin: e, ...t }) => t, k = {
|
|
251
251
|
info: () => {},
|
|
252
252
|
warn: () => {},
|
|
253
253
|
debug: () => {}
|
|
254
|
-
},
|
|
255
|
-
let { store: n, provider: r, replicaId: i } = t, a = t.logger ??
|
|
254
|
+
}, A = async (t) => {
|
|
255
|
+
let { store: n, provider: r, replicaId: i } = t, a = t.logger ?? k, o = t.channel ?? u, s = !1, c, l = !1, d = 0, f = /* @__PURE__ */ new Map(), p = await e.runPromise(r.subscribe(o, (e) => {
|
|
256
256
|
let r;
|
|
257
257
|
try {
|
|
258
258
|
r = JSON.parse(e);
|
|
@@ -260,46 +260,46 @@ var r = "voltro", i = (e) => e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-"
|
|
|
260
260
|
a.warn("broadcast: bad payload (not JSON)", { channel: o });
|
|
261
261
|
return;
|
|
262
262
|
}
|
|
263
|
-
if (r.origin
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}
|
|
263
|
+
if (r.origin === i || !r.event || typeof r.event != "object") return;
|
|
264
|
+
if (typeof r.n == "number" && Number.isFinite(r.n)) {
|
|
265
|
+
let e = f.get(r.origin);
|
|
266
|
+
if (e !== void 0 && r.n > e + 1) {
|
|
267
|
+
let n = r.n - e - 1;
|
|
268
|
+
a.warn("broadcast: missed changes from a peer — refreshing live queries, which is safe because a query is idempotent", {
|
|
269
|
+
origin: r.origin,
|
|
270
|
+
missed: n,
|
|
271
|
+
from: e,
|
|
272
|
+
to: r.n
|
|
273
|
+
});
|
|
274
|
+
try {
|
|
275
|
+
t.onGap?.(r.origin, n);
|
|
276
|
+
} catch (e) {
|
|
277
|
+
a.warn("broadcast: gap recovery threw", { err: e });
|
|
279
278
|
}
|
|
280
|
-
(e === void 0 || r.n > e) && d.set(r.origin, r.n);
|
|
281
|
-
}
|
|
282
|
-
s = !0;
|
|
283
|
-
try {
|
|
284
|
-
n.injectExternalChange(r.event);
|
|
285
|
-
} catch (e) {
|
|
286
|
-
a.warn("broadcast: inject failed", { err: e });
|
|
287
|
-
} finally {
|
|
288
|
-
s = !1;
|
|
289
279
|
}
|
|
280
|
+
(e === void 0 || r.n > e) && f.set(r.origin, r.n);
|
|
281
|
+
}
|
|
282
|
+
let l = O(r.event);
|
|
283
|
+
s = !0, c = l;
|
|
284
|
+
try {
|
|
285
|
+
n.injectExternalChange(l);
|
|
286
|
+
} catch (e) {
|
|
287
|
+
a.warn("broadcast: inject failed", { err: e });
|
|
288
|
+
} finally {
|
|
289
|
+
s = !1, c = void 0;
|
|
290
290
|
}
|
|
291
|
-
})),
|
|
292
|
-
if (s) return;
|
|
293
|
-
|
|
291
|
+
})), m = n.onChange((t) => {
|
|
292
|
+
if (s && (t.origin === "injected" || t === c)) return;
|
|
293
|
+
d += 1;
|
|
294
294
|
let n = {
|
|
295
295
|
origin: i,
|
|
296
296
|
event: t,
|
|
297
|
-
n:
|
|
297
|
+
n: d
|
|
298
298
|
};
|
|
299
299
|
e.runPromise(r.publish(o, JSON.stringify(n)).pipe(e.tap(() => e.sync(() => {
|
|
300
|
-
|
|
300
|
+
l = !1;
|
|
301
301
|
})), e.catchAll((t) => e.sync(() => {
|
|
302
|
-
|
|
302
|
+
l || (l = !0, a.warn("broadcast: publish failed — cross-replica fan-out degraded, local reactivity unaffected", {
|
|
303
303
|
provider: r.name,
|
|
304
304
|
transient: t.transient,
|
|
305
305
|
message: t.message
|
|
@@ -311,16 +311,16 @@ var r = "voltro", i = (e) => e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-"
|
|
|
311
311
|
channel: o,
|
|
312
312
|
replicaId: i
|
|
313
313
|
});
|
|
314
|
-
let
|
|
314
|
+
let h = !1;
|
|
315
315
|
return { close: async () => {
|
|
316
|
-
if (!
|
|
317
|
-
|
|
316
|
+
if (!h) {
|
|
317
|
+
h = !0, m();
|
|
318
318
|
try {
|
|
319
|
-
|
|
319
|
+
p();
|
|
320
320
|
} catch {}
|
|
321
321
|
await e.runPromise(r.close());
|
|
322
322
|
}
|
|
323
323
|
} };
|
|
324
324
|
};
|
|
325
325
|
//#endregion
|
|
326
|
-
export { u as BROADCAST_CHANNEL, l as BroadcastError, r as DEFAULT_BROADCAST_NAMESPACE,
|
|
326
|
+
export { u as BROADCAST_CHANNEL, l as BroadcastError, r as DEFAULT_BROADCAST_NAMESPACE, A as attachBroadcastBus, T as broadcastPlugin, s as channelFor, a as describeNamespaceResolution, c as eventChannelFor, E as getBroadcastPlugin, g as memoryProvider, b as natsProvider, _ as redisProvider, h as resetMemoryBus, o as resolveBroadcastNamespace, S as resolveBroadcastProvider };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voltro/plugin-broadcast",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.35.0",
|
|
4
4
|
"description": "Cross-replica reactivity — a pub/sub message bus (Redis / NATS / memory) that fans out app-mutation ChangeEvents to every replica behind a load balancer. ADDITIVE to inline emit: local reactivity survives a broker outage; cross-replica degrades gracefully. Closes the single-instance gap for every non-postgres dialect (postgres keeps native LISTEN/NOTIFY).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"voltro",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"node": ">=24.0.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@voltro/database": "0.
|
|
37
|
-
"@voltro/protocol": "0.
|
|
36
|
+
"@voltro/database": "0.35.0",
|
|
37
|
+
"@voltro/protocol": "0.35.0"
|
|
38
38
|
},
|
|
39
39
|
"optionalDependencies": {
|
|
40
40
|
"@nats-io/transport-node": "^3.4.0",
|