@rindle/remote 0.5.0 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,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"}
@@ -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";
@@ -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;AAChD,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"}
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;AAW7C,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
+ {"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":"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"}
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?.(() => this.resync());
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 || !this.sawRoutedEndpoint)
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
- if (bootId !== this.lastBootId) {
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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"}
@@ -91,6 +91,9 @@ export type ServerMsg = {
91
91
  } | {
92
92
  t: "progress";
93
93
  frame: ProgressFrame;
94
+ } | {
95
+ t: "affinity";
96
+ ticket: string;
94
97
  } | {
95
98
  t: "mutationOutcome";
96
99
  mid: number;
@@ -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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"}
@@ -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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"}
@@ -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;
@@ -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;IAM9D,OAAO,CAAC,OAAO;IA8Bf,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"}
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
- const ws = new WebSocket(this.url);
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;
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
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.5.0",
3
+ "version": "0.6.4",
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.5.0"
28
+ "@rindle/client": "0.6.4"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^22.10.0",
@@ -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,
@@ -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?.(() => this.resync());
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 || !this.sawRoutedEndpoint) return;
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
- if (bootId !== this.lastBootId) {
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
- const ws = new WebSocket(this.url);
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;