@rindle/remote 0.5.0 → 0.6.3
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/dist/affinity.d.ts +49 -0
- package/dist/affinity.d.ts.map +1 -0
- package/dist/affinity.js +95 -0
- package/dist/affinity.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/optimistic-source.d.ts +9 -9
- package/dist/optimistic-source.d.ts.map +1 -1
- package/dist/optimistic-source.js +34 -19
- package/dist/optimistic-source.js.map +1 -1
- package/dist/protocol.d.ts +3 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/transport.d.ts +6 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +10 -1
- package/dist/transport.js.map +1 -1
- package/package.json +2 -2
- package/src/affinity.ts +137 -0
- package/src/index.ts +4 -0
- package/src/optimistic-source.ts +39 -19
- package/src/protocol.ts +6 -0
- package/src/transport.ts +11 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** The base ws subprotocol the browser offers alongside its `aff.*` ticket; the fleet follower
|
|
2
|
+
* echoes it on the 101 (a strict browser closes a socket whose selected subprotocol it never
|
|
3
|
+
* offered, so the base is always offered in affinity mode). Inlined — NOT imported from
|
|
4
|
+
* `@rindle/affinity`'s `WS_SUBPROTOCOL` — to keep that crate's `node:crypto` out of the browser
|
|
5
|
+
* bundle (the same duplicate-to-stay-bundle-clean discipline the lease wire types use). Keep the
|
|
6
|
+
* two spellings in lock-step. */
|
|
7
|
+
export declare const WS_SUBPROTOCOL = "rindle.v1";
|
|
8
|
+
/** A mutable holder for the current opaque affinity ticket, shared by the transport, the source,
|
|
9
|
+
* and the lease POST (see the module header). */
|
|
10
|
+
export interface AffinityTicketStore {
|
|
11
|
+
/** The ticket to offer on the next ws handshake, or undefined — ticketless, so the edge
|
|
12
|
+
* anycasts + mints a fresh one. A persisted/previous-connection ticket may be returned here
|
|
13
|
+
* even while it is NOT yet safe for a lease; see {@link leaseTicket}. */
|
|
14
|
+
get(): string | undefined;
|
|
15
|
+
/** Record a freshly minted/refreshed ticket (from a connection's `{t:"affinity"}` frame). */
|
|
16
|
+
set(ticket: string): void;
|
|
17
|
+
/** Drop the ticket so the next connect goes ticketless (the pinned follower is gone, §8). */
|
|
18
|
+
clear(): void;
|
|
19
|
+
/** Mark the held ticket handshake-only until this connection emits a fresh mint frame. Called
|
|
20
|
+
* before the first connection and every reconnect, after the held ticket was already selected
|
|
21
|
+
* for the ws subprotocol offer. This prevents a restored/rotated/expired persisted ticket from
|
|
22
|
+
* racing an HTTP lease onto an independently-anycast follower. */
|
|
23
|
+
connectionPending(): void;
|
|
24
|
+
/** Resolve with a ticket minted/refreshed on the CURRENT connection, or the next one
|
|
25
|
+
* {@link set}. A persisted ticket deliberately does not resolve this wait. */
|
|
26
|
+
waitForTicket(): Promise<string>;
|
|
27
|
+
/** Obtain the current connection's ticket for an HTTP lease. The first missing-ticket wait is
|
|
28
|
+
* bounded; its timeout removes the waiter and latches ticketless fallback, so later leases
|
|
29
|
+
* return immediately until a mint frame arrives. Concurrent callers share the one timer.
|
|
30
|
+
* `timedOut` is true only for that transition, allowing one warning per fallback episode. */
|
|
31
|
+
leaseTicket(timeoutMs: number): Promise<{
|
|
32
|
+
ticket?: string;
|
|
33
|
+
timedOut: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
/** Where a store persists the ticket across reloads. The browser backs this with sessionStorage
|
|
37
|
+
* (per-TAB, so two tabs can pin two regions — design §13); tests pass none (pure in-memory). */
|
|
38
|
+
export interface TicketPersistence {
|
|
39
|
+
load(): string | undefined;
|
|
40
|
+
save(ticket: string): void;
|
|
41
|
+
clear(): void;
|
|
42
|
+
}
|
|
43
|
+
/** Build an {@link AffinityTicketStore}, optionally persisted. Pure/in-memory when `persist` is
|
|
44
|
+
* omitted. */
|
|
45
|
+
export declare function createAffinityTicketStore(persist?: TicketPersistence): AffinityTicketStore;
|
|
46
|
+
/** The subprotocol list to offer for one connection: the base protocol always, plus the held ticket
|
|
47
|
+
* (already an `aff.<…>` token) when one exists. */
|
|
48
|
+
export declare function offerSubprotocols(store: AffinityTicketStore): string[];
|
|
49
|
+
//# sourceMappingURL=affinity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affinity.d.ts","sourceRoot":"","sources":["../src/affinity.ts"],"names":[],"mappings":"AAYA;;;;;kCAKkC;AAClC,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;kDACkD;AAClD,MAAM,WAAW,mBAAmB;IAClC;;8EAE0E;IAC1E,GAAG,IAAI,MAAM,GAAG,SAAS,CAAC;IAC1B,6FAA6F;IAC7F,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,6FAA6F;IAC7F,KAAK,IAAI,IAAI,CAAC;IACd;;;uEAGmE;IACnE,iBAAiB,IAAI,IAAI,CAAC;IAC1B;mFAC+E;IAC/E,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC;;;kGAG8F;IAC9F,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjF;AAED;iGACiG;AACjG,MAAM,WAAW,iBAAiB;IAChC,IAAI,IAAI,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;CACf;AAED;eACe;AACf,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CAyE1F;AAED;oDACoD;AACpD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAGtE"}
|
package/dist/affinity.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Browser-side follower-affinity ticket transport (FOLLOWER-AFFINITY-DESIGN.md §3, §5). The ticket
|
|
2
|
+
// is OPAQUE here — the browser never mints or verifies it (placement, not authorization; §3, §9),
|
|
3
|
+
// so this module carries no crypto. It is the thin seam three pieces share:
|
|
4
|
+
//
|
|
5
|
+
// - {@link WsTransport} offers the held ticket as a ws subprotocol at each connect (so the Fly
|
|
6
|
+
// edge `fly-replay`s to the pinned follower);
|
|
7
|
+
// - {@link RemoteOptimisticSource} writes the follower's minted ticket from the `{t:"affinity"}`
|
|
8
|
+
// frame, and CLEARS it on a sustained outage (the pinned follower is gone → the next reconnect
|
|
9
|
+
// anycasts to a live one and re-pins, §8);
|
|
10
|
+
// - the lease POST forwards the held ticket as `affinity`, sequenced AFTER a fresh connect's mint
|
|
11
|
+
// frame ({@link AffinityTicketStore.waitForTicket}) so both legs land on the same follower (§4.1).
|
|
12
|
+
/** The base ws subprotocol the browser offers alongside its `aff.*` ticket; the fleet follower
|
|
13
|
+
* echoes it on the 101 (a strict browser closes a socket whose selected subprotocol it never
|
|
14
|
+
* offered, so the base is always offered in affinity mode). Inlined — NOT imported from
|
|
15
|
+
* `@rindle/affinity`'s `WS_SUBPROTOCOL` — to keep that crate's `node:crypto` out of the browser
|
|
16
|
+
* bundle (the same duplicate-to-stay-bundle-clean discipline the lease wire types use). Keep the
|
|
17
|
+
* two spellings in lock-step. */
|
|
18
|
+
export const WS_SUBPROTOCOL = "rindle.v1";
|
|
19
|
+
/** Build an {@link AffinityTicketStore}, optionally persisted. Pure/in-memory when `persist` is
|
|
20
|
+
* omitted. */
|
|
21
|
+
export function createAffinityTicketStore(persist) {
|
|
22
|
+
let current = persist?.load();
|
|
23
|
+
// A loaded ticket is useful for the ws handshake, but is not lease-safe until the follower on
|
|
24
|
+
// THIS connection confirms it by minting a fresh frame. The same distinction is re-armed on
|
|
25
|
+
// every reconnect via `connectionPending`.
|
|
26
|
+
let currentConnectionFresh = false;
|
|
27
|
+
let ticketlessFallback = false;
|
|
28
|
+
let waiters = [];
|
|
29
|
+
let leaseWait;
|
|
30
|
+
const finishLeaseWait = (result) => {
|
|
31
|
+
const pending = leaseWait;
|
|
32
|
+
if (!pending)
|
|
33
|
+
return;
|
|
34
|
+
clearTimeout(pending.timer);
|
|
35
|
+
leaseWait = undefined;
|
|
36
|
+
pending.resolve(result);
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
get: () => current,
|
|
40
|
+
set: (ticket) => {
|
|
41
|
+
current = ticket;
|
|
42
|
+
currentConnectionFresh = true;
|
|
43
|
+
ticketlessFallback = false;
|
|
44
|
+
persist?.save(ticket);
|
|
45
|
+
// Resolve everyone waiting for the (now-arrived) ticket, in FIFO order.
|
|
46
|
+
const pending = waiters;
|
|
47
|
+
waiters = [];
|
|
48
|
+
for (const resolve of pending)
|
|
49
|
+
resolve(ticket);
|
|
50
|
+
finishLeaseWait({ ticket, timedOut: false });
|
|
51
|
+
},
|
|
52
|
+
clear: () => {
|
|
53
|
+
// Drop the ticket but leave any waiters pending — the next connect's mint frame resolves them
|
|
54
|
+
// (a dead-follower reassignment must still be able to lease once the new ticket arrives).
|
|
55
|
+
current = undefined;
|
|
56
|
+
currentConnectionFresh = false;
|
|
57
|
+
persist?.clear();
|
|
58
|
+
},
|
|
59
|
+
connectionPending: () => {
|
|
60
|
+
currentConnectionFresh = false;
|
|
61
|
+
},
|
|
62
|
+
waitForTicket: () => currentConnectionFresh && current !== undefined
|
|
63
|
+
? Promise.resolve(current)
|
|
64
|
+
: new Promise((resolve) => waiters.push(resolve)),
|
|
65
|
+
leaseTicket: (timeoutMs) => {
|
|
66
|
+
if (currentConnectionFresh && current !== undefined) {
|
|
67
|
+
return Promise.resolve({ ticket: current, timedOut: false });
|
|
68
|
+
}
|
|
69
|
+
if (ticketlessFallback)
|
|
70
|
+
return Promise.resolve({ timedOut: false });
|
|
71
|
+
if (leaseWait)
|
|
72
|
+
return leaseWait.promise;
|
|
73
|
+
let resolve;
|
|
74
|
+
const promise = new Promise((r) => {
|
|
75
|
+
resolve = r;
|
|
76
|
+
});
|
|
77
|
+
const timer = setTimeout(() => {
|
|
78
|
+
// Clear the shared waiter before resolving callers. A later mint starts a new, fresh
|
|
79
|
+
// episode; no abandoned resolver accumulates per lease while affinity is off.
|
|
80
|
+
leaseWait = undefined;
|
|
81
|
+
ticketlessFallback = true;
|
|
82
|
+
resolve({ timedOut: true });
|
|
83
|
+
}, Math.max(0, timeoutMs));
|
|
84
|
+
leaseWait = { promise, resolve, timer };
|
|
85
|
+
return promise;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** The subprotocol list to offer for one connection: the base protocol always, plus the held ticket
|
|
90
|
+
* (already an `aff.<…>` token) when one exists. */
|
|
91
|
+
export function offerSubprotocols(store) {
|
|
92
|
+
const ticket = store.get();
|
|
93
|
+
return ticket ? [WS_SUBPROTOCOL, ticket] : [WS_SUBPROTOCOL];
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=affinity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affinity.js","sourceRoot":"","sources":["../src/affinity.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export { RemoteBackend, createRemoteStore } from "./backend.ts";
|
|
|
3
3
|
export type { RemoteBackendOptions } from "./backend.ts";
|
|
4
4
|
export { WsTransport } from "./transport.ts";
|
|
5
5
|
export type { Transport } from "./transport.ts";
|
|
6
|
+
export { WS_SUBPROTOCOL, createAffinityTicketStore, offerSubprotocols } from "./affinity.ts";
|
|
7
|
+
export type { AffinityTicketStore, TicketPersistence } from "./affinity.ts";
|
|
6
8
|
export type { MutationEnvelopeSender, RawMutationSender, SubscribeMode, SubscribeRequest, SubscribeResolver, SubscribeTarget, } from "./subscribe.ts";
|
|
7
9
|
export { COMPARATOR_VERSION, Publisher, ProtocolError, Subscriber, schemaFp } from "./protocol.ts";
|
|
8
10
|
export type { Batch, ClientMsg, Hello, ProtocolErrorKind, ServerMsg, SubscribeClientMsg } from "./protocol.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7F,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnG,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG/G,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAGxE,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAC9F,YAAY,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
export * from "@rindle/client";
|
|
6
6
|
export { RemoteBackend, createRemoteStore } from "./backend.js";
|
|
7
7
|
export { WsTransport } from "./transport.js";
|
|
8
|
+
// Browser-side follower-affinity ticket transport (FOLLOWER-AFFINITY-DESIGN.md §3, §5).
|
|
9
|
+
export { WS_SUBPROTOCOL, createAffinityTicketStore, offerSubprotocols } from "./affinity.js";
|
|
8
10
|
export { COMPARATOR_VERSION, Publisher, ProtocolError, Subscriber, schemaFp } from "./protocol.js";
|
|
9
11
|
// The normalized subscription protocol (the path-free twin) + the client-side source.
|
|
10
12
|
export { NormalizedSubscriber, normalizedFp } from "./normalized.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,0FAA0F;AAC1F,8FAA8F;AAC9F,uEAAuE;AAEvE,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,0FAA0F;AAC1F,8FAA8F;AAC9F,uEAAuE;AAEvE,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,wFAAwF;AACxF,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAW7F,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGnG,sFAAsF;AACtF,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAG1F,0FAA0F;AAC1F,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAO9F,yFAAyF;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MutationEnvelope, MutationOutcomeFrame, NormalizedEvent, NormalizedTableSchema, OptimisticSource, ProgressFrame, QueryId, RemoteQuery } from "@rindle/client";
|
|
2
|
+
import type { AffinityTicketStore } from "./affinity.ts";
|
|
2
3
|
import { type MutationEnvelopeSender, type SubscribeResolver } from "./subscribe.ts";
|
|
3
4
|
import type { Transport } from "./transport.ts";
|
|
4
5
|
/** Build a transport to a follower's public ws endpoint (READ-ROUTER-DESIGN.md §2.3). Default
|
|
@@ -22,6 +23,11 @@ export interface RemoteOptimisticSourceOptions {
|
|
|
22
23
|
resolveSubscribe?: SubscribeResolver;
|
|
23
24
|
/** Override named-mutator delivery, e.g. POST envelopes to the app API server. */
|
|
24
25
|
pushMutation?: MutationEnvelopeSender;
|
|
26
|
+
/** Follower-affinity mode (FOLLOWER-AFFINITY-DESIGN.md §3): the shared ticket store. When set, the
|
|
27
|
+
* source records the follower's minted ticket from the `{t:"affinity"}` frame and CLEARS it on a
|
|
28
|
+
* sustained outage so the next (ticketless) reconnect anycasts to a live follower and re-pins
|
|
29
|
+
* (§8). Absent ⇒ affinity off (today's behavior). */
|
|
30
|
+
affinity?: AffinityTicketStore;
|
|
25
31
|
}
|
|
26
32
|
export declare class RemoteOptimisticSource implements OptimisticSource {
|
|
27
33
|
/** The CURRENT transport (undefined in pure-lazy mode until the first lease opens one). */
|
|
@@ -33,10 +39,11 @@ export declare class RemoteOptimisticSource implements OptimisticSource {
|
|
|
33
39
|
private readonly clientID;
|
|
34
40
|
private readonly resolveSubscribe;
|
|
35
41
|
private readonly pushMutationSender?;
|
|
42
|
+
/** The affinity ticket store (undefined ⇒ affinity off). See {@link RemoteOptimisticSourceOptions.affinity}. */
|
|
43
|
+
private readonly affinityStore?;
|
|
36
44
|
private handler;
|
|
37
45
|
private progressHandler;
|
|
38
46
|
private restartHandler;
|
|
39
|
-
private bootIdHandler;
|
|
40
47
|
private outcomeHandler;
|
|
41
48
|
private resyncHandler;
|
|
42
49
|
/** Set by {@link resync} when this is a LEASE-AUTH session (some sub presented a `leaseToken`):
|
|
@@ -98,11 +105,6 @@ export declare class RemoteOptimisticSource implements OptimisticSource {
|
|
|
98
105
|
/** Register a handler fired when the DAEMON restarts (a new boot id) — the backend resets its
|
|
99
106
|
* `cv` watermark so the new daemon's reset `cv` sequence is accepted instead of dropped. */
|
|
100
107
|
onRestart(handler: () => void): void;
|
|
101
|
-
/** Register the observed boot-id stream (`301-ECHO-FENCE-DESIGN.md` §2.4): fired on the FIRST
|
|
102
|
-
* observed daemon boot id and on every change — the backend's client-local boot ordinals for
|
|
103
|
-
* the direction-B pin fence. A late registration is replayed the current id immediately, so
|
|
104
|
-
* ordinal 0 is never missed on an already-open connection. */
|
|
105
|
-
onBootId(handler: (bootId: string) => void): void;
|
|
106
108
|
expectClientSchema(tables: NormalizedTableSchema[]): void;
|
|
107
109
|
registerQuery(qid: QueryId, remote: RemoteQuery): void;
|
|
108
110
|
unregisterQuery(qid: QueryId): void;
|
|
@@ -133,9 +135,7 @@ export declare class RemoteOptimisticSource implements OptimisticSource {
|
|
|
133
135
|
* subject gate never refuses them, and its re-answer (a recorded outcome for any non-applied
|
|
134
136
|
* mid) resolves even an already-retired entry via the handshake's not-found arm. */
|
|
135
137
|
private resync;
|
|
136
|
-
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart.
|
|
137
|
-
* Every NEW id (including the first) also feeds {@link onBootId} — the §301 boot-ordinal
|
|
138
|
-
* stream. */
|
|
138
|
+
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart. */
|
|
139
139
|
private observeBootId;
|
|
140
140
|
/** Route a `queryError` by its 101 §5 classification: retryable ⇒ keep the QState (and the
|
|
141
141
|
* rows already folded downstream — 101 §6) and re-subscribe after a jittered backoff
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimistic-source.d.ts","sourceRoot":"","sources":["../src/optimistic-source.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,WAAW,EACZ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"optimistic-source.d.ts","sourceRoot":"","sources":["../src/optimistic-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,10 +28,11 @@ export class RemoteOptimisticSource {
|
|
|
28
28
|
clientID;
|
|
29
29
|
resolveSubscribe;
|
|
30
30
|
pushMutationSender;
|
|
31
|
+
/** The affinity ticket store (undefined ⇒ affinity off). See {@link RemoteOptimisticSourceOptions.affinity}. */
|
|
32
|
+
affinityStore;
|
|
31
33
|
handler = () => { };
|
|
32
34
|
progressHandler = () => { };
|
|
33
35
|
restartHandler = () => { };
|
|
34
|
-
bootIdHandler = () => { };
|
|
35
36
|
outcomeHandler = () => { };
|
|
36
37
|
resyncHandler = () => { };
|
|
37
38
|
/** Set by {@link resync} when this is a LEASE-AUTH session (some sub presented a `leaseToken`):
|
|
@@ -67,6 +68,7 @@ export class RemoteOptimisticSource {
|
|
|
67
68
|
this.clientID = clientID;
|
|
68
69
|
this.resolveSubscribe = opts.resolveSubscribe ?? defaultSubscribeTarget;
|
|
69
70
|
this.pushMutationSender = opts.pushMutation;
|
|
71
|
+
this.affinityStore = opts.affinity;
|
|
70
72
|
if (isTransport(connection)) {
|
|
71
73
|
this.transportFactory = undefined;
|
|
72
74
|
this.bringUp(connection, undefined);
|
|
@@ -85,7 +87,13 @@ export class RemoteOptimisticSource {
|
|
|
85
87
|
attach(transport) {
|
|
86
88
|
transport.onMessage((msg) => this.onServerMsg(msg));
|
|
87
89
|
// Heal a dropped/restarted connection (same endpoint): on reconnect, replay init + re-subscribe.
|
|
88
|
-
transport.onReconnect?.(() =>
|
|
90
|
+
transport.onReconnect?.(() => {
|
|
91
|
+
// The held ticket was useful for routing this ws handshake, but HTTP re-leases must wait for
|
|
92
|
+
// THIS connection's first affinity frame. Otherwise an expired/rotated persisted ticket can
|
|
93
|
+
// independently re-pin the control leg before the fresh frame arrives.
|
|
94
|
+
this.affinityStore?.connectionPending();
|
|
95
|
+
this.resync();
|
|
96
|
+
});
|
|
89
97
|
// Sustained outage on this endpoint: re-lease (the router may move us off a dead follower, §3).
|
|
90
98
|
transport.onDown?.(() => this.onDown());
|
|
91
99
|
}
|
|
@@ -93,6 +101,10 @@ export class RemoteOptimisticSource {
|
|
|
93
101
|
bringUp(transport, endpoint) {
|
|
94
102
|
this.transport = transport;
|
|
95
103
|
this.currentEndpoint = endpoint;
|
|
104
|
+
// `WsTransport` has already evaluated the ticket thunk while constructing this connection.
|
|
105
|
+
// From this point the old/persisted ticket is handshake-only until the follower confirms the
|
|
106
|
+
// selected machine with its first affinity frame.
|
|
107
|
+
this.affinityStore?.connectionPending();
|
|
96
108
|
this.attach(transport);
|
|
97
109
|
transport.send({ t: "init", clientID: this.clientID });
|
|
98
110
|
this.flushDeferred();
|
|
@@ -144,7 +156,17 @@ export class RemoteOptimisticSource {
|
|
|
144
156
|
* lease ever carried a `wsEndpoint`) — there is nowhere to move, so we keep the pre-router
|
|
145
157
|
* behavior and let the transport's own reconnect→resync recover. */
|
|
146
158
|
onDown() {
|
|
147
|
-
if (this.closed
|
|
159
|
+
if (this.closed)
|
|
160
|
+
return;
|
|
161
|
+
if (this.affinityStore) {
|
|
162
|
+
// Affinity: the pinned follower is gone (sustained outage). Drop the ticket so the transport's
|
|
163
|
+
// ongoing reconnects go TICKETLESS — the Fly edge then anycasts to a live follower, which mints
|
|
164
|
+
// a fresh ticket, and that reconnect's `onReconnect` → resync re-leases there (FOLLOWER-AFFINITY
|
|
165
|
+
// §8, one bounded reassignment). Nothing to migrate: the ws host is fixed, Fly routes by ticket.
|
|
166
|
+
this.affinityStore.clear();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (!this.sawRoutedEndpoint)
|
|
148
170
|
return;
|
|
149
171
|
this.resubscribeAll();
|
|
150
172
|
}
|
|
@@ -166,15 +188,6 @@ export class RemoteOptimisticSource {
|
|
|
166
188
|
onRestart(handler) {
|
|
167
189
|
this.restartHandler = handler;
|
|
168
190
|
}
|
|
169
|
-
/** Register the observed boot-id stream (`301-ECHO-FENCE-DESIGN.md` §2.4): fired on the FIRST
|
|
170
|
-
* observed daemon boot id and on every change — the backend's client-local boot ordinals for
|
|
171
|
-
* the direction-B pin fence. A late registration is replayed the current id immediately, so
|
|
172
|
-
* ordinal 0 is never missed on an already-open connection. */
|
|
173
|
-
onBootId(handler) {
|
|
174
|
-
this.bootIdHandler = handler;
|
|
175
|
-
if (this.lastBootId !== undefined)
|
|
176
|
-
handler(this.lastBootId);
|
|
177
|
-
}
|
|
178
191
|
expectClientSchema(tables) {
|
|
179
192
|
this.clientTables = tables;
|
|
180
193
|
}
|
|
@@ -298,6 +311,13 @@ export class RemoteOptimisticSource {
|
|
|
298
311
|
}
|
|
299
312
|
}
|
|
300
313
|
onServerMsg(msg) {
|
|
314
|
+
if (msg.t === "affinity") {
|
|
315
|
+
// Connection-level: the follower minted/refreshed this connection's placement ticket. Persist
|
|
316
|
+
// it (via the store) so the next connect offers it as a subprotocol and the lease POST forwards
|
|
317
|
+
// it — both legs then pin THIS follower (§4). Off ⇒ no store ⇒ dropped.
|
|
318
|
+
this.affinityStore?.set(msg.ticket);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
301
321
|
if (msg.t === "progress") {
|
|
302
322
|
this.progressHandler(msg.frame);
|
|
303
323
|
return;
|
|
@@ -358,18 +378,13 @@ export class RemoteOptimisticSource {
|
|
|
358
378
|
this.resyncHandler();
|
|
359
379
|
this.resubscribeAll();
|
|
360
380
|
}
|
|
361
|
-
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart.
|
|
362
|
-
* Every NEW id (including the first) also feeds {@link onBootId} — the §301 boot-ordinal
|
|
363
|
-
* stream. */
|
|
381
|
+
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart. */
|
|
364
382
|
observeBootId(bootId) {
|
|
365
383
|
if (!bootId)
|
|
366
384
|
return;
|
|
367
385
|
if (this.lastBootId !== undefined && bootId !== this.lastBootId)
|
|
368
386
|
this.restartHandler();
|
|
369
|
-
|
|
370
|
-
this.lastBootId = bootId;
|
|
371
|
-
this.bootIdHandler(bootId);
|
|
372
|
-
}
|
|
387
|
+
this.lastBootId = bootId;
|
|
373
388
|
}
|
|
374
389
|
/** Route a `queryError` by its 101 §5 classification: retryable ⇒ keep the QState (and the
|
|
375
390
|
* rows already folded downstream — 101 §6) and re-subscribe after a jittered backoff
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimistic-source.js","sourceRoot":"","sources":["../src/optimistic-source.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"optimistic-source.js","sourceRoot":"","sources":["../src/optimistic-source.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.d.ts
CHANGED
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/transport.d.ts
CHANGED
|
@@ -23,6 +23,11 @@ export interface Transport {
|
|
|
23
23
|
* it reopens and fires `onReconnect` so the source rebuilds its subscriptions. */
|
|
24
24
|
export declare class WsTransport implements Transport {
|
|
25
25
|
private readonly url;
|
|
26
|
+
/** Reads the subprotocols to offer at each (re)connect — in affinity mode, `["rindle.v1", "aff.…"]`
|
|
27
|
+
* with the CURRENT ticket (FOLLOWER-AFFINITY-DESIGN.md §5). Undefined ⇒ offer none (today's
|
|
28
|
+
* single-daemon behavior, byte-identical). Evaluated per connect so a reconnect presents the
|
|
29
|
+
* freshest (or freshly cleared) ticket. */
|
|
30
|
+
private readonly subprotocols?;
|
|
26
31
|
private ws;
|
|
27
32
|
private handler;
|
|
28
33
|
private reconnectHandler;
|
|
@@ -41,6 +46,7 @@ export declare class WsTransport implements Transport {
|
|
|
41
46
|
private downFired;
|
|
42
47
|
constructor(url: string, opts?: {
|
|
43
48
|
downThreshold?: number;
|
|
49
|
+
subprotocols?: () => string[];
|
|
44
50
|
});
|
|
45
51
|
private connect;
|
|
46
52
|
private scheduleReconnect;
|
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD;;wEAEoE;IACpE,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACxC;;;;wCAIoC;IACpC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnC,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;mFAGmF;AACnF,qBAAa,WAAY,YAAW,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,cAAc,CAA4C;IAClE,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC;;2CAEuC;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAO;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,gEAAgE;IAChE,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD;;wEAEoE;IACpE,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACxC;;;;wCAIoC;IACpC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnC,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;mFAGmF;AACnF,qBAAa,WAAY,YAAW,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B;;;gDAG4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAiB;IAC/C,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,cAAc,CAA4C;IAClE,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC;;2CAEuC;IACvC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,MAAM,EAAE,CAAA;KAAO;IAO7F,OAAO,CAAC,OAAO;IAiCf,OAAO,CAAC,iBAAiB;IAiBzB,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAK1B,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAIlD,WAAW,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIjC,KAAK,IAAI,IAAI;CAQd"}
|
package/dist/transport.js
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* it reopens and fires `onReconnect` so the source rebuilds its subscriptions. */
|
|
8
8
|
export class WsTransport {
|
|
9
9
|
url;
|
|
10
|
+
/** Reads the subprotocols to offer at each (re)connect — in affinity mode, `["rindle.v1", "aff.…"]`
|
|
11
|
+
* with the CURRENT ticket (FOLLOWER-AFFINITY-DESIGN.md §5). Undefined ⇒ offer none (today's
|
|
12
|
+
* single-daemon behavior, byte-identical). Evaluated per connect so a reconnect presents the
|
|
13
|
+
* freshest (or freshly cleared) ticket. */
|
|
14
|
+
subprotocols;
|
|
10
15
|
ws;
|
|
11
16
|
handler = () => { };
|
|
12
17
|
reconnectHandler = () => { };
|
|
@@ -26,10 +31,14 @@ export class WsTransport {
|
|
|
26
31
|
constructor(url, opts = {}) {
|
|
27
32
|
this.url = url;
|
|
28
33
|
this.downThreshold = opts.downThreshold ?? 4;
|
|
34
|
+
this.subprotocols = opts.subprotocols;
|
|
29
35
|
this.ws = this.connect();
|
|
30
36
|
}
|
|
31
37
|
connect() {
|
|
32
|
-
|
|
38
|
+
// Offer the affinity subprotocols (base + current ticket) when configured; otherwise open bare,
|
|
39
|
+
// exactly as before. An empty list is treated as bare (never send `Sec-WebSocket-Protocol: `).
|
|
40
|
+
const protocols = this.subprotocols?.();
|
|
41
|
+
const ws = protocols && protocols.length > 0 ? new WebSocket(this.url, protocols) : new WebSocket(this.url);
|
|
33
42
|
ws.addEventListener("open", () => {
|
|
34
43
|
this.open = true;
|
|
35
44
|
this.attempt = 0;
|
package/dist/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,2FAA2F;AAC3F,gFAAgF;AAuBhF;;;mFAGmF;AACnF,MAAM,OAAO,WAAW;IACL,GAAG,CAAS;
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rindle/remote",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"README.md"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@rindle/client": "0.
|
|
28
|
+
"@rindle/client": "0.6.3"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.10.0",
|
package/src/affinity.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Browser-side follower-affinity ticket transport (FOLLOWER-AFFINITY-DESIGN.md §3, §5). The ticket
|
|
2
|
+
// is OPAQUE here — the browser never mints or verifies it (placement, not authorization; §3, §9),
|
|
3
|
+
// so this module carries no crypto. It is the thin seam three pieces share:
|
|
4
|
+
//
|
|
5
|
+
// - {@link WsTransport} offers the held ticket as a ws subprotocol at each connect (so the Fly
|
|
6
|
+
// edge `fly-replay`s to the pinned follower);
|
|
7
|
+
// - {@link RemoteOptimisticSource} writes the follower's minted ticket from the `{t:"affinity"}`
|
|
8
|
+
// frame, and CLEARS it on a sustained outage (the pinned follower is gone → the next reconnect
|
|
9
|
+
// anycasts to a live one and re-pins, §8);
|
|
10
|
+
// - the lease POST forwards the held ticket as `affinity`, sequenced AFTER a fresh connect's mint
|
|
11
|
+
// frame ({@link AffinityTicketStore.waitForTicket}) so both legs land on the same follower (§4.1).
|
|
12
|
+
|
|
13
|
+
/** The base ws subprotocol the browser offers alongside its `aff.*` ticket; the fleet follower
|
|
14
|
+
* echoes it on the 101 (a strict browser closes a socket whose selected subprotocol it never
|
|
15
|
+
* offered, so the base is always offered in affinity mode). Inlined — NOT imported from
|
|
16
|
+
* `@rindle/affinity`'s `WS_SUBPROTOCOL` — to keep that crate's `node:crypto` out of the browser
|
|
17
|
+
* bundle (the same duplicate-to-stay-bundle-clean discipline the lease wire types use). Keep the
|
|
18
|
+
* two spellings in lock-step. */
|
|
19
|
+
export const WS_SUBPROTOCOL = "rindle.v1";
|
|
20
|
+
|
|
21
|
+
/** A mutable holder for the current opaque affinity ticket, shared by the transport, the source,
|
|
22
|
+
* and the lease POST (see the module header). */
|
|
23
|
+
export interface AffinityTicketStore {
|
|
24
|
+
/** The ticket to offer on the next ws handshake, or undefined — ticketless, so the edge
|
|
25
|
+
* anycasts + mints a fresh one. A persisted/previous-connection ticket may be returned here
|
|
26
|
+
* even while it is NOT yet safe for a lease; see {@link leaseTicket}. */
|
|
27
|
+
get(): string | undefined;
|
|
28
|
+
/** Record a freshly minted/refreshed ticket (from a connection's `{t:"affinity"}` frame). */
|
|
29
|
+
set(ticket: string): void;
|
|
30
|
+
/** Drop the ticket so the next connect goes ticketless (the pinned follower is gone, §8). */
|
|
31
|
+
clear(): void;
|
|
32
|
+
/** Mark the held ticket handshake-only until this connection emits a fresh mint frame. Called
|
|
33
|
+
* before the first connection and every reconnect, after the held ticket was already selected
|
|
34
|
+
* for the ws subprotocol offer. This prevents a restored/rotated/expired persisted ticket from
|
|
35
|
+
* racing an HTTP lease onto an independently-anycast follower. */
|
|
36
|
+
connectionPending(): void;
|
|
37
|
+
/** Resolve with a ticket minted/refreshed on the CURRENT connection, or the next one
|
|
38
|
+
* {@link set}. A persisted ticket deliberately does not resolve this wait. */
|
|
39
|
+
waitForTicket(): Promise<string>;
|
|
40
|
+
/** Obtain the current connection's ticket for an HTTP lease. The first missing-ticket wait is
|
|
41
|
+
* bounded; its timeout removes the waiter and latches ticketless fallback, so later leases
|
|
42
|
+
* return immediately until a mint frame arrives. Concurrent callers share the one timer.
|
|
43
|
+
* `timedOut` is true only for that transition, allowing one warning per fallback episode. */
|
|
44
|
+
leaseTicket(timeoutMs: number): Promise<{ ticket?: string; timedOut: boolean }>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Where a store persists the ticket across reloads. The browser backs this with sessionStorage
|
|
48
|
+
* (per-TAB, so two tabs can pin two regions — design §13); tests pass none (pure in-memory). */
|
|
49
|
+
export interface TicketPersistence {
|
|
50
|
+
load(): string | undefined;
|
|
51
|
+
save(ticket: string): void;
|
|
52
|
+
clear(): void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Build an {@link AffinityTicketStore}, optionally persisted. Pure/in-memory when `persist` is
|
|
56
|
+
* omitted. */
|
|
57
|
+
export function createAffinityTicketStore(persist?: TicketPersistence): AffinityTicketStore {
|
|
58
|
+
let current = persist?.load();
|
|
59
|
+
// A loaded ticket is useful for the ws handshake, but is not lease-safe until the follower on
|
|
60
|
+
// THIS connection confirms it by minting a fresh frame. The same distinction is re-armed on
|
|
61
|
+
// every reconnect via `connectionPending`.
|
|
62
|
+
let currentConnectionFresh = false;
|
|
63
|
+
let ticketlessFallback = false;
|
|
64
|
+
let waiters: Array<(ticket: string) => void> = [];
|
|
65
|
+
let leaseWait:
|
|
66
|
+
| {
|
|
67
|
+
promise: Promise<{ ticket?: string; timedOut: boolean }>;
|
|
68
|
+
resolve: (result: { ticket?: string; timedOut: boolean }) => void;
|
|
69
|
+
timer: ReturnType<typeof setTimeout>;
|
|
70
|
+
}
|
|
71
|
+
| undefined;
|
|
72
|
+
|
|
73
|
+
const finishLeaseWait = (result: { ticket?: string; timedOut: boolean }): void => {
|
|
74
|
+
const pending = leaseWait;
|
|
75
|
+
if (!pending) return;
|
|
76
|
+
clearTimeout(pending.timer);
|
|
77
|
+
leaseWait = undefined;
|
|
78
|
+
pending.resolve(result);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
get: () => current,
|
|
83
|
+
set: (ticket) => {
|
|
84
|
+
current = ticket;
|
|
85
|
+
currentConnectionFresh = true;
|
|
86
|
+
ticketlessFallback = false;
|
|
87
|
+
persist?.save(ticket);
|
|
88
|
+
// Resolve everyone waiting for the (now-arrived) ticket, in FIFO order.
|
|
89
|
+
const pending = waiters;
|
|
90
|
+
waiters = [];
|
|
91
|
+
for (const resolve of pending) resolve(ticket);
|
|
92
|
+
finishLeaseWait({ ticket, timedOut: false });
|
|
93
|
+
},
|
|
94
|
+
clear: () => {
|
|
95
|
+
// Drop the ticket but leave any waiters pending — the next connect's mint frame resolves them
|
|
96
|
+
// (a dead-follower reassignment must still be able to lease once the new ticket arrives).
|
|
97
|
+
current = undefined;
|
|
98
|
+
currentConnectionFresh = false;
|
|
99
|
+
persist?.clear();
|
|
100
|
+
},
|
|
101
|
+
connectionPending: () => {
|
|
102
|
+
currentConnectionFresh = false;
|
|
103
|
+
},
|
|
104
|
+
waitForTicket: () =>
|
|
105
|
+
currentConnectionFresh && current !== undefined
|
|
106
|
+
? Promise.resolve(current)
|
|
107
|
+
: new Promise<string>((resolve) => waiters.push(resolve)),
|
|
108
|
+
leaseTicket: (timeoutMs) => {
|
|
109
|
+
if (currentConnectionFresh && current !== undefined) {
|
|
110
|
+
return Promise.resolve({ ticket: current, timedOut: false });
|
|
111
|
+
}
|
|
112
|
+
if (ticketlessFallback) return Promise.resolve({ timedOut: false });
|
|
113
|
+
if (leaseWait) return leaseWait.promise;
|
|
114
|
+
|
|
115
|
+
let resolve!: (result: { ticket?: string; timedOut: boolean }) => void;
|
|
116
|
+
const promise = new Promise<{ ticket?: string; timedOut: boolean }>((r) => {
|
|
117
|
+
resolve = r;
|
|
118
|
+
});
|
|
119
|
+
const timer = setTimeout(() => {
|
|
120
|
+
// Clear the shared waiter before resolving callers. A later mint starts a new, fresh
|
|
121
|
+
// episode; no abandoned resolver accumulates per lease while affinity is off.
|
|
122
|
+
leaseWait = undefined;
|
|
123
|
+
ticketlessFallback = true;
|
|
124
|
+
resolve({ timedOut: true });
|
|
125
|
+
}, Math.max(0, timeoutMs));
|
|
126
|
+
leaseWait = { promise, resolve, timer };
|
|
127
|
+
return promise;
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** The subprotocol list to offer for one connection: the base protocol always, plus the held ticket
|
|
133
|
+
* (already an `aff.<…>` token) when one exists. */
|
|
134
|
+
export function offerSubprotocols(store: AffinityTicketStore): string[] {
|
|
135
|
+
const ticket = store.get();
|
|
136
|
+
return ticket ? [WS_SUBPROTOCOL, ticket] : [WS_SUBPROTOCOL];
|
|
137
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,10 @@ export { RemoteBackend, createRemoteStore } from "./backend.ts";
|
|
|
9
9
|
export type { RemoteBackendOptions } from "./backend.ts";
|
|
10
10
|
export { WsTransport } from "./transport.ts";
|
|
11
11
|
export type { Transport } from "./transport.ts";
|
|
12
|
+
|
|
13
|
+
// Browser-side follower-affinity ticket transport (FOLLOWER-AFFINITY-DESIGN.md §3, §5).
|
|
14
|
+
export { WS_SUBPROTOCOL, createAffinityTicketStore, offerSubprotocols } from "./affinity.ts";
|
|
15
|
+
export type { AffinityTicketStore, TicketPersistence } from "./affinity.ts";
|
|
12
16
|
export type {
|
|
13
17
|
MutationEnvelopeSender,
|
|
14
18
|
RawMutationSender,
|
package/src/optimistic-source.ts
CHANGED
|
@@ -25,6 +25,7 @@ import type {
|
|
|
25
25
|
RemoteQuery,
|
|
26
26
|
} from "@rindle/client";
|
|
27
27
|
|
|
28
|
+
import type { AffinityTicketStore } from "./affinity.ts";
|
|
28
29
|
import { NormalizedSubscriber } from "./normalized.ts";
|
|
29
30
|
import { retryDelayMs } from "./query-error.ts";
|
|
30
31
|
import type { NormalizedBatch, NormalizedHello } from "./normalized.ts";
|
|
@@ -83,6 +84,11 @@ export interface RemoteOptimisticSourceOptions {
|
|
|
83
84
|
resolveSubscribe?: SubscribeResolver;
|
|
84
85
|
/** Override named-mutator delivery, e.g. POST envelopes to the app API server. */
|
|
85
86
|
pushMutation?: MutationEnvelopeSender;
|
|
87
|
+
/** Follower-affinity mode (FOLLOWER-AFFINITY-DESIGN.md §3): the shared ticket store. When set, the
|
|
88
|
+
* source records the follower's minted ticket from the `{t:"affinity"}` frame and CLEARS it on a
|
|
89
|
+
* sustained outage so the next (ticketless) reconnect anycasts to a live follower and re-pins
|
|
90
|
+
* (§8). Absent ⇒ affinity off (today's behavior). */
|
|
91
|
+
affinity?: AffinityTicketStore;
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
export class RemoteOptimisticSource implements OptimisticSource {
|
|
@@ -95,10 +101,11 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
95
101
|
private readonly clientID: string;
|
|
96
102
|
private readonly resolveSubscribe: SubscribeResolver;
|
|
97
103
|
private readonly pushMutationSender?: MutationEnvelopeSender;
|
|
104
|
+
/** The affinity ticket store (undefined ⇒ affinity off). See {@link RemoteOptimisticSourceOptions.affinity}. */
|
|
105
|
+
private readonly affinityStore?: AffinityTicketStore;
|
|
98
106
|
private handler: (qid: QueryId, ev: NormalizedEvent) => void = () => {};
|
|
99
107
|
private progressHandler: (frame: ProgressFrame) => void = () => {};
|
|
100
108
|
private restartHandler: () => void = () => {};
|
|
101
|
-
private bootIdHandler: (bootId: string) => void = () => {};
|
|
102
109
|
private outcomeHandler: (frame: MutationOutcomeFrame) => void = () => {};
|
|
103
110
|
private resyncHandler: () => void = () => {};
|
|
104
111
|
/** Set by {@link resync} when this is a LEASE-AUTH session (some sub presented a `leaseToken`):
|
|
@@ -135,6 +142,7 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
135
142
|
this.clientID = clientID;
|
|
136
143
|
this.resolveSubscribe = opts.resolveSubscribe ?? defaultSubscribeTarget;
|
|
137
144
|
this.pushMutationSender = opts.pushMutation;
|
|
145
|
+
this.affinityStore = opts.affinity;
|
|
138
146
|
if (isTransport(connection)) {
|
|
139
147
|
this.transportFactory = undefined;
|
|
140
148
|
this.bringUp(connection, undefined);
|
|
@@ -151,7 +159,13 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
151
159
|
private attach(transport: Transport): void {
|
|
152
160
|
transport.onMessage((msg) => this.onServerMsg(msg));
|
|
153
161
|
// Heal a dropped/restarted connection (same endpoint): on reconnect, replay init + re-subscribe.
|
|
154
|
-
transport.onReconnect?.(() =>
|
|
162
|
+
transport.onReconnect?.(() => {
|
|
163
|
+
// The held ticket was useful for routing this ws handshake, but HTTP re-leases must wait for
|
|
164
|
+
// THIS connection's first affinity frame. Otherwise an expired/rotated persisted ticket can
|
|
165
|
+
// independently re-pin the control leg before the fresh frame arrives.
|
|
166
|
+
this.affinityStore?.connectionPending();
|
|
167
|
+
this.resync();
|
|
168
|
+
});
|
|
155
169
|
// Sustained outage on this endpoint: re-lease (the router may move us off a dead follower, §3).
|
|
156
170
|
transport.onDown?.(() => this.onDown());
|
|
157
171
|
}
|
|
@@ -160,6 +174,10 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
160
174
|
private bringUp(transport: Transport, endpoint: string | undefined): void {
|
|
161
175
|
this.transport = transport;
|
|
162
176
|
this.currentEndpoint = endpoint;
|
|
177
|
+
// `WsTransport` has already evaluated the ticket thunk while constructing this connection.
|
|
178
|
+
// From this point the old/persisted ticket is handshake-only until the follower confirms the
|
|
179
|
+
// selected machine with its first affinity frame.
|
|
180
|
+
this.affinityStore?.connectionPending();
|
|
163
181
|
this.attach(transport);
|
|
164
182
|
transport.send({ t: "init", clientID: this.clientID });
|
|
165
183
|
this.flushDeferred();
|
|
@@ -212,7 +230,16 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
212
230
|
* lease ever carried a `wsEndpoint`) — there is nowhere to move, so we keep the pre-router
|
|
213
231
|
* behavior and let the transport's own reconnect→resync recover. */
|
|
214
232
|
private onDown(): void {
|
|
215
|
-
if (this.closed
|
|
233
|
+
if (this.closed) return;
|
|
234
|
+
if (this.affinityStore) {
|
|
235
|
+
// Affinity: the pinned follower is gone (sustained outage). Drop the ticket so the transport's
|
|
236
|
+
// ongoing reconnects go TICKETLESS — the Fly edge then anycasts to a live follower, which mints
|
|
237
|
+
// a fresh ticket, and that reconnect's `onReconnect` → resync re-leases there (FOLLOWER-AFFINITY
|
|
238
|
+
// §8, one bounded reassignment). Nothing to migrate: the ws host is fixed, Fly routes by ticket.
|
|
239
|
+
this.affinityStore.clear();
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!this.sawRoutedEndpoint) return;
|
|
216
243
|
this.resubscribeAll();
|
|
217
244
|
}
|
|
218
245
|
|
|
@@ -235,15 +262,6 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
235
262
|
this.restartHandler = handler;
|
|
236
263
|
}
|
|
237
264
|
|
|
238
|
-
/** Register the observed boot-id stream (`301-ECHO-FENCE-DESIGN.md` §2.4): fired on the FIRST
|
|
239
|
-
* observed daemon boot id and on every change — the backend's client-local boot ordinals for
|
|
240
|
-
* the direction-B pin fence. A late registration is replayed the current id immediately, so
|
|
241
|
-
* ordinal 0 is never missed on an already-open connection. */
|
|
242
|
-
onBootId(handler: (bootId: string) => void): void {
|
|
243
|
-
this.bootIdHandler = handler;
|
|
244
|
-
if (this.lastBootId !== undefined) handler(this.lastBootId);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
265
|
expectClientSchema(tables: NormalizedTableSchema[]): void {
|
|
248
266
|
this.clientTables = tables;
|
|
249
267
|
}
|
|
@@ -370,6 +388,13 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
370
388
|
}
|
|
371
389
|
|
|
372
390
|
private onServerMsg(msg: ServerMsg): void {
|
|
391
|
+
if (msg.t === "affinity") {
|
|
392
|
+
// Connection-level: the follower minted/refreshed this connection's placement ticket. Persist
|
|
393
|
+
// it (via the store) so the next connect offers it as a subprotocol and the lease POST forwards
|
|
394
|
+
// it — both legs then pin THIS follower (§4). Off ⇒ no store ⇒ dropped.
|
|
395
|
+
this.affinityStore?.set(msg.ticket);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
373
398
|
if (msg.t === "progress") {
|
|
374
399
|
this.progressHandler(msg.frame);
|
|
375
400
|
return;
|
|
@@ -426,16 +451,11 @@ export class RemoteOptimisticSource implements OptimisticSource {
|
|
|
426
451
|
this.resubscribeAll();
|
|
427
452
|
}
|
|
428
453
|
|
|
429
|
-
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart.
|
|
430
|
-
* Every NEW id (including the first) also feeds {@link onBootId} — the §301 boot-ordinal
|
|
431
|
-
* stream. */
|
|
454
|
+
/** Track the daemon's boot id; a change (after the first) means it restarted — fire onRestart. */
|
|
432
455
|
private observeBootId(bootId: string | undefined): void {
|
|
433
456
|
if (!bootId) return;
|
|
434
457
|
if (this.lastBootId !== undefined && bootId !== this.lastBootId) this.restartHandler();
|
|
435
|
-
|
|
436
|
-
this.lastBootId = bootId;
|
|
437
|
-
this.bootIdHandler(bootId);
|
|
438
|
-
}
|
|
458
|
+
this.lastBootId = bootId;
|
|
439
459
|
}
|
|
440
460
|
|
|
441
461
|
/** Route a `queryError` by its 101 §5 classification: retryable ⇒ keep the QState (and the
|
package/src/protocol.ts
CHANGED
|
@@ -141,6 +141,12 @@ export type ServerMsg =
|
|
|
141
141
|
// stranding the subscription (FOLLOWER-LAG-SHED §6.3).
|
|
142
142
|
| { t: "queryError"; queryId: number; message: string; code?: string; retryable?: boolean; retryAfterMs?: number }
|
|
143
143
|
| { t: "progress"; frame: ProgressFrame }
|
|
144
|
+
// The follower-affinity ticket (FOLLOWER-AFFINITY-DESIGN.md §3), minted by the fleet follower as
|
|
145
|
+
// the FIRST frame after the ws opens (`rust/rindle-server/src/net.rs` `serve_ws_conn`). Opaque +
|
|
146
|
+
// connection-level (no `queryId`, no `cv`): the client persists it and offers it as a subprotocol
|
|
147
|
+
// on the next connect + forwards it on the lease POST so both legs pin the same follower. Absent
|
|
148
|
+
// on a single/affinity-off daemon (never sent) — old clients drop the unknown `t`.
|
|
149
|
+
| { t: "affinity"; ticket: string }
|
|
144
150
|
// The room deopt handshake's verdict frame (RINDLE-REALTIME-QUERY-ENABLEMENT §3.3, H-iv-b):
|
|
145
151
|
// sent on the author's socket for every NON-applied mutation, BEFORE the lmid ack that burns
|
|
146
152
|
// the mid; `name`/`args` ride `kind:"deopt"` only (self-contained re-invoke). Connection-level
|
package/src/transport.ts
CHANGED
|
@@ -29,6 +29,11 @@ export interface Transport {
|
|
|
29
29
|
* it reopens and fires `onReconnect` so the source rebuilds its subscriptions. */
|
|
30
30
|
export class WsTransport implements Transport {
|
|
31
31
|
private readonly url: string;
|
|
32
|
+
/** Reads the subprotocols to offer at each (re)connect — in affinity mode, `["rindle.v1", "aff.…"]`
|
|
33
|
+
* with the CURRENT ticket (FOLLOWER-AFFINITY-DESIGN.md §5). Undefined ⇒ offer none (today's
|
|
34
|
+
* single-daemon behavior, byte-identical). Evaluated per connect so a reconnect presents the
|
|
35
|
+
* freshest (or freshly cleared) ticket. */
|
|
36
|
+
private readonly subprotocols?: () => string[];
|
|
32
37
|
private ws: WebSocket;
|
|
33
38
|
private handler: (msg: ServerMsg) => void = () => {};
|
|
34
39
|
private reconnectHandler: () => void = () => {};
|
|
@@ -46,14 +51,18 @@ export class WsTransport implements Transport {
|
|
|
46
51
|
* storm while a follower is gone). */
|
|
47
52
|
private downFired = false;
|
|
48
53
|
|
|
49
|
-
constructor(url: string, opts: { downThreshold?: number } = {}) {
|
|
54
|
+
constructor(url: string, opts: { downThreshold?: number; subprotocols?: () => string[] } = {}) {
|
|
50
55
|
this.url = url;
|
|
51
56
|
this.downThreshold = opts.downThreshold ?? 4;
|
|
57
|
+
this.subprotocols = opts.subprotocols;
|
|
52
58
|
this.ws = this.connect();
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
private connect(): WebSocket {
|
|
56
|
-
|
|
62
|
+
// Offer the affinity subprotocols (base + current ticket) when configured; otherwise open bare,
|
|
63
|
+
// exactly as before. An empty list is treated as bare (never send `Sec-WebSocket-Protocol: `).
|
|
64
|
+
const protocols = this.subprotocols?.();
|
|
65
|
+
const ws = protocols && protocols.length > 0 ? new WebSocket(this.url, protocols) : new WebSocket(this.url);
|
|
57
66
|
ws.addEventListener("open", () => {
|
|
58
67
|
this.open = true;
|
|
59
68
|
this.attempt = 0;
|