@orpc/publisher 1.14.11

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.
@@ -0,0 +1,74 @@
1
+ import { AsyncIteratorClass } from '@orpc/shared';
2
+
3
+ class Publisher {
4
+ maxBufferedEvents;
5
+ constructor(options = {}) {
6
+ this.maxBufferedEvents = options.maxBufferedEvents ?? 100;
7
+ }
8
+ subscribe(event, listenerOrOptions, listenerOptions) {
9
+ if (typeof listenerOrOptions === "function") {
10
+ return this.subscribeListener(event, listenerOrOptions, listenerOptions);
11
+ }
12
+ const signal = listenerOrOptions?.signal;
13
+ const maxBufferedEvents = listenerOrOptions?.maxBufferedEvents ?? this.maxBufferedEvents;
14
+ signal?.throwIfAborted();
15
+ const bufferedEvents = [];
16
+ const pullResolvers = [];
17
+ const unsubscribePromise = this.subscribeListener(event, (payload) => {
18
+ if (signal?.aborted) {
19
+ return;
20
+ }
21
+ const resolver = pullResolvers.shift();
22
+ if (resolver) {
23
+ resolver.resolve({ done: false, value: payload });
24
+ } else {
25
+ bufferedEvents.push(payload);
26
+ if (bufferedEvents.length > maxBufferedEvents) {
27
+ bufferedEvents.shift();
28
+ }
29
+ }
30
+ }, {
31
+ lastEventId: listenerOrOptions?.lastEventId,
32
+ onError: (error) => terminate({ kind: "error", error })
33
+ }).catch((error) => terminate({ kind: "error", error }));
34
+ const abortListener = () => terminate({ kind: "error", error: signal.reason });
35
+ signal?.addEventListener("abort", abortListener);
36
+ let terminalState;
37
+ async function terminate(state) {
38
+ if (terminalState) {
39
+ return;
40
+ }
41
+ terminalState = state;
42
+ signal?.removeEventListener("abort", abortListener);
43
+ if (state.kind === "error") {
44
+ pullResolvers.forEach((resolver) => resolver.reject(state.error));
45
+ } else {
46
+ pullResolvers.forEach((resolver) => resolver.resolve({ done: true, value: void 0 }));
47
+ }
48
+ if (signal?.aborted) {
49
+ pullResolvers.length = 0;
50
+ bufferedEvents.length = 0;
51
+ }
52
+ await unsubscribePromise.then((unsubscribe) => unsubscribe?.());
53
+ }
54
+ return new AsyncIteratorClass(
55
+ async () => {
56
+ if (terminalState?.kind === "cancelled") {
57
+ return { done: true, value: void 0 };
58
+ }
59
+ if (bufferedEvents.length > 0) {
60
+ return { done: false, value: bufferedEvents.shift() };
61
+ }
62
+ if (terminalState?.kind === "error") {
63
+ throw terminalState.error;
64
+ }
65
+ return new Promise((resolve, reject) => {
66
+ pullResolvers.push({ resolve, reject });
67
+ });
68
+ },
69
+ () => terminate({ kind: "cancelled" })
70
+ );
71
+ }
72
+ }
73
+
74
+ export { Publisher as P };
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@orpc/publisher",
3
+ "type": "module",
4
+ "version": "1.14.11",
5
+ "license": "MIT",
6
+ "homepage": "https://orpc.dev",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/middleapi/orpc.git",
10
+ "directory": "packages/publisher"
11
+ },
12
+ "keywords": [
13
+ "orpc"
14
+ ],
15
+ "sideEffects": false,
16
+ "exports": {
17
+ "./package.json": "./package.json",
18
+ ".": {
19
+ "types": "./dist/index.d.mts",
20
+ "import": "./dist/index.mjs",
21
+ "default": "./dist/index.mjs"
22
+ },
23
+ "./memory": {
24
+ "types": "./dist/adapters/memory.d.mts",
25
+ "import": "./dist/adapters/memory.mjs",
26
+ "default": "./dist/adapters/memory.mjs"
27
+ },
28
+ "./redis": {
29
+ "types": "./dist/adapters/redis.d.mts",
30
+ "import": "./dist/adapters/redis.mjs",
31
+ "default": "./dist/adapters/redis.mjs"
32
+ },
33
+ "./upstash": {
34
+ "types": "./dist/adapters/upstash.d.mts",
35
+ "import": "./dist/adapters/upstash.mjs",
36
+ "default": "./dist/adapters/upstash.mjs"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist"
41
+ ],
42
+ "peerDependencies": {
43
+ "@upstash/redis": ">=1.35.6",
44
+ "redis": ">=6.0.0"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@upstash/redis": {
48
+ "optional": true
49
+ },
50
+ "redis": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "dependencies": {
55
+ "@standardserver/core": "^0.5.0",
56
+ "@orpc/client": "1.14.11",
57
+ "@orpc/shared": "1.14.11"
58
+ },
59
+ "devDependencies": {
60
+ "@upstash/redis": "^1.38.0",
61
+ "redis": "^6.0.1"
62
+ },
63
+ "scripts": {
64
+ "build": "unbuild",
65
+ "type:check": "tsc -b"
66
+ }
67
+ }