@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.
Files changed (3) hide show
  1. package/CHANGELOG.md +1968 -0
  2. package/dist/index.js +39 -39
  3. 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
- }, k = async (t) => {
255
- let { store: n, provider: r, replicaId: i } = t, a = t.logger ?? O, o = t.channel ?? u, s = !1, c = !1, l = 0, d = /* @__PURE__ */ new Map(), f = await e.runPromise(r.subscribe(o, (e) => {
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 !== i && !(!r.event || typeof r.event != "object")) {
264
- if (typeof r.n == "number" && Number.isFinite(r.n)) {
265
- let e = d.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 });
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
- })), p = n.onChange((t) => {
292
- if (s) return;
293
- l += 1;
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: l
297
+ n: d
298
298
  };
299
299
  e.runPromise(r.publish(o, JSON.stringify(n)).pipe(e.tap(() => e.sync(() => {
300
- c = !1;
300
+ l = !1;
301
301
  })), e.catchAll((t) => e.sync(() => {
302
- c || (c = !0, a.warn("broadcast: publish failed — cross-replica fan-out degraded, local reactivity unaffected", {
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 m = !1;
314
+ let h = !1;
315
315
  return { close: async () => {
316
- if (!m) {
317
- m = !0, p();
316
+ if (!h) {
317
+ h = !0, m();
318
318
  try {
319
- f();
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, k 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 };
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.33.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.33.0",
37
- "@voltro/protocol": "0.33.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",