@supalive/core 0.1.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 (175) hide show
  1. package/README.md +22 -0
  2. package/dist/src/client/caller_client.d.ts +42 -0
  3. package/dist/src/client/caller_client.d.ts.map +1 -0
  4. package/dist/src/client/caller_client.js +77 -0
  5. package/dist/src/client/caller_client.js.map +1 -0
  6. package/dist/src/client/client.d.ts +149 -0
  7. package/dist/src/client/client.d.ts.map +1 -0
  8. package/dist/src/client/client.js +308 -0
  9. package/dist/src/client/client.js.map +1 -0
  10. package/dist/src/client/index.d.ts +17 -0
  11. package/dist/src/client/index.d.ts.map +1 -0
  12. package/dist/src/client/index.js +19 -0
  13. package/dist/src/client/index.js.map +1 -0
  14. package/dist/src/client/sub_key.d.ts +20 -0
  15. package/dist/src/client/sub_key.d.ts.map +1 -0
  16. package/dist/src/client/sub_key.js +37 -0
  17. package/dist/src/client/sub_key.js.map +1 -0
  18. package/dist/src/client/ws_client_manager.d.ts +268 -0
  19. package/dist/src/client/ws_client_manager.d.ts.map +1 -0
  20. package/dist/src/client/ws_client_manager.js +1013 -0
  21. package/dist/src/client/ws_client_manager.js.map +1 -0
  22. package/dist/src/config.d.ts +117 -0
  23. package/dist/src/config.d.ts.map +1 -0
  24. package/dist/src/config.js +2 -0
  25. package/dist/src/config.js.map +1 -0
  26. package/dist/src/db/bytes.d.ts +4 -0
  27. package/dist/src/db/bytes.d.ts.map +1 -0
  28. package/dist/src/db/bytes.js +24 -0
  29. package/dist/src/db/bytes.js.map +1 -0
  30. package/dist/src/db/cache.d.ts +30 -0
  31. package/dist/src/db/cache.d.ts.map +1 -0
  32. package/dist/src/db/cache.js +153 -0
  33. package/dist/src/db/cache.js.map +1 -0
  34. package/dist/src/db/codec.d.ts +10 -0
  35. package/dist/src/db/codec.d.ts.map +1 -0
  36. package/dist/src/db/codec.js +73 -0
  37. package/dist/src/db/codec.js.map +1 -0
  38. package/dist/src/db/context.d.ts +28 -0
  39. package/dist/src/db/context.d.ts.map +1 -0
  40. package/dist/src/db/context.js +147 -0
  41. package/dist/src/db/context.js.map +1 -0
  42. package/dist/src/db/db.d.ts +154 -0
  43. package/dist/src/db/db.d.ts.map +1 -0
  44. package/dist/src/db/db.js +23 -0
  45. package/dist/src/db/db.js.map +1 -0
  46. package/dist/src/db/mysql.d.ts +120 -0
  47. package/dist/src/db/mysql.d.ts.map +1 -0
  48. package/dist/src/db/mysql.js +708 -0
  49. package/dist/src/db/mysql.js.map +1 -0
  50. package/dist/src/db/postgres.d.ts +116 -0
  51. package/dist/src/db/postgres.d.ts.map +1 -0
  52. package/dist/src/db/postgres.js +998 -0
  53. package/dist/src/db/postgres.js.map +1 -0
  54. package/dist/src/db/query.d.ts +174 -0
  55. package/dist/src/db/query.d.ts.map +1 -0
  56. package/dist/src/db/query.js +790 -0
  57. package/dist/src/db/query.js.map +1 -0
  58. package/dist/src/db/query_definition.d.ts +54 -0
  59. package/dist/src/db/query_definition.d.ts.map +1 -0
  60. package/dist/src/db/query_definition.js +47 -0
  61. package/dist/src/db/query_definition.js.map +1 -0
  62. package/dist/src/db/realtime_db.d.ts +19 -0
  63. package/dist/src/db/realtime_db.d.ts.map +1 -0
  64. package/dist/src/db/realtime_db.js +98 -0
  65. package/dist/src/db/realtime_db.js.map +1 -0
  66. package/dist/src/db/schema.d.ts +110 -0
  67. package/dist/src/db/schema.d.ts.map +1 -0
  68. package/dist/src/db/schema.js +47 -0
  69. package/dist/src/db/schema.js.map +1 -0
  70. package/dist/src/db/types_client_rpc.d.ts +157 -0
  71. package/dist/src/db/types_client_rpc.d.ts.map +1 -0
  72. package/dist/src/db/types_client_rpc.js +106 -0
  73. package/dist/src/db/types_client_rpc.js.map +1 -0
  74. package/dist/src/db/types_db.d.ts +236 -0
  75. package/dist/src/db/types_db.d.ts.map +1 -0
  76. package/dist/src/db/types_db.js +188 -0
  77. package/dist/src/db/types_db.js.map +1 -0
  78. package/dist/src/exports/mysql.d.ts +2 -0
  79. package/dist/src/exports/mysql.d.ts.map +1 -0
  80. package/dist/src/exports/mysql.js +2 -0
  81. package/dist/src/exports/mysql.js.map +1 -0
  82. package/dist/src/exports/postgres.d.ts +2 -0
  83. package/dist/src/exports/postgres.d.ts.map +1 -0
  84. package/dist/src/exports/postgres.js +2 -0
  85. package/dist/src/exports/postgres.js.map +1 -0
  86. package/dist/src/exports/procedure.d.ts +5 -0
  87. package/dist/src/exports/procedure.d.ts.map +1 -0
  88. package/dist/src/exports/procedure.js +5 -0
  89. package/dist/src/exports/procedure.js.map +1 -0
  90. package/dist/src/exports/server.d.ts +3 -0
  91. package/dist/src/exports/server.d.ts.map +1 -0
  92. package/dist/src/exports/server.js +3 -0
  93. package/dist/src/exports/server.js.map +1 -0
  94. package/dist/src/exports/types.d.ts +6 -0
  95. package/dist/src/exports/types.d.ts.map +1 -0
  96. package/dist/src/exports/types.js +6 -0
  97. package/dist/src/exports/types.js.map +1 -0
  98. package/dist/src/helper.d.ts +11 -0
  99. package/dist/src/helper.d.ts.map +1 -0
  100. package/dist/src/helper.js +45 -0
  101. package/dist/src/helper.js.map +1 -0
  102. package/dist/src/logger.d.ts +7 -0
  103. package/dist/src/logger.d.ts.map +1 -0
  104. package/dist/src/logger.js +45 -0
  105. package/dist/src/logger.js.map +1 -0
  106. package/dist/src/router/index.d.ts +4 -0
  107. package/dist/src/router/index.d.ts.map +1 -0
  108. package/dist/src/router/index.js +4 -0
  109. package/dist/src/router/index.js.map +1 -0
  110. package/dist/src/router/procedure.d.ts +204 -0
  111. package/dist/src/router/procedure.d.ts.map +1 -0
  112. package/dist/src/router/procedure.js +122 -0
  113. package/dist/src/router/procedure.js.map +1 -0
  114. package/dist/src/router/router.d.ts +88 -0
  115. package/dist/src/router/router.d.ts.map +1 -0
  116. package/dist/src/router/router.js +88 -0
  117. package/dist/src/router/router.js.map +1 -0
  118. package/dist/src/server/hash.d.ts +12 -0
  119. package/dist/src/server/hash.d.ts.map +1 -0
  120. package/dist/src/server/hash.js +20 -0
  121. package/dist/src/server/hash.js.map +1 -0
  122. package/dist/src/server/hash.test.d.ts +2 -0
  123. package/dist/src/server/hash.test.d.ts.map +1 -0
  124. package/dist/src/server/hash.test.js +43 -0
  125. package/dist/src/server/hash.test.js.map +1 -0
  126. package/dist/src/server/index.d.ts +8 -0
  127. package/dist/src/server/index.d.ts.map +1 -0
  128. package/dist/src/server/index.js +7 -0
  129. package/dist/src/server/index.js.map +1 -0
  130. package/dist/src/server/overlap-checker.d.ts +18 -0
  131. package/dist/src/server/overlap-checker.d.ts.map +1 -0
  132. package/dist/src/server/overlap-checker.js +247 -0
  133. package/dist/src/server/overlap-checker.js.map +1 -0
  134. package/dist/src/server/sub_hash.d.ts +23 -0
  135. package/dist/src/server/sub_hash.d.ts.map +1 -0
  136. package/dist/src/server/sub_hash.js +38 -0
  137. package/dist/src/server/sub_hash.js.map +1 -0
  138. package/dist/src/server/subscription-manager-client.d.ts +120 -0
  139. package/dist/src/server/subscription-manager-client.d.ts.map +1 -0
  140. package/dist/src/server/subscription-manager-client.js +207 -0
  141. package/dist/src/server/subscription-manager-client.js.map +1 -0
  142. package/dist/src/server/subscription-manager-types.d.ts +168 -0
  143. package/dist/src/server/subscription-manager-types.d.ts.map +1 -0
  144. package/dist/src/server/subscription-manager-types.js +94 -0
  145. package/dist/src/server/subscription-manager-types.js.map +1 -0
  146. package/dist/src/server/subscription-manager-worker-entry.d.ts +2 -0
  147. package/dist/src/server/subscription-manager-worker-entry.d.ts.map +1 -0
  148. package/dist/src/server/subscription-manager-worker-entry.js +127 -0
  149. package/dist/src/server/subscription-manager-worker-entry.js.map +1 -0
  150. package/dist/src/server/subscription-manager-worker-protocol.d.ts +40 -0
  151. package/dist/src/server/subscription-manager-worker-protocol.d.ts.map +1 -0
  152. package/dist/src/server/subscription-manager-worker-protocol.js +20 -0
  153. package/dist/src/server/subscription-manager-worker-protocol.js.map +1 -0
  154. package/dist/src/server/subscription-manager.d.ts +32 -0
  155. package/dist/src/server/subscription-manager.d.ts.map +1 -0
  156. package/dist/src/server/subscription-manager.js +249 -0
  157. package/dist/src/server/subscription-manager.js.map +1 -0
  158. package/dist/src/server/subscription-manager.test.d.ts +2 -0
  159. package/dist/src/server/subscription-manager.test.d.ts.map +1 -0
  160. package/dist/src/server/subscription-manager.test.js +610 -0
  161. package/dist/src/server/subscription-manager.test.js.map +1 -0
  162. package/dist/src/server/subscription-worker.d.ts +32 -0
  163. package/dist/src/server/subscription-worker.d.ts.map +1 -0
  164. package/dist/src/server/subscription-worker.js +190 -0
  165. package/dist/src/server/subscription-worker.js.map +1 -0
  166. package/dist/src/server/supalive-server.d.ts +158 -0
  167. package/dist/src/server/supalive-server.d.ts.map +1 -0
  168. package/dist/src/server/supalive-server.js +1048 -0
  169. package/dist/src/server/supalive-server.js.map +1 -0
  170. package/dist/src/server/types_server.d.ts +96 -0
  171. package/dist/src/server/types_server.d.ts.map +1 -0
  172. package/dist/src/server/types_server.js +36 -0
  173. package/dist/src/server/types_server.js.map +1 -0
  174. package/dist/tsconfig.tsbuildinfo +1 -0
  175. package/package.json +83 -0
