orpc-fn 0.4.0 → 0.5.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/README.md +146 -4
- package/dist/cli.js +37 -48
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +29 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -0
- package/dist/client.js.map +1 -1
- package/dist/create-fn.d.ts.map +1 -1
- package/dist/create-fn.js +0 -1
- package/dist/create-fn.js.map +1 -1
- package/dist/hono.d.ts +12 -1
- package/dist/hono.d.ts.map +1 -1
- package/dist/hono.js +15 -1
- package/dist/hono.js.map +1 -1
- package/dist/live/fn-live.d.ts +1 -6
- package/dist/live/fn-live.d.ts.map +1 -1
- package/dist/live/fn-live.js +2 -18
- package/dist/live/fn-live.js.map +1 -1
- package/dist/live/index.d.ts +3 -1
- package/dist/live/index.d.ts.map +1 -1
- package/dist/live/index.js +2 -0
- package/dist/live/index.js.map +1 -1
- package/dist/live/invalidation-stream.d.ts +52 -0
- package/dist/live/invalidation-stream.d.ts.map +1 -0
- package/dist/live/invalidation-stream.js +98 -0
- package/dist/live/invalidation-stream.js.map +1 -0
- package/dist/live/ioredis.d.ts +1 -0
- package/dist/live/ioredis.d.ts.map +1 -1
- package/dist/live/ioredis.js +1 -0
- package/dist/live/ioredis.js.map +1 -1
- package/dist/live/memory.d.ts +2 -1
- package/dist/live/memory.d.ts.map +1 -1
- package/dist/live/memory.js +6 -1
- package/dist/live/memory.js.map +1 -1
- package/dist/live/pub-sub.d.ts +5 -0
- package/dist/live/pub-sub.d.ts.map +1 -1
- package/dist/live/pub-sub.js +16 -3
- package/dist/live/pub-sub.js.map +1 -1
- package/dist/live/redis-bun.d.ts +3 -0
- package/dist/live/redis-bun.d.ts.map +1 -1
- package/dist/live/redis-bun.js +1 -0
- package/dist/live/redis-bun.js.map +1 -1
- package/dist/live/redis.d.ts +4 -1
- package/dist/live/redis.d.ts.map +1 -1
- package/dist/live/redis.js +14 -2
- package/dist/live/redis.js.map +1 -1
- package/dist/live/scoped-change-bus.d.ts +45 -0
- package/dist/live/scoped-change-bus.d.ts.map +1 -0
- package/dist/live/scoped-change-bus.js +38 -0
- package/dist/live/scoped-change-bus.js.map +1 -0
- package/dist/live/transport.d.ts +11 -0
- package/dist/live/transport.d.ts.map +1 -1
- package/dist/live/transport.js.map +1 -1
- package/dist/procedure-cli.d.ts +25 -0
- package/dist/procedure-cli.d.ts.map +1 -0
- package/dist/procedure-cli.js +67 -0
- package/dist/procedure-cli.js.map +1 -0
- package/dist/react.d.ts +116 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +156 -0
- package/dist/react.js.map +1 -0
- package/dist/realtime.d.ts +114 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +316 -0
- package/dist/realtime.js.map +1 -0
- package/dist/vue/testing.d.ts +67 -0
- package/dist/vue/testing.d.ts.map +1 -0
- package/dist/vue/testing.js +225 -0
- package/dist/vue/testing.js.map +1 -0
- package/dist/vue.d.ts +211 -0
- package/dist/vue.d.ts.map +1 -0
- package/dist/vue.js +312 -0
- package/dist/vue.js.map +1 -0
- package/package.json +49 -3
- package/src/cli.ts +47 -57
- package/src/client.ts +57 -0
- package/src/create-fn.ts +0 -1
- package/src/hono.ts +22 -2
- package/src/live/fn-live.ts +3 -22
- package/src/live/index.ts +12 -1
- package/src/live/invalidation-stream.ts +142 -0
- package/src/live/ioredis.ts +2 -0
- package/src/live/memory.ts +11 -2
- package/src/live/pub-sub.ts +23 -2
- package/src/live/redis-bun.ts +3 -0
- package/src/live/redis.ts +33 -6
- package/src/live/scoped-change-bus.ts +98 -0
- package/src/live/transport.ts +12 -0
- package/src/procedure-cli.ts +99 -0
- package/src/react.ts +355 -0
- package/src/realtime.ts +416 -0
- package/src/vue/testing.ts +296 -0
- package/src/vue.ts +783 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Procedure, type Schema } from '@orpc/server';
|
|
2
|
+
/** A streaming procedure taking no input, such as a `createPubSub` subscribe route. */
|
|
3
|
+
type StreamProcedure<TEvent> = Procedure<any, any, any, Schema<any, AsyncIterable<TEvent>>, any, any>;
|
|
4
|
+
/** One event of an invalidation stream: the domain that changed, plus whatever its mapper added. */
|
|
5
|
+
export type InvalidationEvent<TEvents extends Record<string, unknown>, TExtras extends {
|
|
6
|
+
[K in keyof TEvents]?: object;
|
|
7
|
+
}> = {
|
|
8
|
+
[K in keyof TEvents & string]: {
|
|
9
|
+
domain: K;
|
|
10
|
+
} & (K extends keyof TExtras ? Partial<TExtras[K]> : unknown);
|
|
11
|
+
}[keyof TEvents & string];
|
|
12
|
+
/**
|
|
13
|
+
* Fans several change streams into one stream of `{ domain }` events, so a
|
|
14
|
+
* client keeps one connection and invalidates queries per domain. Use it as
|
|
15
|
+
* the body of a streaming `fn`:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* fn({
|
|
19
|
+
* name: 'realtime.changes',
|
|
20
|
+
* stream: true,
|
|
21
|
+
* input: z.object({}),
|
|
22
|
+
* handler: ({ context, signal }) =>
|
|
23
|
+
* invalidationStream({
|
|
24
|
+
* context,
|
|
25
|
+
* signal,
|
|
26
|
+
* sources: { deal: dealChanges.subscribe, workItem: workItemChanges.subscribe },
|
|
27
|
+
* // Optional: forward fields a client acts on (alerts), not just the domain.
|
|
28
|
+
* events: { deal: (event) => (event.kind === 'won' ? { dealId: event.dealId } : undefined) }
|
|
29
|
+
* })
|
|
30
|
+
* })
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* Each source is called with `{}`, the caller's context and a signal of its
|
|
34
|
+
* own. Events that queue up while the consumer is busy collapse when equal.
|
|
35
|
+
* When one source ends, the stream ends (a deploy drain); when one throws,
|
|
36
|
+
* the stream throws. Either way every source is closed and the client
|
|
37
|
+
* reconnects, which recreates them all.
|
|
38
|
+
*/
|
|
39
|
+
export declare function invalidationStream<TEvents extends Record<string, unknown>, TExtras extends {
|
|
40
|
+
[K in keyof TEvents]?: object;
|
|
41
|
+
} = Record<never, never>>(options: {
|
|
42
|
+
context: unknown;
|
|
43
|
+
signal?: AbortSignal | undefined;
|
|
44
|
+
sources: {
|
|
45
|
+
[K in keyof TEvents]: StreamProcedure<TEvents[K]>;
|
|
46
|
+
};
|
|
47
|
+
events?: {
|
|
48
|
+
[K in keyof TExtras]: (value: NoInfer<TEvents[K & keyof TEvents]>) => TExtras[K] | undefined;
|
|
49
|
+
};
|
|
50
|
+
}): AsyncGenerator<InvalidationEvent<TEvents, TExtras>, void, unknown>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=invalidation-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation-stream.d.ts","sourceRoot":"","sources":["../../src/live/invalidation-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,SAAS,EACd,KAAK,MAAM,EACX,MAAM,cAAc,CAAA;AAErB,uFAAuF;AAEvF,KAAK,eAAe,CAAC,MAAM,IAAI,SAAS,CACvC,GAAG,EACH,GAAG,EACH,GAAG,EACH,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,EAClC,GAAG,EACH,GAAG,CACH,CAAA;AAGD,oGAAoG;AACpG,MAAM,MAAM,iBAAiB,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,MAAM;CAAE,IAC9C;KACF,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM,GAAG;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,GACpE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC;CACX,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAA;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAuB,kBAAkB,CACxC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,SAAS;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,MAAM;CAAE,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACvE,OAAO,EAAE;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IAChC,OAAO,EAAE;SAAG,CAAC,IAAI,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KAAE,CAAA;IAC9D,MAAM,CAAC,EAAE;SACP,CAAC,IAAI,MAAM,OAAO,GAAG,CACrB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,KACtC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS;KAC3B,CAAA;CACD,GAAG,cAAc,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAyErE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { call } from '@orpc/server';
|
|
2
|
+
/**
|
|
3
|
+
* Fans several change streams into one stream of `{ domain }` events, so a
|
|
4
|
+
* client keeps one connection and invalidates queries per domain. Use it as
|
|
5
|
+
* the body of a streaming `fn`:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* fn({
|
|
9
|
+
* name: 'realtime.changes',
|
|
10
|
+
* stream: true,
|
|
11
|
+
* input: z.object({}),
|
|
12
|
+
* handler: ({ context, signal }) =>
|
|
13
|
+
* invalidationStream({
|
|
14
|
+
* context,
|
|
15
|
+
* signal,
|
|
16
|
+
* sources: { deal: dealChanges.subscribe, workItem: workItemChanges.subscribe },
|
|
17
|
+
* // Optional: forward fields a client acts on (alerts), not just the domain.
|
|
18
|
+
* events: { deal: (event) => (event.kind === 'won' ? { dealId: event.dealId } : undefined) }
|
|
19
|
+
* })
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Each source is called with `{}`, the caller's context and a signal of its
|
|
24
|
+
* own. Events that queue up while the consumer is busy collapse when equal.
|
|
25
|
+
* When one source ends, the stream ends (a deploy drain); when one throws,
|
|
26
|
+
* the stream throws. Either way every source is closed and the client
|
|
27
|
+
* reconnects, which recreates them all.
|
|
28
|
+
*/
|
|
29
|
+
export async function* invalidationStream(options) {
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
const abort = () => controller.abort();
|
|
32
|
+
if (options.signal?.aborted)
|
|
33
|
+
abort();
|
|
34
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
35
|
+
// Keyed by the serialized event: equal events collapse while queued.
|
|
36
|
+
const queue = new Map();
|
|
37
|
+
let wake;
|
|
38
|
+
let ended = false;
|
|
39
|
+
let failure;
|
|
40
|
+
const stop = (error) => {
|
|
41
|
+
if (ended)
|
|
42
|
+
return;
|
|
43
|
+
ended = true;
|
|
44
|
+
failure = error;
|
|
45
|
+
controller.abort();
|
|
46
|
+
wake?.();
|
|
47
|
+
};
|
|
48
|
+
controller.signal.addEventListener('abort', () => stop(), { once: true });
|
|
49
|
+
const mappers = (options.events ?? {});
|
|
50
|
+
const pump = async (domain, procedure) => {
|
|
51
|
+
let iterator;
|
|
52
|
+
try {
|
|
53
|
+
// oRPC's `call`, not the handler's bound call: closing a source needs
|
|
54
|
+
// a signal of its own, because return() waits behind a pending next().
|
|
55
|
+
const stream = (await call(procedure, {}, { context: options.context, signal: controller.signal }));
|
|
56
|
+
iterator = stream[Symbol.asyncIterator]();
|
|
57
|
+
while (!ended) {
|
|
58
|
+
const result = await iterator.next();
|
|
59
|
+
if (result.done)
|
|
60
|
+
return stop();
|
|
61
|
+
const event = { ...mappers[domain]?.(result.value), domain };
|
|
62
|
+
queue.set(JSON.stringify(event), event);
|
|
63
|
+
wake?.();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
stop({ error });
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await iterator?.return?.().catch(() => { });
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const pumps = Object.entries(options.sources).map(([domain, procedure]) => pump(domain, procedure));
|
|
74
|
+
try {
|
|
75
|
+
while (true) {
|
|
76
|
+
const [next] = queue;
|
|
77
|
+
if (next) {
|
|
78
|
+
queue.delete(next[0]);
|
|
79
|
+
yield next[1];
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (ended)
|
|
83
|
+
break;
|
|
84
|
+
await new Promise((resolve) => {
|
|
85
|
+
wake = resolve;
|
|
86
|
+
});
|
|
87
|
+
wake = undefined;
|
|
88
|
+
}
|
|
89
|
+
if (failure)
|
|
90
|
+
throw failure.error;
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
stop();
|
|
94
|
+
options.signal?.removeEventListener('abort', abort);
|
|
95
|
+
await Promise.allSettled(pumps);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=invalidation-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidation-stream.js","sourceRoot":"","sources":["../../src/live/invalidation-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AnyProcedure,\n\tcall,\n\ttype Procedure,\n\ttype Schema\n} from '@orpc/server'\n\n/** A streaming procedure taking no input, such as a `createPubSub` subscribe route. */\n/* biome-ignore-start lint/suspicious/noExplicitAny: matches any context, input, errors and meta */\ntype StreamProcedure<TEvent> = Procedure<\n\tany,\n\tany,\n\tany,\n\tSchema<any, AsyncIterable<TEvent>>,\n\tany,\n\tany\n>\n/* biome-ignore-end lint/suspicious/noExplicitAny: matches any context, input, errors and meta */\n\n/** One event of an invalidation stream: the domain that changed, plus whatever its mapper added. */\nexport type InvalidationEvent<\n\tTEvents extends Record<string, unknown>,\n\tTExtras extends { [K in keyof TEvents]?: object }\n> = {\n\t[K in keyof TEvents & string]: { domain: K } & (K extends keyof TExtras\n\t\t? Partial<TExtras[K]>\n\t\t: unknown)\n}[keyof TEvents & string]\n\n/**\n * Fans several change streams into one stream of `{ domain }` events, so a\n * client keeps one connection and invalidates queries per domain. Use it as\n * the body of a streaming `fn`:\n *\n * ```ts\n * fn({\n * name: 'realtime.changes',\n * stream: true,\n * input: z.object({}),\n * handler: ({ context, signal }) =>\n * invalidationStream({\n * context,\n * signal,\n * sources: { deal: dealChanges.subscribe, workItem: workItemChanges.subscribe },\n * // Optional: forward fields a client acts on (alerts), not just the domain.\n * events: { deal: (event) => (event.kind === 'won' ? { dealId: event.dealId } : undefined) }\n * })\n * })\n * ```\n *\n * Each source is called with `{}`, the caller's context and a signal of its\n * own. Events that queue up while the consumer is busy collapse when equal.\n * When one source ends, the stream ends (a deploy drain); when one throws,\n * the stream throws. Either way every source is closed and the client\n * reconnects, which recreates them all.\n */\nexport async function* invalidationStream<\n\tTEvents extends Record<string, unknown>,\n\tTExtras extends { [K in keyof TEvents]?: object } = Record<never, never>\n>(options: {\n\tcontext: unknown\n\tsignal?: AbortSignal | undefined\n\tsources: { [K in keyof TEvents]: StreamProcedure<TEvents[K]> }\n\tevents?: {\n\t\t[K in keyof TExtras]: (\n\t\t\tvalue: NoInfer<TEvents[K & keyof TEvents]>\n\t\t) => TExtras[K] | undefined\n\t}\n}): AsyncGenerator<InvalidationEvent<TEvents, TExtras>, void, unknown> {\n\ttype Event = InvalidationEvent<TEvents, TExtras>\n\tconst controller = new AbortController()\n\tconst abort = () => controller.abort()\n\tif (options.signal?.aborted) abort()\n\toptions.signal?.addEventListener('abort', abort, { once: true })\n\n\t// Keyed by the serialized event: equal events collapse while queued.\n\tconst queue = new Map<string, Event>()\n\tlet wake: (() => void) | undefined\n\tlet ended = false\n\tlet failure: { error: unknown } | undefined\n\tconst stop = (error?: { error: unknown }) => {\n\t\tif (ended) return\n\t\tended = true\n\t\tfailure = error\n\t\tcontroller.abort()\n\t\twake?.()\n\t}\n\tcontroller.signal.addEventListener('abort', () => stop(), { once: true })\n\n\tconst mappers = (options.events ?? {}) as Record<\n\t\tstring,\n\t\t((value: unknown) => object | undefined) | undefined\n\t>\n\tconst pump = async (domain: string, procedure: AnyProcedure) => {\n\t\tlet iterator: AsyncIterator<unknown> | undefined\n\t\ttry {\n\t\t\t// oRPC's `call`, not the handler's bound call: closing a source needs\n\t\t\t// a signal of its own, because return() waits behind a pending next().\n\t\t\tconst stream = (await call(\n\t\t\t\tprocedure,\n\t\t\t\t{},\n\t\t\t\t{ context: options.context, signal: controller.signal }\n\t\t\t)) as AsyncIterable<unknown>\n\t\t\titerator = stream[Symbol.asyncIterator]()\n\t\t\twhile (!ended) {\n\t\t\t\tconst result = await iterator.next()\n\t\t\t\tif (result.done) return stop()\n\t\t\t\tconst event = { ...mappers[domain]?.(result.value), domain } as Event\n\t\t\t\tqueue.set(JSON.stringify(event), event)\n\t\t\t\twake?.()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tstop({ error })\n\t\t} finally {\n\t\t\tawait iterator?.return?.().catch(() => {})\n\t\t}\n\t}\n\tconst pumps = Object.entries(options.sources).map(([domain, procedure]) =>\n\t\tpump(domain, procedure as AnyProcedure)\n\t)\n\n\ttry {\n\t\twhile (true) {\n\t\t\tconst [next] = queue\n\t\t\tif (next) {\n\t\t\t\tqueue.delete(next[0])\n\t\t\t\tyield next[1]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (ended) break\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\twake = resolve\n\t\t\t})\n\t\t\twake = undefined\n\t\t}\n\t\tif (failure) throw failure.error\n\t} finally {\n\t\tstop()\n\t\toptions.signal?.removeEventListener('abort', abort)\n\t\tawait Promise.allSettled(pumps)\n\t}\n}\n"]}
|
package/dist/live/ioredis.d.ts
CHANGED
|
@@ -28,5 +28,6 @@ export declare function ioredisTransport(client: IORedisLike, options?: {
|
|
|
28
28
|
onError?: (error: Error) => void;
|
|
29
29
|
}): import("./transport.js").PubSubTransport & {
|
|
30
30
|
close(): Promise<void>;
|
|
31
|
+
stats(): import("./transport.js").PubSubTransportStats;
|
|
31
32
|
};
|
|
32
33
|
//# sourceMappingURL=ioredis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ioredis.d.ts","sourceRoot":"","sources":["../../src/live/ioredis.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,SAAS,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpD,SAAS,IAAI,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,IAAI,IAAI,CAAA;IAClB,EAAE,CACD,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAA;IACV,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IACjD,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAC/C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAA;IAC7D,GAAG,CACF,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAA;IACV,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAClD,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAChD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAA;CAC9D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO
|
|
1
|
+
{"version":3,"file":"ioredis.d.ts","sourceRoot":"","sources":["../../src/live/ioredis.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,SAAS,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpD,SAAS,IAAI,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,IAAI,IAAI,CAAA;IAClB,EAAE,CACD,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAA;IACV,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IACjD,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAC/C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAA;IAC7D,GAAG,CACF,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAA;IACV,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAClD,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;IAChD,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAA;CAC9D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO;;;EA2D5E"}
|
package/dist/live/ioredis.js
CHANGED
|
@@ -46,6 +46,7 @@ export function ioredisTransport(client, options = {}) {
|
|
|
46
46
|
ours.delete(channel);
|
|
47
47
|
return subscriber.unsubscribe(channel);
|
|
48
48
|
},
|
|
49
|
+
connected: () => subscriber.status === undefined || subscriber.status === 'ready',
|
|
49
50
|
close() {
|
|
50
51
|
// Detach first: a given subscriber outlives this transport's use.
|
|
51
52
|
subscriber.off('ready', onReady);
|
package/dist/live/ioredis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ioredis.js","sourceRoot":"","sources":["../../src/live/ioredis.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRedisTransport } from './redis.js'\n\n/** The part of an ioredis `Redis` client this transport uses. */\nexport interface IORedisLike {\n\tcall(command: string, ...args: string[]): Promise<unknown>\n\tsubscribe(...channels: string[]): Promise<unknown>\n\tunsubscribe(...channels: string[]): Promise<unknown>\n\tduplicate(): IORedisLike\n\tstatus?: string\n\tdisconnect(): void\n\ton(\n\t\tevent: 'message',\n\t\tlistener: (channel: string, message: string) => void\n\t): unknown\n\ton(event: 'ready', listener: () => void): unknown\n\ton(event: 'end', listener: () => void): unknown\n\ton(event: 'error', listener: (error: Error) => void): unknown\n\toff(\n\t\tevent: 'message',\n\t\tlistener: (channel: string, message: string) => void\n\t): unknown\n\toff(event: 'ready', listener: () => void): unknown\n\toff(event: 'end', listener: () => void): unknown\n\toff(event: 'error', listener: (error: Error) => void): unknown\n}\n\n/**\n * `PubSubTransport` for ioredis. Subscriptions use a dedicated connection\n * (`client.duplicate()` unless `subscriber` is given); ioredis re-subscribes\n * after reconnects itself (`autoResubscribe`), so no `resubscribe` is needed. `onError` receives connection\n * errors that ioredis is already retrying.\n *\n * Call `close()` on shutdown to disconnect the subscriber it created.\n */\nexport function ioredisTransport(\n\tclient: IORedisLike,\n\toptions: { subscriber?: IORedisLike; onError?: (error: Error) => void } = {}\n) {\n\treturn createRedisTransport({\n\t\tsend: (command, args) => client.call(command, ...args),\n\t\tasync connectSubscriber(handlers) {\n\t\t\tconst owned = !options.subscriber\n\t\t\tconst subscriber = options.subscriber ?? client.duplicate()\n\t\t\tconst onMessage = (channel: string, message: string) =>\n\t\t\t\thandlers.onMessage(channel, message)\n\t\t\t// Without a listener an ioredis 'error' event would crash the process.\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\ttry {\n\t\t\t\t\toptions.onError?.(error)\n\t\t\t\t} catch {\n\t\t\t\t\t/* Isolate telemetry. */\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet readyOnce = subscriber.status === 'ready'\n\t\t\tconst onReady = () => {\n\t\t\t\tif (readyOnce) handlers.onReconnect()\n\t\t\t\treadyOnce = true\n\t\t\t}\n\t\t\t// 'end' means ioredis stopped reconnecting.\n\t\t\tconst onEnd = () =>\n\t\t\t\thandlers.onLost(new Error('Redis subscriber connection ended'))\n\t\t\tconst ours = new Set<string>()\n\t\t\tsubscriber.on('ready', onReady)\n\t\t\tsubscriber.on('message', onMessage)\n\t\t\tsubscriber.on('error', onError)\n\t\t\tsubscriber.on('end', onEnd)\n\t\t\treturn {\n\t\t\t\tsubscribe: (channel) => {\n\t\t\t\t\tours.add(channel)\n\t\t\t\t\treturn subscriber.subscribe(channel)\n\t\t\t\t},\n\t\t\t\tresubscribe: (channel: string) => subscriber.subscribe(channel),\n\t\t\t\tunsubscribe: (channel) => {\n\t\t\t\t\tours.delete(channel)\n\t\t\t\t\treturn subscriber.unsubscribe(channel)\n\t\t\t\t},\n\t\t\t\tclose() {\n\t\t\t\t\t// Detach first: a given subscriber outlives this transport's use.\n\t\t\t\t\tsubscriber.off('ready', onReady)\n\t\t\t\t\tsubscriber.off('message', onMessage)\n\t\t\t\t\tsubscriber.off('end', onEnd)\n\t\t\t\t\tif (owned) return subscriber.disconnect()\n\t\t\t\t\tsubscriber.off('error', onError)\n\t\t\t\t\tif (ours.size > 0) {\n\t\t\t\t\t\treturn subscriber\n\t\t\t\t\t\t\t.unsubscribe(...ours)\n\t\t\t\t\t\t\t.then(() => {})\n\t\t\t\t\t\t\t.catch(() => {})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ioredis.js","sourceRoot":"","sources":["../../src/live/ioredis.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRedisTransport } from './redis.js'\n\n/** The part of an ioredis `Redis` client this transport uses. */\nexport interface IORedisLike {\n\tcall(command: string, ...args: string[]): Promise<unknown>\n\tsubscribe(...channels: string[]): Promise<unknown>\n\tunsubscribe(...channels: string[]): Promise<unknown>\n\tduplicate(): IORedisLike\n\tstatus?: string\n\tdisconnect(): void\n\ton(\n\t\tevent: 'message',\n\t\tlistener: (channel: string, message: string) => void\n\t): unknown\n\ton(event: 'ready', listener: () => void): unknown\n\ton(event: 'end', listener: () => void): unknown\n\ton(event: 'error', listener: (error: Error) => void): unknown\n\toff(\n\t\tevent: 'message',\n\t\tlistener: (channel: string, message: string) => void\n\t): unknown\n\toff(event: 'ready', listener: () => void): unknown\n\toff(event: 'end', listener: () => void): unknown\n\toff(event: 'error', listener: (error: Error) => void): unknown\n}\n\n/**\n * `PubSubTransport` for ioredis. Subscriptions use a dedicated connection\n * (`client.duplicate()` unless `subscriber` is given); ioredis re-subscribes\n * after reconnects itself (`autoResubscribe`), so no `resubscribe` is needed. `onError` receives connection\n * errors that ioredis is already retrying.\n *\n * Call `close()` on shutdown to disconnect the subscriber it created.\n */\nexport function ioredisTransport(\n\tclient: IORedisLike,\n\toptions: { subscriber?: IORedisLike; onError?: (error: Error) => void } = {}\n) {\n\treturn createRedisTransport({\n\t\tsend: (command, args) => client.call(command, ...args),\n\t\tasync connectSubscriber(handlers) {\n\t\t\tconst owned = !options.subscriber\n\t\t\tconst subscriber = options.subscriber ?? client.duplicate()\n\t\t\tconst onMessage = (channel: string, message: string) =>\n\t\t\t\thandlers.onMessage(channel, message)\n\t\t\t// Without a listener an ioredis 'error' event would crash the process.\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\ttry {\n\t\t\t\t\toptions.onError?.(error)\n\t\t\t\t} catch {\n\t\t\t\t\t/* Isolate telemetry. */\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet readyOnce = subscriber.status === 'ready'\n\t\t\tconst onReady = () => {\n\t\t\t\tif (readyOnce) handlers.onReconnect()\n\t\t\t\treadyOnce = true\n\t\t\t}\n\t\t\t// 'end' means ioredis stopped reconnecting.\n\t\t\tconst onEnd = () =>\n\t\t\t\thandlers.onLost(new Error('Redis subscriber connection ended'))\n\t\t\tconst ours = new Set<string>()\n\t\t\tsubscriber.on('ready', onReady)\n\t\t\tsubscriber.on('message', onMessage)\n\t\t\tsubscriber.on('error', onError)\n\t\t\tsubscriber.on('end', onEnd)\n\t\t\treturn {\n\t\t\t\tsubscribe: (channel) => {\n\t\t\t\t\tours.add(channel)\n\t\t\t\t\treturn subscriber.subscribe(channel)\n\t\t\t\t},\n\t\t\t\tresubscribe: (channel: string) => subscriber.subscribe(channel),\n\t\t\t\tunsubscribe: (channel) => {\n\t\t\t\t\tours.delete(channel)\n\t\t\t\t\treturn subscriber.unsubscribe(channel)\n\t\t\t\t},\n\t\t\t\tconnected: () =>\n\t\t\t\t\tsubscriber.status === undefined || subscriber.status === 'ready',\n\t\t\t\tclose() {\n\t\t\t\t\t// Detach first: a given subscriber outlives this transport's use.\n\t\t\t\t\tsubscriber.off('ready', onReady)\n\t\t\t\t\tsubscriber.off('message', onMessage)\n\t\t\t\t\tsubscriber.off('end', onEnd)\n\t\t\t\t\tif (owned) return subscriber.disconnect()\n\t\t\t\t\tsubscriber.off('error', onError)\n\t\t\t\t\tif (ours.size > 0) {\n\t\t\t\t\t\treturn subscriber\n\t\t\t\t\t\t\t.unsubscribe(...ours)\n\t\t\t\t\t\t\t.then(() => {})\n\t\t\t\t\t\t\t.catch(() => {})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n"]}
|
package/dist/live/memory.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PubSubTransport } from './transport.js';
|
|
1
|
+
import type { PubSubTransport, PubSubTransportStats } from './transport.js';
|
|
2
2
|
/**
|
|
3
3
|
* In-process transport for tests and single-process development. Delivery is
|
|
4
4
|
* asynchronous (a microtask), like a real broker.
|
|
@@ -6,5 +6,6 @@ import type { PubSubTransport } from './transport.js';
|
|
|
6
6
|
export declare function memoryTransport(): PubSubTransport & {
|
|
7
7
|
/** Active listeners per channel, for assertions. */
|
|
8
8
|
listenerCount(channel: string): number;
|
|
9
|
+
stats(): PubSubTransportStats;
|
|
9
10
|
};
|
|
10
11
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/live/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/live/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE3E;;;GAGG;AACH,wBAAgB,eAAe,IAAI,eAAe,GAAG;IACpD,oDAAoD;IACpD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACtC,KAAK,IAAI,oBAAoB,CAAA;CAC7B,CAoDA"}
|
package/dist/live/memory.js
CHANGED
|
@@ -43,7 +43,12 @@ export function memoryTransport() {
|
|
|
43
43
|
listeners.delete(channel);
|
|
44
44
|
};
|
|
45
45
|
},
|
|
46
|
-
listenerCount: (channel) => listeners.get(channel)?.size ?? 0
|
|
46
|
+
listenerCount: (channel) => listeners.get(channel)?.size ?? 0,
|
|
47
|
+
stats: () => ({
|
|
48
|
+
channels: listeners.size,
|
|
49
|
+
listeners: [...listeners.values()].reduce((sum, set) => sum + set.size, 0),
|
|
50
|
+
subscriberConnected: true
|
|
51
|
+
})
|
|
47
52
|
};
|
|
48
53
|
}
|
|
49
54
|
//# sourceMappingURL=memory.js.map
|
package/dist/live/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/live/memory.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/live/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PubSubTransport, PubSubTransportStats } from './transport.js'\n\n/**\n * In-process transport for tests and single-process development. Delivery is\n * asynchronous (a microtask), like a real broker.\n */\nexport function memoryTransport(): PubSubTransport & {\n\t/** Active listeners per channel, for assertions. */\n\tlistenerCount(channel: string): number\n\tstats(): PubSubTransportStats\n} {\n\tconst listeners = new Map<string, Set<(payload: string) => void>>()\n\tconst backlogs = new Map<string, { items: string[]; expiresAt: number }>()\n\n\treturn {\n\t\tasync close() {\n\t\t\tlisteners.clear()\n\t\t\tbacklogs.clear()\n\t\t},\n\t\tasync publish(messages, backlog) {\n\t\t\tfor (const { channel, payload } of messages) {\n\t\t\t\tif (backlog) {\n\t\t\t\t\tconst current = backlogs.get(channel)\n\t\t\t\t\tconst items =\n\t\t\t\t\t\tcurrent && current.expiresAt > Date.now() ? current.items : []\n\t\t\t\t\titems.push(payload)\n\t\t\t\t\titems.splice(0, Math.max(0, items.length - backlog.size))\n\t\t\t\t\tbacklogs.set(channel, {\n\t\t\t\t\t\titems,\n\t\t\t\t\t\texpiresAt: Date.now() + backlog.ttlSeconds * 1000\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tfor (const listener of [...(listeners.get(channel) ?? [])]) {\n\t\t\t\t\tqueueMicrotask(() => listener(payload))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync readBacklog(channel) {\n\t\t\tconst backlog = backlogs.get(channel)\n\t\t\treturn backlog && backlog.expiresAt > Date.now() ? [...backlog.items] : []\n\t\t},\n\t\tasync subscribe(channel, listener) {\n\t\t\tconst set = listeners.get(channel) ?? new Set()\n\t\t\tlisteners.set(channel, set)\n\t\t\t// Wrap so the same listener can subscribe twice and unsubscribe once.\n\t\t\tconst entry = (payload: string) => listener(payload)\n\t\t\tset.add(entry)\n\t\t\treturn async () => {\n\t\t\t\tset.delete(entry)\n\t\t\t\tif (set.size === 0) listeners.delete(channel)\n\t\t\t}\n\t\t},\n\t\tlistenerCount: (channel) => listeners.get(channel)?.size ?? 0,\n\t\tstats: () => ({\n\t\t\tchannels: listeners.size,\n\t\t\tlisteners: [...listeners.values()].reduce(\n\t\t\t\t(sum, set) => sum + set.size,\n\t\t\t\t0\n\t\t\t),\n\t\t\tsubscriberConnected: true\n\t\t})\n\t}\n}\n"]}
|
package/dist/live/pub-sub.d.ts
CHANGED
|
@@ -48,6 +48,11 @@ export type PublisherConfig = {
|
|
|
48
48
|
* channel means no duplicate work.
|
|
49
49
|
*/
|
|
50
50
|
mirrorChannel?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Log publish failures (validation or broker) instead of throwing them, so
|
|
53
|
+
* a publish after a committed write cannot fail the request. No retry.
|
|
54
|
+
*/
|
|
55
|
+
safePublish?: boolean;
|
|
51
56
|
};
|
|
52
57
|
/** Per-definition overrides of the factory queue bounds. */
|
|
53
58
|
export type ChannelQueueOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAGN,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAGX,eAAe,EACf,MAAM,gBAAgB,CAAA;AAUvB,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AAE1E;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,IACjE,MAAM,GACN;IACA,SAAS,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAA;KAAE,KAAK,MAAM,CAAA;IACnE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAA;CACrC,GACD,CAAC,CACD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,EAC7C,OAAO,CAAC,EAAE,QAAQ,KACb,MAAM,CAAC,CAAA;AAEf,wDAAwD;AACxD,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;CAChB,KAAK,YAAY,CAAC,OAAO,CAAC,CAAA;AAE3B;;;GAGG;AACH,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,QAAQ,IAChC,CAAC,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GACrE,IAAI,CAAA;AAEP,MAAM,MAAM,eAAe,GAAG;IAC7B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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"}
|
package/dist/live/pub-sub.js
CHANGED
|
@@ -265,11 +265,24 @@ export function createLiveRuntime(options) {
|
|
|
265
265
|
span?.setAttribute('pubsub.duration_ms', performance.now() - startTime);
|
|
266
266
|
}
|
|
267
267
|
});
|
|
268
|
+
const guarded = async (operation, items) => {
|
|
269
|
+
if (!config.safePublish)
|
|
270
|
+
return send(operation, items);
|
|
271
|
+
try {
|
|
272
|
+
await send(operation, items);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.error('pubsub.publish_failed', {
|
|
276
|
+
name,
|
|
277
|
+
...errorAttributes(error)
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
};
|
|
268
281
|
return {
|
|
269
|
-
publish: (data) =>
|
|
282
|
+
publish: (data) => guarded('publish', [data]),
|
|
270
283
|
publishMany: async (items) => {
|
|
271
284
|
if (items.length > 0)
|
|
272
|
-
await
|
|
285
|
+
await guarded('publishMany', items);
|
|
273
286
|
}
|
|
274
287
|
};
|
|
275
288
|
}
|
|
@@ -774,7 +787,7 @@ export function createLiveRuntime(options) {
|
|
|
774
787
|
function createPubSub(pubsubOptions) {
|
|
775
788
|
const { name } = pubsubOptions;
|
|
776
789
|
const channel = createChannel(pubsubOptions);
|
|
777
|
-
const { channel: _channel, eventSchema: _eventSchema, inputSchema, filterFn: _filterFn, authFn: _authFn, overflowMarker: _overflowMarker, useBacklog: _useBacklog, backlogSize: _backlogSize, backlogTtl: _backlogTtl, mirrorChannel: _mirrorChannel, maxQueueSize: _maxQueueSize, maxIngressSize: _maxIngressSize, maxReplaySize: _maxReplaySize, ...routeOptions } = pubsubOptions;
|
|
790
|
+
const { channel: _channel, eventSchema: _eventSchema, inputSchema, filterFn: _filterFn, authFn: _authFn, overflowMarker: _overflowMarker, useBacklog: _useBacklog, backlogSize: _backlogSize, backlogTtl: _backlogTtl, mirrorChannel: _mirrorChannel, safePublish: _safePublish, maxQueueSize: _maxQueueSize, maxIngressSize: _maxIngressSize, maxReplaySize: _maxReplaySize, ...routeOptions } = pubsubOptions;
|
|
778
791
|
const subscribe = options.fn({
|
|
779
792
|
...routeOptions,
|
|
780
793
|
name,
|