@supalive/core 0.1.4 → 0.1.5
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 +17 -2
- package/dist/helper-CiacMqje.d.ts +14 -0
- package/dist/helper-CiacMqje.d.ts.map +1 -0
- package/dist/helper-zdJT5FUc.js +58 -0
- package/dist/helper-zdJT5FUc.js.map +1 -0
- package/dist/index-CTyXKcq_.d.ts +1736 -0
- package/dist/index-CTyXKcq_.d.ts.map +1 -0
- package/dist/mysql-C8SN443m.d.ts +104 -0
- package/dist/mysql-C8SN443m.d.ts.map +1 -0
- package/dist/mysql-DELSRrpY.js +569 -0
- package/dist/mysql-DELSRrpY.js.map +1 -0
- package/dist/overlap-checker-CVkbbuEQ.js +187 -0
- package/dist/overlap-checker-CVkbbuEQ.js.map +1 -0
- package/dist/postgres-DE-XyNAQ.js +823 -0
- package/dist/postgres-DE-XyNAQ.js.map +1 -0
- package/dist/postgres-D_gwCHx-.d.ts +108 -0
- package/dist/postgres-D_gwCHx-.d.ts.map +1 -0
- package/dist/query-CbQLjeME.js +713 -0
- package/dist/query-CbQLjeME.js.map +1 -0
- package/dist/realtime_db-D9p2X2PH.js +246 -0
- package/dist/realtime_db-D9p2X2PH.js.map +1 -0
- package/dist/router-DlTYWpop.js +81 -0
- package/dist/router-DlTYWpop.js.map +1 -0
- package/dist/schema-SKcIWHfo.js +167 -0
- package/dist/schema-SKcIWHfo.js.map +1 -0
- package/dist/src/client/index.d.ts +2 -17
- package/dist/src/client/index.js +1151 -18
- package/dist/src/client/index.js.map +1 -1
- package/dist/src/exports/mysql.d.ts +2 -2
- package/dist/src/exports/mysql.js +2 -2
- package/dist/src/exports/postgres.d.ts +2 -2
- package/dist/src/exports/postgres.js +2 -2
- package/dist/src/exports/procedure.d.ts +3 -5
- package/dist/src/exports/procedure.js +5 -5
- package/dist/src/exports/server.d.ts +368 -2
- package/dist/src/exports/server.d.ts.map +1 -1
- package/dist/src/exports/server.js +1346 -2
- package/dist/src/exports/server.js.map +1 -1
- package/dist/src/exports/subscription-manager-worker-entry.d.ts +1 -0
- package/dist/src/exports/subscription-manager-worker-entry.js +115 -0
- package/dist/src/exports/subscription-manager-worker-entry.js.map +1 -0
- package/dist/src/exports/types.d.ts +4 -6
- package/dist/src/exports/types.js +5 -6
- package/dist/subscription-worker-BurdPO8d.js +511 -0
- package/dist/subscription-worker-BurdPO8d.js.map +1 -0
- package/dist/types_client_rpc-CIsjQQGG.js +105 -0
- package/dist/types_client_rpc-CIsjQQGG.js.map +1 -0
- package/dist/types_db-Ctf-ksoy.js +168 -0
- package/dist/types_db-Ctf-ksoy.js.map +1 -0
- package/dist/types_server-Ch56y8L3.d.ts +216 -0
- package/dist/types_server-Ch56y8L3.d.ts.map +1 -0
- package/dist/types_server-Dk6o_B7N.js +24 -0
- package/dist/types_server-Dk6o_B7N.js.map +1 -0
- package/package.json +3 -3
- package/dist/src/client/caller_client.d.ts +0 -42
- package/dist/src/client/caller_client.d.ts.map +0 -1
- package/dist/src/client/caller_client.js +0 -77
- package/dist/src/client/caller_client.js.map +0 -1
- package/dist/src/client/client.d.ts +0 -149
- package/dist/src/client/client.d.ts.map +0 -1
- package/dist/src/client/client.js +0 -308
- package/dist/src/client/client.js.map +0 -1
- package/dist/src/client/index.d.ts.map +0 -1
- package/dist/src/client/sub_key.d.ts +0 -20
- package/dist/src/client/sub_key.d.ts.map +0 -1
- package/dist/src/client/sub_key.js +0 -37
- package/dist/src/client/sub_key.js.map +0 -1
- package/dist/src/client/ws_client_manager.d.ts +0 -268
- package/dist/src/client/ws_client_manager.d.ts.map +0 -1
- package/dist/src/client/ws_client_manager.js +0 -1013
- package/dist/src/client/ws_client_manager.js.map +0 -1
- package/dist/src/config.d.ts +0 -117
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js +0 -2
- package/dist/src/config.js.map +0 -1
- package/dist/src/db/bytes.d.ts +0 -4
- package/dist/src/db/bytes.d.ts.map +0 -1
- package/dist/src/db/bytes.js +0 -24
- package/dist/src/db/bytes.js.map +0 -1
- package/dist/src/db/cache.d.ts +0 -30
- package/dist/src/db/cache.d.ts.map +0 -1
- package/dist/src/db/cache.js +0 -153
- package/dist/src/db/cache.js.map +0 -1
- package/dist/src/db/codec.d.ts +0 -10
- package/dist/src/db/codec.d.ts.map +0 -1
- package/dist/src/db/codec.js +0 -73
- package/dist/src/db/codec.js.map +0 -1
- package/dist/src/db/context.d.ts +0 -28
- package/dist/src/db/context.d.ts.map +0 -1
- package/dist/src/db/context.js +0 -147
- package/dist/src/db/context.js.map +0 -1
- package/dist/src/db/db.d.ts +0 -154
- package/dist/src/db/db.d.ts.map +0 -1
- package/dist/src/db/db.js +0 -23
- package/dist/src/db/db.js.map +0 -1
- package/dist/src/db/mysql.d.ts +0 -120
- package/dist/src/db/mysql.d.ts.map +0 -1
- package/dist/src/db/mysql.js +0 -708
- package/dist/src/db/mysql.js.map +0 -1
- package/dist/src/db/postgres.d.ts +0 -116
- package/dist/src/db/postgres.d.ts.map +0 -1
- package/dist/src/db/postgres.js +0 -998
- package/dist/src/db/postgres.js.map +0 -1
- package/dist/src/db/query.d.ts +0 -174
- package/dist/src/db/query.d.ts.map +0 -1
- package/dist/src/db/query.js +0 -790
- package/dist/src/db/query.js.map +0 -1
- package/dist/src/db/query_definition.d.ts +0 -54
- package/dist/src/db/query_definition.d.ts.map +0 -1
- package/dist/src/db/query_definition.js +0 -47
- package/dist/src/db/query_definition.js.map +0 -1
- package/dist/src/db/realtime_db.d.ts +0 -19
- package/dist/src/db/realtime_db.d.ts.map +0 -1
- package/dist/src/db/realtime_db.js +0 -98
- package/dist/src/db/realtime_db.js.map +0 -1
- package/dist/src/db/schema.d.ts +0 -110
- package/dist/src/db/schema.d.ts.map +0 -1
- package/dist/src/db/schema.js +0 -47
- package/dist/src/db/schema.js.map +0 -1
- package/dist/src/db/types_client_rpc.d.ts +0 -157
- package/dist/src/db/types_client_rpc.d.ts.map +0 -1
- package/dist/src/db/types_client_rpc.js +0 -106
- package/dist/src/db/types_client_rpc.js.map +0 -1
- package/dist/src/db/types_db.d.ts +0 -236
- package/dist/src/db/types_db.d.ts.map +0 -1
- package/dist/src/db/types_db.js +0 -188
- package/dist/src/db/types_db.js.map +0 -1
- package/dist/src/exports/mysql.d.ts.map +0 -1
- package/dist/src/exports/mysql.js.map +0 -1
- package/dist/src/exports/postgres.d.ts.map +0 -1
- package/dist/src/exports/postgres.js.map +0 -1
- package/dist/src/exports/procedure.d.ts.map +0 -1
- package/dist/src/exports/procedure.js.map +0 -1
- package/dist/src/exports/types.d.ts.map +0 -1
- package/dist/src/exports/types.js.map +0 -1
- package/dist/src/helper.d.ts +0 -11
- package/dist/src/helper.d.ts.map +0 -1
- package/dist/src/helper.js +0 -45
- package/dist/src/helper.js.map +0 -1
- package/dist/src/logger.d.ts +0 -7
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -47
- package/dist/src/logger.js.map +0 -1
- package/dist/src/router/index.d.ts +0 -4
- package/dist/src/router/index.d.ts.map +0 -1
- package/dist/src/router/index.js +0 -4
- package/dist/src/router/index.js.map +0 -1
- package/dist/src/router/procedure.d.ts +0 -204
- package/dist/src/router/procedure.d.ts.map +0 -1
- package/dist/src/router/procedure.js +0 -122
- package/dist/src/router/procedure.js.map +0 -1
- package/dist/src/router/router.d.ts +0 -88
- package/dist/src/router/router.d.ts.map +0 -1
- package/dist/src/router/router.js +0 -88
- package/dist/src/router/router.js.map +0 -1
- package/dist/src/server/hash.d.ts +0 -12
- package/dist/src/server/hash.d.ts.map +0 -1
- package/dist/src/server/hash.js +0 -20
- package/dist/src/server/hash.js.map +0 -1
- package/dist/src/server/hash.test.d.ts +0 -2
- package/dist/src/server/hash.test.d.ts.map +0 -1
- package/dist/src/server/hash.test.js +0 -43
- package/dist/src/server/hash.test.js.map +0 -1
- package/dist/src/server/index.d.ts +0 -9
- package/dist/src/server/index.d.ts.map +0 -1
- package/dist/src/server/index.js +0 -8
- package/dist/src/server/index.js.map +0 -1
- package/dist/src/server/overlap-checker.d.ts +0 -18
- package/dist/src/server/overlap-checker.d.ts.map +0 -1
- package/dist/src/server/overlap-checker.js +0 -247
- package/dist/src/server/overlap-checker.js.map +0 -1
- package/dist/src/server/sub_hash.d.ts +0 -23
- package/dist/src/server/sub_hash.d.ts.map +0 -1
- package/dist/src/server/sub_hash.js +0 -38
- package/dist/src/server/sub_hash.js.map +0 -1
- package/dist/src/server/subscription-manager-client.d.ts +0 -120
- package/dist/src/server/subscription-manager-client.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-client.js +0 -207
- package/dist/src/server/subscription-manager-client.js.map +0 -1
- package/dist/src/server/subscription-manager-types.d.ts +0 -168
- package/dist/src/server/subscription-manager-types.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-types.js +0 -94
- package/dist/src/server/subscription-manager-types.js.map +0 -1
- package/dist/src/server/subscription-manager-worker-entry.d.ts +0 -2
- package/dist/src/server/subscription-manager-worker-entry.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-worker-entry.js +0 -127
- package/dist/src/server/subscription-manager-worker-entry.js.map +0 -1
- package/dist/src/server/subscription-manager-worker-protocol.d.ts +0 -40
- package/dist/src/server/subscription-manager-worker-protocol.d.ts.map +0 -1
- package/dist/src/server/subscription-manager-worker-protocol.js +0 -20
- package/dist/src/server/subscription-manager-worker-protocol.js.map +0 -1
- package/dist/src/server/subscription-manager.d.ts +0 -32
- package/dist/src/server/subscription-manager.d.ts.map +0 -1
- package/dist/src/server/subscription-manager.js +0 -249
- package/dist/src/server/subscription-manager.js.map +0 -1
- package/dist/src/server/subscription-manager.test.d.ts +0 -2
- package/dist/src/server/subscription-manager.test.d.ts.map +0 -1
- package/dist/src/server/subscription-manager.test.js +0 -610
- package/dist/src/server/subscription-manager.test.js.map +0 -1
- package/dist/src/server/subscription-worker.d.ts +0 -32
- package/dist/src/server/subscription-worker.d.ts.map +0 -1
- package/dist/src/server/subscription-worker.js +0 -190
- package/dist/src/server/subscription-worker.js.map +0 -1
- package/dist/src/server/supalive-server.d.ts +0 -158
- package/dist/src/server/supalive-server.d.ts.map +0 -1
- package/dist/src/server/supalive-server.js +0 -1048
- package/dist/src/server/supalive-server.js.map +0 -1
- package/dist/src/server/types_server.d.ts +0 -96
- package/dist/src/server/types_server.d.ts.map +0 -1
- package/dist/src/server/types_server.js +0 -36
- package/dist/src/server/types_server.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { getContextRegistry } from "../router/router";
|
|
2
|
-
/**
|
|
3
|
-
* Create a server-side caller that bypasses HTTP/WebSocket.
|
|
4
|
-
*
|
|
5
|
-
* For in-memory calls, input validation is skipped (data is already a JS object).
|
|
6
|
-
* Query procedures also get a liveQuery() method for server-side use.
|
|
7
|
-
*/
|
|
8
|
-
export function createCaller(options) {
|
|
9
|
-
const { db, context = {}, isInternal = true, inContext } = options;
|
|
10
|
-
const registry = getContextRegistry(inContext ?? "default");
|
|
11
|
-
return new Proxy({}, {
|
|
12
|
-
get(_target, procedureName) {
|
|
13
|
-
if (typeof procedureName !== "string") {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
const procedure = registry.getProcedure(procedureName);
|
|
17
|
-
if (!procedure) {
|
|
18
|
-
throw new Error(`Procedure "${procedureName}" not found`);
|
|
19
|
-
}
|
|
20
|
-
if (registry.isInternalProcedure(procedureName) && !isInternal) {
|
|
21
|
-
throw new Error(`Procedure "${procedureName}" is internal only`);
|
|
22
|
-
}
|
|
23
|
-
// Helper to validate input only if it's a string (serialized data)
|
|
24
|
-
// For in-memory calls, skip validation for performance
|
|
25
|
-
const validateInput = (input) => {
|
|
26
|
-
// Skip validation for non-string inputs (already objects)
|
|
27
|
-
if (typeof input !== "string") {
|
|
28
|
-
return input;
|
|
29
|
-
}
|
|
30
|
-
// Only parse if it's a string (e.g., from HTTP body)
|
|
31
|
-
return procedure.inputSchema.parse(input);
|
|
32
|
-
};
|
|
33
|
-
return {
|
|
34
|
-
query: async (input) => {
|
|
35
|
-
if (procedure.type !== "query") {
|
|
36
|
-
throw new Error(`Procedure "${procedureName}" is not a query`);
|
|
37
|
-
}
|
|
38
|
-
const validatedInput = validateInput(input);
|
|
39
|
-
return db.query(async (dbCtx) => {
|
|
40
|
-
const ctx = { db: dbCtx, serverCtx: context };
|
|
41
|
-
return procedure.fn(ctx, validatedInput);
|
|
42
|
-
});
|
|
43
|
-
},
|
|
44
|
-
mutate: async (input) => {
|
|
45
|
-
if (procedure.type !== "mutation") {
|
|
46
|
-
throw new Error(`Procedure "${procedureName}" is not a mutation`);
|
|
47
|
-
}
|
|
48
|
-
const validatedInput = validateInput(input);
|
|
49
|
-
const res = await db.mutation(async (dbCtx) => {
|
|
50
|
-
const ctx = { db: dbCtx, serverCtx: context };
|
|
51
|
-
return procedure.fn(ctx, validatedInput);
|
|
52
|
-
});
|
|
53
|
-
return res.result;
|
|
54
|
-
},
|
|
55
|
-
action: async (input) => {
|
|
56
|
-
if (procedure.type !== "action") {
|
|
57
|
-
throw new Error(`Procedure "${procedureName}" is not an action`);
|
|
58
|
-
}
|
|
59
|
-
const validatedInput = validateInput(input);
|
|
60
|
-
const ctx = { db, serverCtx: context };
|
|
61
|
-
return procedure.fn(ctx, validatedInput);
|
|
62
|
-
},
|
|
63
|
-
// Query procedures can use liveQuery() for server-side use
|
|
64
|
-
liveQuery: procedure.type === "query"
|
|
65
|
-
? async (input) => {
|
|
66
|
-
const validatedInput = validateInput(input);
|
|
67
|
-
return db.liveQuery(async (dbCtx) => {
|
|
68
|
-
const ctx = { db: dbCtx, serverCtx: context };
|
|
69
|
-
return procedure.fn(ctx, validatedInput);
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
: undefined,
|
|
73
|
-
};
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=caller_client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caller_client.js","sourceRoot":"","sources":["../../../src/client/caller_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import type { AnyProcedure } from "../router/procedure";
|
|
2
|
-
import type { Router } from "../router/router";
|
|
3
|
-
import { type WSClientOptions, type ClientPublicState } from "./ws_client_manager";
|
|
4
|
-
import { IsInternal } from "../db/types_client_rpc";
|
|
5
|
-
import { InputOf, OutputOf } from "../router/procedure";
|
|
6
|
-
export type { ClientPublicState } from "./ws_client_manager";
|
|
7
|
-
export { RPCError } from "./ws_client_manager";
|
|
8
|
-
export interface AuthInfo {
|
|
9
|
-
token: string | null;
|
|
10
|
-
userId: string | null;
|
|
11
|
-
}
|
|
12
|
-
export interface ClientOptions {
|
|
13
|
-
/** WebSocket URL (e.g. ws://localhost:3000/ws) */
|
|
14
|
-
url: string;
|
|
15
|
-
/** Auth Info callback */
|
|
16
|
-
token?: () => Promise<string>;
|
|
17
|
-
/** Optional: reconnection timeout in ms (default: 180000 = 3 minutes) */
|
|
18
|
-
reconnectionTimeout?: number;
|
|
19
|
-
/** Reconnection options */
|
|
20
|
-
reconnect?: WSClientOptions["reconnect"];
|
|
21
|
-
/**
|
|
22
|
-
* Inactivity watchdog. The client never sends a ping itself; the server
|
|
23
|
-
* emits `{type:"ping"}` while idle and we close+reconnect if no inbound
|
|
24
|
-
* message arrives within `serverInactivityMs` (default 60s).
|
|
25
|
-
*/
|
|
26
|
-
heartbeat?: WSClientOptions["heartbeat"];
|
|
27
|
-
/**
|
|
28
|
-
* Yields the event loop for `delayMs` after every `everyN` `call()`
|
|
29
|
-
* invocations. Useful for keeping React renders / GC tasks scheduled
|
|
30
|
-
* during long synchronous bursts; not load-bearing for the heartbeat.
|
|
31
|
-
* Default `{ everyN: 100, delayMs: 10 }`. Set `everyN: 0` to disable.
|
|
32
|
-
*/
|
|
33
|
-
throttle?: WSClientOptions["throttle"];
|
|
34
|
-
onConnect?: () => void;
|
|
35
|
-
onDisConnect?: () => void;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Public state of a live query subscription, exposed via `getState()` and
|
|
39
|
-
* `onState()` on the handle so React (or any UI) can render a consistent
|
|
40
|
-
* snapshot via `useSyncExternalStore`.
|
|
41
|
-
*
|
|
42
|
-
* - "connecting" — initial subscribe in flight
|
|
43
|
-
* - "success" — subscribed, last server data is in `data`
|
|
44
|
-
* - "stale" — was successful, transport dropped; keeping last `data`
|
|
45
|
-
* until the resubscribe completes
|
|
46
|
-
* - "loading" — `refetch()` triggered an explicit re-subscribe
|
|
47
|
-
* - "error" — subscribe failed or server sent `sub:gone`
|
|
48
|
-
*/
|
|
49
|
-
export type LiveQueryStatus = "connecting" | "success" | "stale" | "loading" | "error";
|
|
50
|
-
export interface LiveQueryState<T> {
|
|
51
|
-
data: T | undefined;
|
|
52
|
-
status: LiveQueryStatus;
|
|
53
|
-
error: Error | null;
|
|
54
|
-
}
|
|
55
|
-
export interface LiveQueryHandle<T> {
|
|
56
|
-
/** Get current cached data (legacy convenience getter). */
|
|
57
|
-
get(): T | undefined;
|
|
58
|
-
/** Snapshot of `{ data, status, error }`. Stable between updates. */
|
|
59
|
-
getState(): LiveQueryState<T>;
|
|
60
|
-
/**
|
|
61
|
-
* Listen for state changes (data, status or error). Returns an
|
|
62
|
-
* unsubscribe function that removes only this listener — the underlying
|
|
63
|
-
* server subscription stays alive as long as any listener is attached.
|
|
64
|
-
*
|
|
65
|
-
* Suitable for `useSyncExternalStore`.
|
|
66
|
-
*/
|
|
67
|
-
onState(listener: () => void): () => void;
|
|
68
|
-
/** Listen for data-only changes. Returns listener-removal fn. */
|
|
69
|
-
onData(callback: (data: T) => void): () => void;
|
|
70
|
-
/** Force a re-subscribe round-trip. */
|
|
71
|
-
refetch(): void;
|
|
72
|
-
/** Unsubscribe from the server (drops listeners too). */
|
|
73
|
-
unsubscribe(): void;
|
|
74
|
-
}
|
|
75
|
-
export interface RPCSuccessResponse<TResult> {
|
|
76
|
-
success: true;
|
|
77
|
-
data: TResult;
|
|
78
|
-
}
|
|
79
|
-
export interface RPCErrorResponse {
|
|
80
|
-
success: false;
|
|
81
|
-
error: string;
|
|
82
|
-
code: string;
|
|
83
|
-
}
|
|
84
|
-
export type RPCResponse<TResult> = RPCSuccessResponse<TResult> | RPCErrorResponse;
|
|
85
|
-
/**
|
|
86
|
-
* Create a fully typed RPC client with WebSocket transport.
|
|
87
|
-
*/
|
|
88
|
-
export declare function createClient<AppRouter extends Router<Record<string, AnyProcedure<TContext>>, TContext>, TContext = unknown, TProcedures extends Record<string, AnyProcedure<TContext>> = AppRouter["procedures"]>(options: ClientOptions): ClientFromProcedures<TProcedures, TContext> & WSClientMethods;
|
|
89
|
-
/**
|
|
90
|
-
* WebSocket client methods.
|
|
91
|
-
*/
|
|
92
|
-
export interface WSClientMethods {
|
|
93
|
-
/** Connect to the WebSocket server */
|
|
94
|
-
connect(): Promise<void>;
|
|
95
|
-
/** Disconnect from the server */
|
|
96
|
-
disconnect(): void;
|
|
97
|
-
/** Check if connected and authenticated */
|
|
98
|
-
isReady(): boolean;
|
|
99
|
-
/** Check if authenticated */
|
|
100
|
-
isAuthenticated(): boolean;
|
|
101
|
-
/** Check if anonymouse */
|
|
102
|
-
isAnonymouse(): boolean;
|
|
103
|
-
/**
|
|
104
|
-
* The authenticated user id reported by the server on `auth:success`, or
|
|
105
|
-
* null when anonymous/unauthenticated. This is the auth-tier identity,
|
|
106
|
-
* NOT the server-side `queryIdentity` (which is the cache/subscription
|
|
107
|
-
* segmentation key and is not exposed to the client).
|
|
108
|
-
*/
|
|
109
|
-
getAuthUserId(): string | null;
|
|
110
|
-
/** Subscribe to client connection state transitions. Returns unsubscribe fn. */
|
|
111
|
-
onState(listener: (s: ClientPublicState) => void): () => void;
|
|
112
|
-
/** Snapshot of the current public state. */
|
|
113
|
-
getPublicState(): ClientPublicState;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Client type from procedures.
|
|
117
|
-
* Filters internal procedures and creates appropriate methods.
|
|
118
|
-
* Query procedures get an additional liveQuery() method for real-time subscriptions.
|
|
119
|
-
*/
|
|
120
|
-
export type ClientFromProcedures<TProcedures extends Record<string, AnyProcedure<TContext>>, TContext = unknown> = {
|
|
121
|
-
[K in keyof TProcedures as IsInternal<TProcedures[K]> extends true ? never : K]: TProcedures[K] extends {
|
|
122
|
-
procedureType: "query";
|
|
123
|
-
} ? {
|
|
124
|
-
query: (input: InputOf<TProcedures[K]>) => Promise<OutputOf<TProcedures[K]>>;
|
|
125
|
-
liveQuery: (input: InputOf<TProcedures[K]>) => LiveQueryHandle<OutputOf<TProcedures[K]>>;
|
|
126
|
-
} : TProcedures[K] extends {
|
|
127
|
-
procedureType: "mutation";
|
|
128
|
-
} ? {
|
|
129
|
-
mutate: (input: InputOf<TProcedures[K]>, opts?: CallOptions) => Promise<OutputOf<TProcedures[K]>>;
|
|
130
|
-
} : TProcedures[K] extends {
|
|
131
|
-
procedureType: "action";
|
|
132
|
-
} ? {
|
|
133
|
-
action: (input: InputOf<TProcedures[K]>, opts?: CallOptions) => Promise<OutputOf<TProcedures[K]>>;
|
|
134
|
-
} : never;
|
|
135
|
-
};
|
|
136
|
-
/**
|
|
137
|
-
* Optional call options forwarded to the transport layer.
|
|
138
|
-
*/
|
|
139
|
-
export interface CallOptions {
|
|
140
|
-
/**
|
|
141
|
-
* Fired the first time the request leaves the queue and is actually
|
|
142
|
-
* sent on the wire. If the call was already sent immediately (client
|
|
143
|
-
* was ready at call time), this is invoked synchronously.
|
|
144
|
-
*
|
|
145
|
-
* Used by `useMutation` to flip `state` from "queued" → "loading".
|
|
146
|
-
*/
|
|
147
|
-
onSend?: () => void;
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import { WsClientManager, RPCError, } from "./ws_client_manager";
|
|
2
|
-
export { RPCError } from "./ws_client_manager";
|
|
3
|
-
// ─── Client Implementation ───────────────────────────────────────────────────
|
|
4
|
-
/**
|
|
5
|
-
* Create a fully typed RPC client with WebSocket transport.
|
|
6
|
-
*/
|
|
7
|
-
export function createClient(options) {
|
|
8
|
-
const wsClient = new WsClientManager({
|
|
9
|
-
url: options.url,
|
|
10
|
-
token: options.token,
|
|
11
|
-
reconnectionTimeout: options.reconnectionTimeout,
|
|
12
|
-
reconnect: options.reconnect,
|
|
13
|
-
heartbeat: options.heartbeat,
|
|
14
|
-
throttle: options.throttle,
|
|
15
|
-
onConnect: options.onConnect,
|
|
16
|
-
onDisconnect: options.onDisConnect,
|
|
17
|
-
});
|
|
18
|
-
// Stable cross-component dedup. Within a single session there is at most
|
|
19
|
-
// one logical user, so `(procedure, stableStringify(input))` uniquely
|
|
20
|
-
// identifies a live query on the client. The server-canonical subId
|
|
21
|
-
// (which may fold in per-procedure `queryIdentity` overrides) is fetched
|
|
22
|
-
// from the subscribe response and stored on the handle for debugging.
|
|
23
|
-
const liveQueryHandles = new Map();
|
|
24
|
-
function liveQueryDedupKey(procedure, input) {
|
|
25
|
-
return `${procedure}::${input}`;
|
|
26
|
-
}
|
|
27
|
-
const client = new Proxy({}, {
|
|
28
|
-
get(_target, procedureName) {
|
|
29
|
-
if (typeof procedureName !== "string") {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
// Special methods on the client itself
|
|
33
|
-
if (procedureName === "connect") {
|
|
34
|
-
return () => wsClient.connect();
|
|
35
|
-
}
|
|
36
|
-
if (procedureName === "disconnect") {
|
|
37
|
-
return () => wsClient.disconnect();
|
|
38
|
-
}
|
|
39
|
-
if (procedureName === "isReady") {
|
|
40
|
-
return () => wsClient.isReady();
|
|
41
|
-
}
|
|
42
|
-
if (procedureName === "isAuthenticated") {
|
|
43
|
-
return () => wsClient.isAuthenticated();
|
|
44
|
-
}
|
|
45
|
-
if (procedureName === "isAnonymouse") {
|
|
46
|
-
return () => wsClient.isAnonymouse();
|
|
47
|
-
}
|
|
48
|
-
if (procedureName === "getAuthUserId") {
|
|
49
|
-
return () => wsClient.getAuthUserId();
|
|
50
|
-
}
|
|
51
|
-
if (procedureName === "onState") {
|
|
52
|
-
return (listener) => wsClient.onState(listener);
|
|
53
|
-
}
|
|
54
|
-
if (procedureName === "getPublicState") {
|
|
55
|
-
return () => wsClient.getPublicState();
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
query: async (input) => {
|
|
59
|
-
return wsClient.call(procedureName, input);
|
|
60
|
-
},
|
|
61
|
-
mutate: async (input, opts) => {
|
|
62
|
-
return wsClient.call(procedureName, input, opts);
|
|
63
|
-
},
|
|
64
|
-
action: async (input, opts) => {
|
|
65
|
-
return wsClient.call(procedureName, input, opts);
|
|
66
|
-
},
|
|
67
|
-
liveQuery: (input, serializedInput) => {
|
|
68
|
-
const dedupKey = liveQueryDedupKey(procedureName, serializedInput);
|
|
69
|
-
const existing = liveQueryHandles.get(dedupKey);
|
|
70
|
-
if (existing)
|
|
71
|
-
return existing;
|
|
72
|
-
const handle = new LiveQueryHandleImpl(wsClient, procedureName, input, serializedInput, () => liveQueryHandles.delete(dedupKey));
|
|
73
|
-
liveQueryHandles.set(dedupKey, handle);
|
|
74
|
-
return handle;
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
return client;
|
|
80
|
-
}
|
|
81
|
-
// ─── Live Query Handle Implementation ─────────────────────────────────────────
|
|
82
|
-
/**
|
|
83
|
-
* Sync external store for one (procedure, input) live query.
|
|
84
|
-
*
|
|
85
|
-
* - Constructor returns immediately; the wasm-hashed server subId is computed
|
|
86
|
-
* in `kickoffSubscribe()` so callers don't have to await.
|
|
87
|
-
* - `onState` / `onData` ref-count their listeners; the last to leave starts
|
|
88
|
-
* a 3 s grace timer before unsubscribing on the wire (so transient mounts
|
|
89
|
-
* in StrictMode don't churn server-side state).
|
|
90
|
-
* - Listens to `wsClient.onState`: any drop flips status to "stale", and the
|
|
91
|
-
* manager's own `resubscribeAll()` brings us back without our help.
|
|
92
|
-
* - On `sub:gone`, transitions to "error" and auto-retries on next ready.
|
|
93
|
-
*/
|
|
94
|
-
class LiveQueryHandleImpl {
|
|
95
|
-
wsClient;
|
|
96
|
-
procedure;
|
|
97
|
-
input;
|
|
98
|
-
serializedInput;
|
|
99
|
-
onDispose;
|
|
100
|
-
state = {
|
|
101
|
-
data: undefined,
|
|
102
|
-
status: "connecting",
|
|
103
|
-
error: null,
|
|
104
|
-
};
|
|
105
|
-
stateListeners = new Set();
|
|
106
|
-
dataListeners = new Set();
|
|
107
|
-
unsubscribeServer = null;
|
|
108
|
-
graceTimer = null;
|
|
109
|
-
subId = null;
|
|
110
|
-
wsStateOff = null;
|
|
111
|
-
/** Set once the disposer has fired (after the last unsubscribe). */
|
|
112
|
-
disposed = false;
|
|
113
|
-
/**
|
|
114
|
-
* rAF coalesce buffer for incoming `sub:update` payloads. Bursty
|
|
115
|
-
* mutations (e.g. 2000 spam transfers) can fire `sub:update` faster than
|
|
116
|
-
* the screen can repaint; collapsing to one commit per animation frame
|
|
117
|
-
* caps live-query re-renders at vsync without skipping the latest state.
|
|
118
|
-
* Tab in a background window naturally throttles down to ~1Hz via the
|
|
119
|
-
* browser's own rAF policy.
|
|
120
|
-
*/
|
|
121
|
-
pendingData = null;
|
|
122
|
-
rafHandle = null;
|
|
123
|
-
constructor(wsClient, procedure, input, serializedInput, onDispose) {
|
|
124
|
-
this.wsClient = wsClient;
|
|
125
|
-
this.procedure = procedure;
|
|
126
|
-
this.input = input;
|
|
127
|
-
this.serializedInput = serializedInput;
|
|
128
|
-
this.onDispose = onDispose;
|
|
129
|
-
// Track transport state so we can flip "success" → "stale" when the
|
|
130
|
-
// socket drops, without losing the last successful payload.
|
|
131
|
-
this.wsStateOff = wsClient.onState((next) => {
|
|
132
|
-
if (next === "ready" && this.state.status === "stale") {
|
|
133
|
-
// The manager's resubscribeAll() will reseed us with fresh data.
|
|
134
|
-
}
|
|
135
|
-
else if (this.state.status === "success" &&
|
|
136
|
-
(next === "disconnected" || next === "connecting" || next === "authenticating")) {
|
|
137
|
-
this.setState({ status: "stale" });
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
this.kickoffSubscribe();
|
|
141
|
-
}
|
|
142
|
-
get() {
|
|
143
|
-
return this.state.data;
|
|
144
|
-
}
|
|
145
|
-
getState = () => this.state;
|
|
146
|
-
onState = (listener) => {
|
|
147
|
-
this.stateListeners.add(listener);
|
|
148
|
-
this.cancelGrace();
|
|
149
|
-
return () => {
|
|
150
|
-
this.stateListeners.delete(listener);
|
|
151
|
-
this.scheduleGraceUnsubscribe();
|
|
152
|
-
};
|
|
153
|
-
};
|
|
154
|
-
onData(callback) {
|
|
155
|
-
this.dataListeners.add(callback);
|
|
156
|
-
this.cancelGrace();
|
|
157
|
-
if (this.state.data !== undefined) {
|
|
158
|
-
callback(this.state.data);
|
|
159
|
-
}
|
|
160
|
-
return () => {
|
|
161
|
-
this.dataListeners.delete(callback);
|
|
162
|
-
this.scheduleGraceUnsubscribe();
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
refetch() {
|
|
166
|
-
if (this.disposed)
|
|
167
|
-
return;
|
|
168
|
-
this.setState({ status: "loading", error: null });
|
|
169
|
-
void this.kickoffSubscribe();
|
|
170
|
-
}
|
|
171
|
-
unsubscribe() {
|
|
172
|
-
if (this.disposed)
|
|
173
|
-
return;
|
|
174
|
-
this.disposed = true;
|
|
175
|
-
this.cancelGrace();
|
|
176
|
-
if (this.rafHandle !== null && this.rafHandle !== -1 && typeof cancelAnimationFrame === "function") {
|
|
177
|
-
cancelAnimationFrame(this.rafHandle);
|
|
178
|
-
}
|
|
179
|
-
this.rafHandle = null;
|
|
180
|
-
this.pendingData = null;
|
|
181
|
-
if (this.unsubscribeServer) {
|
|
182
|
-
try {
|
|
183
|
-
this.unsubscribeServer();
|
|
184
|
-
}
|
|
185
|
-
catch (e) {
|
|
186
|
-
console.error("[LiveQuery] unsubscribe threw:", e);
|
|
187
|
-
}
|
|
188
|
-
this.unsubscribeServer = null;
|
|
189
|
-
}
|
|
190
|
-
if (this.wsStateOff) {
|
|
191
|
-
this.wsStateOff();
|
|
192
|
-
this.wsStateOff = null;
|
|
193
|
-
}
|
|
194
|
-
this.stateListeners.clear();
|
|
195
|
-
this.dataListeners.clear();
|
|
196
|
-
this.onDispose();
|
|
197
|
-
}
|
|
198
|
-
// ─── Internal ────────────────────────────────────────────────────────────
|
|
199
|
-
async kickoffSubscribe() {
|
|
200
|
-
try {
|
|
201
|
-
const { subId, unsubscribe } = await this.wsClient.subscribe(this.procedure, this.input, this.serializedInput, (data) => this.handleData(data), (reason) => this.handleGone(reason));
|
|
202
|
-
if (this.disposed) {
|
|
203
|
-
try {
|
|
204
|
-
unsubscribe();
|
|
205
|
-
}
|
|
206
|
-
catch { /* swallow */ }
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
this.subId = subId;
|
|
210
|
-
this.unsubscribeServer = unsubscribe;
|
|
211
|
-
}
|
|
212
|
-
catch (err) {
|
|
213
|
-
if (this.disposed)
|
|
214
|
-
return;
|
|
215
|
-
const e = err instanceof Error ? err : new Error(String(err));
|
|
216
|
-
this.setState({ status: "error", error: e });
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
handleData(data) {
|
|
220
|
-
if (this.disposed)
|
|
221
|
-
return;
|
|
222
|
-
// Latest snapshot wins — if a commit is already scheduled, the rAF
|
|
223
|
-
// (or microtask fallback) will pick this up.
|
|
224
|
-
this.pendingData = { value: data };
|
|
225
|
-
if (this.rafHandle !== null)
|
|
226
|
-
return;
|
|
227
|
-
if (typeof requestAnimationFrame !== "function") {
|
|
228
|
-
// Non-browser (Node tests, SSR). Microtask is the closest analog —
|
|
229
|
-
// still collapses multiple updates within the same task.
|
|
230
|
-
this.rafHandle = -1;
|
|
231
|
-
queueMicrotask(() => {
|
|
232
|
-
this.rafHandle = null;
|
|
233
|
-
this.commitPendingData();
|
|
234
|
-
});
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
this.rafHandle = requestAnimationFrame(() => {
|
|
238
|
-
this.rafHandle = null;
|
|
239
|
-
this.commitPendingData();
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
commitPendingData() {
|
|
243
|
-
if (this.disposed)
|
|
244
|
-
return;
|
|
245
|
-
const pending = this.pendingData;
|
|
246
|
-
if (!pending)
|
|
247
|
-
return;
|
|
248
|
-
this.pendingData = null;
|
|
249
|
-
this.setState({ data: pending.value, status: "success", error: null });
|
|
250
|
-
for (const cb of this.dataListeners) {
|
|
251
|
-
try {
|
|
252
|
-
cb(pending.value);
|
|
253
|
-
}
|
|
254
|
-
catch (e) {
|
|
255
|
-
console.error("[LiveQuery] data listener threw:", e);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
handleGone(reason) {
|
|
260
|
-
if (this.disposed)
|
|
261
|
-
return;
|
|
262
|
-
this.setState({
|
|
263
|
-
status: "error",
|
|
264
|
-
error: new RPCError(reason ?? "subscription gone", "SUB_GONE"),
|
|
265
|
-
});
|
|
266
|
-
// Auto-retry: clear the server-unsubscribe ref (it's already gone) and
|
|
267
|
-
// re-issue a subscribe. The manager already replays on reconnect; this
|
|
268
|
-
// handles the case where the server dropped us while the socket stayed up.
|
|
269
|
-
this.unsubscribeServer = null;
|
|
270
|
-
this.subId = null;
|
|
271
|
-
this.kickoffSubscribe();
|
|
272
|
-
}
|
|
273
|
-
setState(patch) {
|
|
274
|
-
const next = { ...this.state, ...patch };
|
|
275
|
-
if (next.data === this.state.data &&
|
|
276
|
-
next.status === this.state.status &&
|
|
277
|
-
next.error === this.state.error) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
this.state = next;
|
|
281
|
-
for (const l of this.stateListeners) {
|
|
282
|
-
try {
|
|
283
|
-
l();
|
|
284
|
-
}
|
|
285
|
-
catch (e) {
|
|
286
|
-
console.error("[LiveQuery] state listener threw:", e);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
cancelGrace() {
|
|
291
|
-
if (this.graceTimer) {
|
|
292
|
-
clearTimeout(this.graceTimer);
|
|
293
|
-
this.graceTimer = null;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
scheduleGraceUnsubscribe() {
|
|
297
|
-
if (this.stateListeners.size > 0 || this.dataListeners.size > 0)
|
|
298
|
-
return;
|
|
299
|
-
this.cancelGrace();
|
|
300
|
-
this.graceTimer = setTimeout(() => {
|
|
301
|
-
this.graceTimer = null;
|
|
302
|
-
if (this.stateListeners.size === 0 && this.dataListeners.size === 0) {
|
|
303
|
-
this.unsubscribe();
|
|
304
|
-
}
|
|
305
|
-
}, 3000);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|