@@ -0,0 +1,40 @@
1
+ import type { DatabaseConfig, SubscriptionManagerConfig } from "../config";
2
+ export declare enum MsgType {
3
+ Init = 1,
4
+ Register = 2,
5
+ RegisterBatch = 3,
6
+ UpdateReadSet = 4,
7
+ Unregister = 5,
8
+ Unregisters = 6,
9
+ Invalidate = 7,
10
+ MinSubscriptionTs = 8,
11
+ LatestSnapshotTs = 9,
12
+ Prune = 10,
13
+ Shutdown = 11
14
+ }
15
+ export interface WorkerRequest {
16
+ type: MsgType;
17
+ reqId: number;
18
+ payload: unknown;
19
+ }
20
+ export type WorkerResponse = {
21
+ reqId: number;
22
+ ok: true;
23
+ result: unknown;
24
+ } | {
25
+ reqId: number;
26
+ ok: false;
27
+ error: {
28
+ message: string;
29
+ stack?: string;
30
+ };
31
+ };
32
+ export interface WorkerInitPayload {
33
+ workerId: number;
34
+ database: DatabaseConfig;
35
+ upstash: SubscriptionManagerConfig["upstash"];
36
+ cacheTTLSeconds: number;
37
+ maxConnectionsPerWorker: number;
38
+ logLevel?: string;
39
+ }
40
+ //# sourceMappingURL=subscription-manager-worker-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-manager-worker-protocol.d.ts","sourceRoot":"","sources":["../../../src/server/subscription-manager-worker-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAQ3E,oBAAY,OAAO;IACjB,IAAI,IAAI;IACR,QAAQ,IAAI;IACZ,aAAa,IAAI;IACjB,aAAa,IAAI;IACjB,UAAU,IAAI;IACd,WAAW,IAAI;IACf,UAAU,IAAI;IACd,iBAAiB,IAAI;IACrB,gBAAgB,IAAI;IACpB,KAAK,KAAK;IACV,QAAQ,KAAK;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC5C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,20 @@
1
+ // Internal wire protocol between the SubscriptionManager dispatcher (main
2
+ // thread) and each SubscriptionWorker thread. The channel is trusted, so we
3
+ // pass payloads as raw decoded objects and let the worker Zod-parse them
4
+ // against the matching schema. Numeric MsgType keeps the discriminator a
5
+ // single int — cheaper to switch on than a string.
6
+ export var MsgType;
7
+ (function (MsgType) {
8
+ MsgType[MsgType["Init"] = 1] = "Init";
9
+ MsgType[MsgType["Register"] = 2] = "Register";
10
+ MsgType[MsgType["RegisterBatch"] = 3] = "RegisterBatch";
11
+ MsgType[MsgType["UpdateReadSet"] = 4] = "UpdateReadSet";
12
+ MsgType[MsgType["Unregister"] = 5] = "Unregister";
13
+ MsgType[MsgType["Unregisters"] = 6] = "Unregisters";
14
+ MsgType[MsgType["Invalidate"] = 7] = "Invalidate";
15
+ MsgType[MsgType["MinSubscriptionTs"] = 8] = "MinSubscriptionTs";
16
+ MsgType[MsgType["LatestSnapshotTs"] = 9] = "LatestSnapshotTs";
17
+ MsgType[MsgType["Prune"] = 10] = "Prune";
18
+ MsgType[MsgType["Shutdown"] = 11] = "Shutdown";
19
+ })(MsgType || (MsgType = {}));
20
+ //# sourceMappingURL=subscription-manager-worker-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-manager-worker-protocol.js","sourceRoot":"","sources":["../../../src/server/subscription-manager-worker-protocol.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,mDAAmD;AAEnD,MAAM,CAAN,IAAY,OAYX;AAZD,WAAY,OAAO;IACjB,qCAAQ,CAAA;IACR,6CAAY,CAAA;IACZ,uDAAiB,CAAA;IACjB,uDAAiB,CAAA;IACjB,iDAAc,CAAA;IACd,mDAAe,CAAA;IACf,iDAAc,CAAA;IACd,+DAAqB,CAAA;IACrB,6DAAoB,CAAA;IACpB,wCAAU,CAAA;IACV,8CAAa,CAAA;AACf,CAAC,EAZW,OAAO,KAAP,OAAO,QAYlB"}
@@ -0,0 +1,32 @@
1
+ import { SubscriptionManagerConfig } from "../config";
2
+ export { SubscriptionWorker } from "./subscription-worker";
3
+ /**
4
+ * One process per deployment. Routes each subscription operation to one of N
5
+ * worker threads by hashing subId. Worker threads run in parallel on separate
6
+ * CPU cores; this dispatcher does no Zod parsing — it reads `subId` directly
7
+ * from the decoded payload (the internal channel is trusted) and forwards the
8
+ * raw payload. The worker validates and parses with Zod before executing.
9
+ */
10
+ export declare class SubscriptionManager {
11
+ private wss;
12
+ private port;
13
+ private workers;
14
+ private pruneInterval;
15
+ private static readonly PRUNE_INTERVAL_MS;
16
+ constructor(config: SubscriptionManagerConfig);
17
+ start(): Promise<void>;
18
+ stop(): Promise<void>;
19
+ private pruneCommitLogs;
20
+ workerCount(): number;
21
+ workerIndexFor(subId: string): number;
22
+ private workerFor;
23
+ private registerMethods;
24
+ private readSubId;
25
+ private registerSubscription;
26
+ private registerSubscriptionBatch;
27
+ private updateSubscriptionReadSet;
28
+ private unregisterSubscription;
29
+ private unregisterSubscriptions;
30
+ private invalidateWriteset;
31
+ }
32
+ //# sourceMappingURL=subscription-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-manager.d.ts","sourceRoot":"","sources":["../../../src/server/subscription-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AA2BtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsG3D;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAkB;gBAE/C,MAAM,EAAE,yBAAyB;IAsBvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUb,eAAe;IAsB7B,WAAW,IAAI,MAAM;IAIrB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIrC,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,SAAS;YAIH,oBAAoB;YAKpB,yBAAyB;YAwBzB,yBAAyB;YAKzB,sBAAsB;YAKtB,uBAAuB;YAsBvB,kBAAkB;CAQjC"}
@@ -0,0 +1,249 @@
1
+ import { Server as WebSocketServer } from "rpc-websockets";
2
+ import { Worker } from "node:worker_threads";
3
+ import { fileURLToPath } from "node:url";
4
+ import { fnv1a32 } from "./hash";
5
+ import { subscriptionManagerDataPack } from "./subscription-manager-client";
6
+ import { logger as baseLogger, logLevelOf } from "../logger";
7
+ import { groupByToMap } from "../helper";
8
+ import { MsgType, } from "./subscription-manager-worker-protocol";
9
+ // Re-export SubscriptionWorker so existing test imports
10
+ // (`import { SubscriptionWorker } from "./subscription-manager"`) keep working.
11
+ export { SubscriptionWorker } from "./subscription-worker";
12
+ const logger = baseLogger.child({ name: "SUBS_MGR" }, { level: logLevelOf("SUBS_MANAGER_SERVER_LOG_LEVEL") });
13
+ // Resolve the entry script next to this compiled file. `import.meta.url` works
14
+ // for both Bun (running TS source) and Node (running emitted JS) — we just
15
+ // swap the extension based on the current module's path.
16
+ function resolveWorkerEntry() {
17
+ const here = new URL(import.meta.url);
18
+ const isTs = here.pathname.endsWith(".ts");
19
+ const ext = isTs ? ".ts" : ".js";
20
+ return {
21
+ url: new URL(`./subscription-manager-worker-entry${ext}`, import.meta.url),
22
+ isTs,
23
+ };
24
+ }
25
+ // When the entry is a `.ts` file and we're running on Node (not Bun), the
26
+ // worker thread inherits no module loader — Node can strip types but its bare
27
+ // ESM resolver requires explicit file extensions, which our extensionless
28
+ // internal imports don't satisfy. Register tsx as the worker loader so it
29
+ // resolves the same way the parent module does.
30
+ function workerExecArgv(isTs) {
31
+ if (!isTs)
32
+ return undefined;
33
+ if (typeof globalThis.Bun !== "undefined")
34
+ return undefined;
35
+ return ["--import", "tsx"];
36
+ }
37
+ class SubscriptionWorkerHandle {
38
+ id;
39
+ worker;
40
+ pending = new Map();
41
+ nextReqId = 1;
42
+ readyPromise;
43
+ constructor(id, init) {
44
+ this.id = id;
45
+ const entry = resolveWorkerEntry();
46
+ this.worker = new Worker(fileURLToPath(entry.url), {
47
+ execArgv: workerExecArgv(entry.isTs),
48
+ });
49
+ this.worker.on("message", (res) => {
50
+ const pending = this.pending.get(res.reqId);
51
+ if (!pending)
52
+ return;
53
+ this.pending.delete(res.reqId);
54
+ if (res.ok) {
55
+ pending.resolve(res.result);
56
+ }
57
+ else {
58
+ const err = new Error(res.error.message);
59
+ if (res.error.stack)
60
+ err.stack = res.error.stack;
61
+ pending.reject(err);
62
+ }
63
+ });
64
+ this.worker.on("error", (err) => {
65
+ logger.error(err, `[worker ${this.id}] worker thread errored`);
66
+ const e = err instanceof Error ? err : new Error(String(err));
67
+ for (const [, p] of this.pending)
68
+ p.reject(e);
69
+ this.pending.clear();
70
+ });
71
+ this.readyPromise = this.send(MsgType.Init, init).then(() => { });
72
+ }
73
+ ready() {
74
+ return this.readyPromise;
75
+ }
76
+ send(type, payload) {
77
+ const reqId = this.nextReqId++;
78
+ return new Promise((resolve, reject) => {
79
+ this.pending.set(reqId, {
80
+ resolve: resolve,
81
+ reject,
82
+ });
83
+ const req = { type, reqId, payload };
84
+ this.worker.postMessage(req);
85
+ });
86
+ }
87
+ async shutdown() {
88
+ try {
89
+ await this.send(MsgType.Shutdown, null);
90
+ }
91
+ catch (_) { /* ignore */ }
92
+ await this.worker.terminate();
93
+ }
94
+ }
95
+ // ─── Dispatcher ──────────────────────────────────────────────────────────────
96
+ /**
97
+ * One process per deployment. Routes each subscription operation to one of N
98
+ * worker threads by hashing subId. Worker threads run in parallel on separate
99
+ * CPU cores; this dispatcher does no Zod parsing — it reads `subId` directly
100
+ * from the decoded payload (the internal channel is trusted) and forwards the
101
+ * raw payload. The worker validates and parses with Zod before executing.
102
+ */
103
+ export class SubscriptionManager {
104
+ wss;
105
+ port;
106
+ workers;
107
+ pruneInterval = null;
108
+ static PRUNE_INTERVAL_MS = 30 * 60 * 1000;
109
+ constructor(config) {
110
+ this.port = config.port;
111
+ this.wss = new WebSocketServer({ port: this.port }, subscriptionManagerDataPack);
112
+ this.wss.dataPack = subscriptionManagerDataPack;
113
+ const numWorkers = resolveWorkerCount(config.workers);
114
+ const maxConnectionsPerWorker = resolveMaxConnectionsPerWorker(config, numWorkers);
115
+ logger.info(`Spawning ${numWorkers} subscription worker${numWorkers === 1 ? "" : "s"}`);
116
+ this.workers = Array.from({ length: numWorkers }, (_, i) => new SubscriptionWorkerHandle(i + 1, {
117
+ workerId: i + 1,
118
+ database: config.database,
119
+ upstash: config.upstash,
120
+ cacheTTLSeconds: config.cacheTTLSeconds,
121
+ maxConnectionsPerWorker,
122
+ }));
123
+ this.registerMethods();
124
+ }
125
+ async start() {
126
+ await Promise.all(this.workers.map((w) => w.ready()));
127
+ logger.info(`Listening on port ${this.port}`);
128
+ this.pruneInterval = setInterval(() => { this.pruneCommitLogs().catch((err) => logger.error(err, "commit_logs prune failed")); }, SubscriptionManager.PRUNE_INTERVAL_MS);
129
+ if (this.pruneInterval && typeof this.pruneInterval.unref === "function") {
130
+ this.pruneInterval.unref();
131
+ }
132
+ }
133
+ async stop() {
134
+ if (this.pruneInterval) {
135
+ clearInterval(this.pruneInterval);
136
+ this.pruneInterval = null;
137
+ }
138
+ this.wss.close();
139
+ await Promise.all(this.workers.map((w) => w.shutdown()));
140
+ logger.info("Stopped");
141
+ }
142
+ async pruneCommitLogs() {
143
+ const minPerWorker = await Promise.all(this.workers.map((w) => w.send(MsgType.MinSubscriptionTs, null)));
144
+ let floor = null;
145
+ for (const m of minPerWorker) {
146
+ if (m === null)
147
+ continue;
148
+ if (floor === null || m < floor)
149
+ floor = m;
150
+ }
151
+ if (floor === null) {
152
+ const latest = await this.workers[0].send(MsgType.LatestSnapshotTs, null);
153
+ if (latest <= 0n)
154
+ return;
155
+ floor = latest;
156
+ }
157
+ const deleted = await this.workers[0].send(MsgType.Prune, floor);
158
+ if (deleted > 0n) {
159
+ logger.info(`pruned ${deleted} commit_logs older than ts=${floor}`);
160
+ }
161
+ }
162
+ workerCount() {
163
+ return this.workers.length;
164
+ }
165
+ workerIndexFor(subId) {
166
+ return fnv1a32(subId) % this.workers.length;
167
+ }
168
+ workerFor(subId) {
169
+ return this.workers[this.workerIndexFor(subId)];
170
+ }
171
+ registerMethods() {
172
+ this.wss.register("registerSubscription", this.registerSubscription.bind(this));
173
+ this.wss.register("registerSubscriptionBatch", this.registerSubscriptionBatch.bind(this));
174
+ this.wss.register("updateSubscriptionReadSet", this.updateSubscriptionReadSet.bind(this));
175
+ this.wss.register("invalidateWriteset", this.invalidateWriteset.bind(this));
176
+ this.wss.register("unregisterSubscription", this.unregisterSubscription.bind(this));
177
+ this.wss.register("unregisterSubscriptions", this.unregisterSubscriptions.bind(this));
178
+ }
179
+ readSubId(params) {
180
+ return params.subId;
181
+ }
182
+ async registerSubscription(params) {
183
+ const subId = this.readSubId(params);
184
+ return this.workerFor(subId).send(MsgType.Register, params);
185
+ }
186
+ async registerSubscriptionBatch(params) {
187
+ // Group entries by destination worker, dispatch one batch per worker, then
188
+ // restore the original order.
189
+ const arr = params;
190
+ const tagged = arr.map((p, index) => ({ index, p, worker: this.workerFor(p.subId) }));
191
+ const byWorker = groupByToMap(tagged, (t) => t.worker);
192
+ const settled = await Promise.all([...byWorker.entries()].map(async ([worker, items]) => {
193
+ const results = await worker.send(MsgType.RegisterBatch, items.map((t) => t.p));
194
+ return items.map((t, i) => ({ index: t.index, result: results[i] }));
195
+ }));
196
+ const result = new Array(arr.length);
197
+ for (const { index, result: r } of settled.flat()) {
198
+ result[index] = r;
199
+ }
200
+ return result;
201
+ }
202
+ async updateSubscriptionReadSet(params) {
203
+ const subId = this.readSubId(params);
204
+ return this.workerFor(subId).send(MsgType.UpdateReadSet, params);
205
+ }
206
+ async unregisterSubscription(params) {
207
+ const subId = this.readSubId(params);
208
+ return this.workerFor(subId).send(MsgType.Unregister, params);
209
+ }
210
+ async unregisterSubscriptions(params) {
211
+ const arr = params;
212
+ const tagged = arr.map((p, index) => ({ index, p, worker: this.workerFor(p.subId) }));
213
+ const byWorker = groupByToMap(tagged, (t) => t.worker);
214
+ const settled = await Promise.all([...byWorker.entries()].map(async ([worker, items]) => {
215
+ const results = await worker.send(MsgType.Unregisters, items.map((t) => t.p));
216
+ return items.map((t, i) => ({ index: t.index, result: results[i] }));
217
+ }));
218
+ const result = new Array(arr.length);
219
+ for (const { index, result: r } of settled.flat()) {
220
+ result[index] = r;
221
+ }
222
+ return result;
223
+ }
224
+ async invalidateWriteset(params) {
225
+ // Fan the raw payload out to every worker. Each parses its own copy of the
226
+ // writeSet (cheap relative to the scan) and returns its affected subs.
227
+ const perWorker = await Promise.all(this.workers.map((w) => w.send(MsgType.Invalidate, params)));
228
+ return { affected: perWorker.flat() };
229
+ }
230
+ }
231
+ function resolveWorkerCount(configured) {
232
+ if (typeof configured === "number" && configured > 0)
233
+ return Math.floor(configured);
234
+ const envVal = process.env.SUPALIVE_SUB_MANAGER_WORKERS;
235
+ if (envVal) {
236
+ const n = parseInt(envVal, 10);
237
+ if (Number.isFinite(n) && n > 0)
238
+ return n;
239
+ }
240
+ return 1;
241
+ }
242
+ function resolveMaxConnectionsPerWorker(config, workers) {
243
+ if (config.maxConnectionsPerWorker && config.maxConnectionsPerWorker > 0) {
244
+ return Math.floor(config.maxConnectionsPerWorker);
245
+ }
246
+ const total = config.database.maxConnections ?? (config.database.type === "mysql" ? 20 : 10);
247
+ return Math.max(1, Math.floor(total / workers));
248
+ }
249
+ //# sourceMappingURL=subscription-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-manager.js","sourceRoot":"","sources":["../../../src/server/subscription-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAa7D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,OAAO,GAIR,MAAM,wCAAwC,CAAC;AAEhD,wDAAwD;AACxD,gFAAgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,EAAE,KAAK,EAAE,UAAU,CAAC,+BAA+B,CAAC,EAAE,CACvD,CAAC;AAEF,+EAA+E;AAC/E,2EAA2E;AAC3E,yDAAyD;AACzD,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACjC,OAAO;QACL,GAAG,EAAE,IAAI,GAAG,CAAC,sCAAsC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1E,IAAI;KACL,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,0EAA0E;AAC1E,gDAAgD;AAChD,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,OAAQ,UAAkB,CAAC,GAAG,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACrE,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AASD,MAAM,wBAAwB;IACnB,EAAE,CAAS;IACZ,MAAM,CAAS;IACf,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,CAAgB;IAEpC,YAAY,EAAU,EAAE,IAAuB;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACjD,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAmB,EAAE,EAAE;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK;oBAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBACjD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,EAAE;YACvC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC;YAC/D,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO;gBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAO,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,CAAI,IAAa,EAAE,OAAgB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;gBACtB,OAAO,EAAE,OAA+B;gBACxC,MAAM;aACP,CAAC,CAAC;YACH,MAAM,GAAG,GAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;CACF;AAED,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACtB,GAAG,CAAkB;IACrB,IAAI,CAAS;IACb,OAAO,CAA6B;IACpC,aAAa,GAA0C,IAAI,CAAC;IAC5D,MAAM,CAAU,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE3D,YAAY,MAAiC;QAC3C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC;QACjF,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,2BAA2B,CAAC;QAEhD,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,uBAAuB,GAAG,8BAA8B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEnF,MAAM,CAAC,IAAI,CAAC,YAAY,UAAU,uBAAuB,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzD,IAAI,wBAAwB,CAAC,CAAC,GAAG,CAAC,EAAE;YAClC,QAAQ,EAAE,CAAC,GAAG,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,uBAAuB;SACxB,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,WAAW,CAC9B,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/F,mBAAmB,CAAC,iBAAiB,CACtC,CAAC;QACF,IAAI,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAgB,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAChF,CAAC;QACF,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI;gBAAE,SAAS;YACzB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK;gBAAE,KAAK,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAS,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACnF,IAAI,MAAM,IAAI,EAAE;gBAAE,OAAO;YACzB,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAS,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9C,CAAC;IAEO,SAAS,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAE,CAAC;IACnD,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,2BAA2B,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,2BAA2B,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,yBAAyB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,CAAC;IAEO,SAAS,CAAC,MAAe;QAC/B,OAAQ,MAA4B,CAAC,KAAK,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,MAAe;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAA6B,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,MAAe;QACrD,2EAA2E;QAC3E,8BAA8B;QAC9B,MAAM,GAAG,GAAG,MAAsC,CAAC;QACnD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAC/B,OAAO,CAAC,aAAa,EACrB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;YACF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAoC,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,MAAe;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAkC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACpG,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,MAAe;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAA+B,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9F,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,MAAe;QACnD,MAAM,GAAG,GAAG,MAAwC,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAC/B,OAAO,CAAC,WAAW,EACnB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAyC,CAC9D,CAAC;YACF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAkC,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,MAAe;QAC9C,2EAA2E;QAC3E,uEAAuE;QACvE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAyB,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CACpF,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;IACxC,CAAC;;AAGH,SAAS,kBAAkB,CAAC,UAAmB;IAC7C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IACxD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,8BAA8B,CAAC,MAAiC,EAAE,OAAe;IACxF,IAAI,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,uBAAuB,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subscription-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-manager.test.d.ts","sourceRoot":"","sources":["../../../src/server/subscription-manager.test.ts"],"names":[],"mappings":""}