@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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,UAAU,GACX,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ // ── Query definitions ─────────────────────────────────────────────────────────
2
+ export { defineQuery, _resetGlobalDefs } from "../db/query_definition";
3
+ // ── Core DB ───────────────────────────────────────────────────────────────────
4
+ export { SupaliveDb, sleep } from "../db/realtime_db";
5
+ // ── Context ───────────────────────────────────────────────────────────────────
6
+ export { TxContext, DbReader, DbWriter } from "../db/context";
7
+ export { DbReader as ReadContext, DbWriter as WritableContext } from "../db/context";
8
+ // ── Schema ────────────────────────────────────────────────────────────────────
9
+ export { defineSchema, defineComputedField } from "../db/schema";
10
+ export { matchesPredicate } from "../db/query";
11
+ export * from "../db/types_db";
12
+ export { NO_RETRY, DEFAULT_RETRY, OccConflictError, OccAbortError, } from "../db/types_db";
13
+ // ── Router types (client-safe, no getContextRegistry) ─────────────────────────
14
+ export { createQueryBuilder, createMutationBuilder, createActionBuilder, } from "../router/procedure";
15
+ export { router, } from "../router/router";
16
+ // ── Client ────────────────────────────────────────────────────────────────────
17
+ export { WsClientManager, RPCError, } from "./ws_client_manager";
18
+ export { createClient, } from "./client";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AASvE,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEtD,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,eAAe,CAAC;AAErF,iFAAiF;AACjF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAoBjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GAiBpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,GASP,MAAM,kBAAkB,CAAC;AAE1B,iFAAiF;AACjF,OAAO,EACL,eAAe,EACf,QAAQ,GAIT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,GAQb,MAAM,UAAU,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Compute a compact local key for a `(procedure, input)` pair.
3
+ *
4
+ * Output shape: `procedureName#16-hex-chars`.
5
+ *
6
+ * - `procedureName#` prefix keeps DevTools / log output legible.
7
+ * - 16 hex chars = 64 bits of SHA-1. Collision probability over N concurrent
8
+ * subscriptions is ~ N²/2⁶⁵ — comfortable up to ~10k subs per session.
9
+ *
10
+ * Async because `hash-wasm` lazily inits the wasm module on first call; the
11
+ * cost is paid once per process. Subsequent calls are effectively free.
12
+ */
13
+ export declare function computeLocalSubKey(procedure: string, input: string): Promise<string>;
14
+ /**
15
+ * Trigger the one-time `hash-wasm` init off the critical path so the first
16
+ * real `subscribe` doesn't pay the ~5–10ms wasm-bootstrap cost. Safe to call
17
+ * any number of times; resolves once the module is ready.
18
+ */
19
+ export declare function prewarmHasher(): Promise<unknown>;
20
+ //# sourceMappingURL=sub_key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub_key.d.ts","sourceRoot":"","sources":["../../../src/client/sub_key.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEhD"}
@@ -0,0 +1,37 @@
1
+ // Compact, client-side local key for subscription dedup.
2
+ //
3
+ // Lives in its own file so the `hash-wasm` import is reachable only by the
4
+ // transport layer that needs it (`ws_client_manager`) — bundlers that
5
+ // tree-shake `@supalive/core/client` can drop wasm if a consumer never
6
+ // touches subscriptions.
7
+ //
8
+ // The key is local to this client process: the server uses its own canonical
9
+ // subId (computed with `queryIdentity` applied) and ships it back on the
10
+ // subscribe response. We only need a fixed-size handle for in-process dedup
11
+ // and for storing on the Subscription record.
12
+ import { sha1 } from "hash-wasm";
13
+ /**
14
+ * Compute a compact local key for a `(procedure, input)` pair.
15
+ *
16
+ * Output shape: `procedureName#16-hex-chars`.
17
+ *
18
+ * - `procedureName#` prefix keeps DevTools / log output legible.
19
+ * - 16 hex chars = 64 bits of SHA-1. Collision probability over N concurrent
20
+ * subscriptions is ~ N²/2⁶⁵ — comfortable up to ~10k subs per session.
21
+ *
22
+ * Async because `hash-wasm` lazily inits the wasm module on first call; the
23
+ * cost is paid once per process. Subsequent calls are effectively free.
24
+ */
25
+ export async function computeLocalSubKey(procedure, input) {
26
+ const hex = await sha1(`${procedure}::${input}`);
27
+ return `${procedure}#${hex.slice(0, 16)}`;
28
+ }
29
+ /**
30
+ * Trigger the one-time `hash-wasm` init off the critical path so the first
31
+ * real `subscribe` doesn't pay the ~5–10ms wasm-bootstrap cost. Safe to call
32
+ * any number of times; resolves once the module is ready.
33
+ */
34
+ export function prewarmHasher() {
35
+ return sha1("");
36
+ }
37
+ //# sourceMappingURL=sub_key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub_key.js","sourceRoot":"","sources":["../../../src/client/sub_key.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,2EAA2E;AAC3E,sEAAsE;AACtE,uEAAuE;AACvE,yBAAyB;AACzB,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,8CAA8C;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAa;IACvE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,268 @@
1
+ type WSEventHandler<E> = ((event: E) => void) | null;
2
+ export interface WSLike {
3
+ readyState: number;
4
+ send(data: string): void;
5
+ close(code?: number, reason?: string): void;
6
+ onopen: WSEventHandler<unknown>;
7
+ onmessage: WSEventHandler<{
8
+ data: string | {
9
+ toString(): string;
10
+ };
11
+ }>;
12
+ onclose: WSEventHandler<unknown>;
13
+ onerror: WSEventHandler<unknown>;
14
+ }
15
+ export interface WSConstructor {
16
+ new (url: string): WSLike;
17
+ }
18
+ export declare class RPCError extends Error {
19
+ code?: string;
20
+ constructor(message: string, code?: string);
21
+ }
22
+ export interface HeartbeatOptions {
23
+ /**
24
+ * Close + reconnect when no server message arrives for this long. The
25
+ * server emits `{type:"ping"}` every ~15s of channel idle, so anything
26
+ * larger than ~30s leaves comfortable headroom. Default 60_000.
27
+ */
28
+ serverInactivityMs?: number;
29
+ }
30
+ export interface SendThrottleOptions {
31
+ /** Yield the event loop every N `call()` invocations. 0 disables. Default 100. */
32
+ everyN?: number;
33
+ /** Length of the yield in ms. Default 10. */
34
+ delayMs?: number;
35
+ }
36
+ export interface WSClientOptions {
37
+ /** WebSocket URL (e.g. ws://localhost:3000/ws) */
38
+ url: string;
39
+ /** Auth token to send after connection */
40
+ token?: () => Promise<string | undefined>;
41
+ /** Optional: reconnection timeout in ms (default: 180000 = 3 minutes) */
42
+ reconnectionTimeout?: number;
43
+ /** Reconnection options */
44
+ reconnect?: {
45
+ /** Enable automatic reconnection (default: true) */
46
+ enabled?: boolean;
47
+ /** Max reconnection attempts (default: 5) */
48
+ maxAttempts?: number;
49
+ /** Delay between attempts in ms (default: 1000) */
50
+ delay?: number;
51
+ /** Exponential backoff multiplier (default: 1.5) */
52
+ backoff?: number;
53
+ };
54
+ /** Server-inactivity watchdog. See {@link HeartbeatOptions.serverInactivityMs}. */
55
+ heartbeat?: HeartbeatOptions;
56
+ /**
57
+ * Yields the event loop for `delayMs` ms after every `everyN`
58
+ * `call()` invocations. Useful for keeping React renders / GC tasks
59
+ * scheduled during long synchronous bursts of mutations/actions; the
60
+ * heartbeat does not depend on this (the server drives it).
61
+ * Default `{ everyN: 100, delayMs: 10 }`. Set `everyN: 0` to disable.
62
+ */
63
+ throttle?: SendThrottleOptions;
64
+ /** Called when connection is established */
65
+ onConnect?: () => void;
66
+ /** Called when connection is lost */
67
+ onDisconnect?: () => void;
68
+ /** Called on connection error */
69
+ onError?: (error: Error) => void;
70
+ }
71
+ /**
72
+ * Public state of the client, surfaced to consumers (React provider, etc.).
73
+ * - "connecting" — initial connect or reconnect handshake in flight
74
+ * - "authenticating" — connected, waiting for auth result
75
+ * - "ready" — connected and auth resolved (authenticated, anonymous, or
76
+ * explicitly failed — i.e. ready to send calls)
77
+ * - "disconnected" — currently offline (may auto-retry)
78
+ */
79
+ export type ClientPublicState = "disconnected" | "connecting" | "authenticating" | "ready";
80
+ export declare class WsClientManager {
81
+ private ws;
82
+ private options;
83
+ private lastSuccessfulConnectionTime;
84
+ private reconnectionTimeout;
85
+ private requestId;
86
+ private pendingRequests;
87
+ /**
88
+ * Single source of truth for live subscriptions.
89
+ *
90
+ * Keying:
91
+ * - In-flight subscribe (no subId yet): `_pending:<requestId>`.
92
+ * - Established: the server-returned canonical `subId`.
93
+ *
94
+ * Routing `sub:update` / `sub:gone` is O(1) (`get(subId)`). Subscribe-time
95
+ * dedup scans `values()` for a matching `localKey` (O(N)), which is cheap
96
+ * since subscribes happen on component mounts, not in the hot path.
97
+ */
98
+ private subscriptions;
99
+ private queuedCalls;
100
+ private reconnectAttempts;
101
+ private reconnectTimer;
102
+ private connectionState;
103
+ private authState;
104
+ /**
105
+ * Authenticated user id from `auth:success`. Distinct from `queryIdentity`
106
+ * (server-side cache/sub segmentation key); this is just "who am I logged
107
+ * in as" for app display purposes. Null while unauthenticated / anonymous.
108
+ */
109
+ private authUserId;
110
+ private explicitlyClosed;
111
+ private stateListeners;
112
+ private lastPublicState;
113
+ private serverInactivityMs;
114
+ private lastServerMessageAt;
115
+ private inactivityTimer;
116
+ private pendingConnectResolve;
117
+ private pendingConnectReject;
118
+ private throttleEveryN;
119
+ private throttleDelayMs;
120
+ private throttleCounter;
121
+ private throttling;
122
+ private visibilityListener;
123
+ private onlineListener;
124
+ constructor(options: WSClientOptions);
125
+ /**
126
+ * Subscribe to client state transitions. Returns an unsubscribe fn.
127
+ * The listener is called immediately with the current state.
128
+ */
129
+ onState(listener: (s: ClientPublicState) => void): () => void;
130
+ /** Current public state. */
131
+ getPublicState(): ClientPublicState;
132
+ /**
133
+ * Connect to the WebSocket server.
134
+ * Returns a promise that resolves when connected and authenticated.
135
+ */
136
+ connect(): Promise<void>;
137
+ /**
138
+ * Disconnect from the server.
139
+ */
140
+ disconnect(): void;
141
+ /**
142
+ * Check if connected and authenticated.
143
+ */
144
+ isReady(): boolean;
145
+ /**
146
+ * Check if authenticated.
147
+ */
148
+ isAuthenticated(): boolean;
149
+ /**
150
+ * Check if anonymouse.
151
+ */
152
+ isAnonymouse(): boolean;
153
+ /**
154
+ * The authenticated user's id (from `auth:success`), or null when
155
+ * unauthenticated / anonymous. Useful for "Logged in as …" display.
156
+ *
157
+ * Not to be confused with server-side `queryIdentity`, which is the
158
+ * cache/subscription segmentation key (resolved entirely on the server).
159
+ */
160
+ getAuthUserId(): string | null;
161
+ /**
162
+ * Call a procedure (query, mutation, or action).
163
+ *
164
+ * If the client is not ready (disconnected or still authenticating), the
165
+ * call is FIFO-queued and dispatched on the next ready state. The promise
166
+ * still resolves with the eventual server response.
167
+ *
168
+ * Pass `onSend` to be notified when the call actually leaves the queue
169
+ * (used by `useMutation` to flip `state` from "queued" → "loading").
170
+ */
171
+ call(procedure: string, input: unknown, options?: {
172
+ onSend?: () => void;
173
+ }): Promise<unknown>;
174
+ /**
175
+ * Throttle drain loop. Each iteration: sleep `throttleDelayMs`, then
176
+ * dispatch up to `throttleEveryN` queued items. Exits as soon as the
177
+ * queue drains inside a single batch (burst over, back to direct
178
+ * dispatch on the next `call()`) or the connection goes away
179
+ * (reconnect path will restart us via `flushQueuedCalls`).
180
+ */
181
+ private runThrottleLoop;
182
+ /**
183
+ * Issue the call against an established connection. Caller must ensure
184
+ * `isReady()` before invoking.
185
+ */
186
+ private dispatchCall;
187
+ /**
188
+ * Flush queued calls in FIFO order. Called once `isReady()` becomes
189
+ * true. With the throttle enabled, dispatch the first batch
190
+ * synchronously then hand off to the drain loop so a large
191
+ * post-reconnect flush respects backpressure instead of dumping 10k
192
+ * frames in one tick.
193
+ */
194
+ private flushQueuedCalls;
195
+ /**
196
+ * Re-send `subscribe` for every existing subscription. The subId for each
197
+ * may legitimately change (e.g. `queryIdentity` was a function of user
198
+ * identity and the user changed during the disconnect), so we re-key the
199
+ * unified `subscriptions` Map: snapshot every record, drop them from the
200
+ * Map, then reinsert under a fresh `_pending:<reqId>` key. Each pending
201
+ * request's `resolve` rekeys the parked record under the new server-issued
202
+ * subId so subsequent `sub:update` frames route to the existing
203
+ * `onUpdate` callback (which the React handle is still holding).
204
+ */
205
+ private resubscribeAll;
206
+ /**
207
+ * Subscribe to a live query.
208
+ *
209
+ * The client does not compute the subId locally — it sends the
210
+ * (procedure, input) pair and receives the canonical subId on the
211
+ * subscribe response. This lets the server's per-procedure
212
+ * `queryIdentity` override be authoritative without forcing the client
213
+ * to mirror any of the resolution logic.
214
+ *
215
+ * Returns the server-assigned subId and an unsubscribe function.
216
+ */
217
+ subscribe(procedure: string, input: unknown, serializedInput: string, onUpdate: (data: unknown) => void, onGone?: (reason: string | undefined) => void): Promise<{
218
+ subId: string;
219
+ unsubscribe: () => void;
220
+ }>;
221
+ private findSubByLocalKey;
222
+ /** Resolve every joiner waiting on this Subscription with the canonical subId. */
223
+ private resolveJoiners;
224
+ /** Reject every joiner waiting on this Subscription with the given error. */
225
+ private rejectJoiners;
226
+ private unsubscribeByLocalKey;
227
+ private handleMessage;
228
+ /**
229
+ * Called once the client transitions to a "ready" state on a fresh
230
+ * connection. Replays live-query subscriptions and flushes any queued
231
+ * calls in FIFO order.
232
+ */
233
+ private afterReady;
234
+ private handleResponse;
235
+ private handleSubscriptionUpdate;
236
+ /**
237
+ * Handles a `sub:gone` message: the server no longer tracks this
238
+ * subscription (e.g. it was fully unregistered while we were disconnected
239
+ * from the sub-manager). Notify the handle and drop the local entry so a
240
+ * re-subscribe is required to receive further updates.
241
+ */
242
+ private handleSubscriptionGone;
243
+ private handleClose;
244
+ private handleError;
245
+ private startInactivityWatchdog;
246
+ private stopInactivityWatchdog;
247
+ /**
248
+ * Close the current WebSocket and schedule a reconnect via `handleClose`.
249
+ *
250
+ * Atomically swaps the old socket's event handlers to no-ops BEFORE
251
+ * `close()` so a frame in flight at the moment of close cannot fire
252
+ * `handleMessage` into a half-cleaned state — that was the source of
253
+ * the "browser says socket is alive but client says disconnected" race.
254
+ */
255
+ private closeAndReconnect;
256
+ private installEnvironmentListeners;
257
+ private removeEnvironmentListeners;
258
+ private scheduleReconnect;
259
+ private computePublicState;
260
+ private emitState;
261
+ private ensureConnected;
262
+ private send;
263
+ private cleanup;
264
+ private generateRequestId;
265
+ }
266
+ declare function getWebSocket(): Promise<WSConstructor>;
267
+ export { getWebSocket };
268
+ //# sourceMappingURL=ws_client_manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws_client_manager.d.ts","sourceRoot":"","sources":["../../../src/client/ws_client_manager.ts"],"names":[],"mappings":"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"}