@crowdedkingdoms/crowdyjs 13.4.0 → 13.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +15 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +15 -0
- package/dist/crowdy-client.d.ts +19 -0
- package/dist/crowdy-client.d.ts.map +1 -1
- package/dist/crowdy-client.js +21 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/realtime.d.ts +54 -2
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +97 -2
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -68,7 +68,8 @@ export interface GraphQLClientConfig {
|
|
|
68
68
|
* Also exported under the alias {@link GraphQLTransport}.
|
|
69
69
|
*/
|
|
70
70
|
export declare class GraphQLClient {
|
|
71
|
-
|
|
71
|
+
/** Mutable: direct-connect re-discovery moves it to another instance. */
|
|
72
|
+
private graphqlEndpoint;
|
|
72
73
|
private readonly timeout;
|
|
73
74
|
private readonly session;
|
|
74
75
|
private readonly logger;
|
|
@@ -87,6 +88,19 @@ export declare class GraphQLClient {
|
|
|
87
88
|
* @returns The absolute endpoint URL.
|
|
88
89
|
*/
|
|
89
90
|
getEndpoint(): string;
|
|
91
|
+
/**
|
|
92
|
+
* Point subsequent requests at a different instance.
|
|
93
|
+
*
|
|
94
|
+
* Only meaningful under direct connect, where the endpoint names one api
|
|
95
|
+
* instance rather than a load balancer. It exists so HTTP can be moved in
|
|
96
|
+
* the SAME step as the WebSocket: the UDP proxy session and the relay
|
|
97
|
+
* session are per-process, so a client with its HTTP on one instance and
|
|
98
|
+
* its subscription on another gets no realtime traffic at all — the exact
|
|
99
|
+
* failure the sticky LB cookie was invented to prevent.
|
|
100
|
+
*
|
|
101
|
+
* @param endpoint Absolute GraphQL URL to POST to from now on.
|
|
102
|
+
*/
|
|
103
|
+
setEndpoint(endpoint: string): void;
|
|
90
104
|
/**
|
|
91
105
|
* Execute a typed GraphQL operation produced by codegen and return its
|
|
92
106
|
* `data` payload. This is the preferred entry point: the
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IACxB,yEAAyE;IACzE,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgB;IAE/C;;;;;;OAMG;gBACS,MAAM,EAAE,mBAAmB,YAAK,EAAE,OAAO,EAAE,YAAY;IAWnE;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,OAAO,CAAC,OAAO,EAAE,UAAU,EAC/B,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,EAChD,SAAS,CAAC,EAAE,UAAU,EACtB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,OAAO,CAAC;IASnB;;;;;;;;;;;;;;;;;;;OAmBG;IACG,KAAK,CAAC,CAAC,GAAG,GAAG,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACrC,OAAO,CAAC,CAAC,CAAC;CAmDd;AAED;;;GAGG;AACH,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -56,6 +56,21 @@ export class GraphQLClient {
|
|
|
56
56
|
getEndpoint() {
|
|
57
57
|
return this.graphqlEndpoint;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Point subsequent requests at a different instance.
|
|
61
|
+
*
|
|
62
|
+
* Only meaningful under direct connect, where the endpoint names one api
|
|
63
|
+
* instance rather than a load balancer. It exists so HTTP can be moved in
|
|
64
|
+
* the SAME step as the WebSocket: the UDP proxy session and the relay
|
|
65
|
+
* session are per-process, so a client with its HTTP on one instance and
|
|
66
|
+
* its subscription on another gets no realtime traffic at all — the exact
|
|
67
|
+
* failure the sticky LB cookie was invented to prevent.
|
|
68
|
+
*
|
|
69
|
+
* @param endpoint Absolute GraphQL URL to POST to from now on.
|
|
70
|
+
*/
|
|
71
|
+
setEndpoint(endpoint) {
|
|
72
|
+
this.graphqlEndpoint = endpoint;
|
|
73
|
+
}
|
|
59
74
|
/**
|
|
60
75
|
* Execute a typed GraphQL operation produced by codegen and return its
|
|
61
76
|
* `data` payload. This is the preferred entry point: the
|
package/dist/crowdy-client.d.ts
CHANGED
|
@@ -128,6 +128,25 @@ export interface CrowdyClientConfig {
|
|
|
128
128
|
* realtime WebSocket URL with its path replaced by `/realtime`.
|
|
129
129
|
*/
|
|
130
130
|
binaryRelayUrl?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Ask where to reconnect when the current instance stops answering.
|
|
133
|
+
*
|
|
134
|
+
* Only needed under direct connect, where `gameApiUrl` names one api
|
|
135
|
+
* instance rather than a load balancer, so retrying it forever cannot
|
|
136
|
+
* recover from that instance going away. Wire it to whatever produced the
|
|
137
|
+
* URLs in the first place — usually `mintAppToken`, which picks a
|
|
138
|
+
* low-load instance — and the client will move itself.
|
|
139
|
+
*
|
|
140
|
+
* The returned pair is applied together: see the note on
|
|
141
|
+
* `GraphQLClient.setEndpoint` for why splitting HTTP and WS across two
|
|
142
|
+
* instances is worse than staying on a dead one.
|
|
143
|
+
*/
|
|
144
|
+
rediscover?: () => Promise<{
|
|
145
|
+
httpUrl?: string | null;
|
|
146
|
+
wsUrl?: string | null;
|
|
147
|
+
} | null>;
|
|
148
|
+
/** Consecutive failures before re-discovering. Defaults to 3. */
|
|
149
|
+
rediscoverAfterFailures?: number;
|
|
131
150
|
};
|
|
132
151
|
/**
|
|
133
152
|
* Optional sticky-LB cookie jar shared with the game-api HTTP client. Node
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crowdy-client.d.ts","sourceRoot":"","sources":["../src/crowdy-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"crowdy-client.d.ts","sourceRoot":"","sources":["../src/crowdy-client.ts"],"names":[],"mappings":"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"}
|
package/dist/crowdy-client.js
CHANGED
|
@@ -75,11 +75,31 @@ export class CrowdyClient {
|
|
|
75
75
|
lbCookieStore,
|
|
76
76
|
}, this.session);
|
|
77
77
|
this.metrics = new RealtimeMetrics();
|
|
78
|
+
const { rediscover, ...realtimeConfig } = config.realtime ?? {};
|
|
78
79
|
this.realtime = new SubscriptionManager({
|
|
79
80
|
wsEndpoint: config.wsEndpoint ?? toGraphqlEndpoint(config.wsUrl, 'graphql'),
|
|
80
81
|
logger: config.logger,
|
|
81
82
|
lbCookieStore,
|
|
82
|
-
...
|
|
83
|
+
...realtimeConfig,
|
|
84
|
+
// Moving the websocket without moving HTTP would split one session
|
|
85
|
+
// across two instances, and both the UDP proxy socket and the relay
|
|
86
|
+
// worker are per-process — the client would look connected and
|
|
87
|
+
// receive nothing. So the two are applied as one step here rather
|
|
88
|
+
// than being left to the caller to remember.
|
|
89
|
+
...(rediscover
|
|
90
|
+
? {
|
|
91
|
+
rediscover: async () => {
|
|
92
|
+
const next = await rediscover();
|
|
93
|
+
if (!next)
|
|
94
|
+
return null;
|
|
95
|
+
if (next.httpUrl) {
|
|
96
|
+
this.graphql.setEndpoint(toGraphqlEndpoint(next.httpUrl, 'graphql') ??
|
|
97
|
+
next.httpUrl);
|
|
98
|
+
}
|
|
99
|
+
return { wsUrl: toGraphqlEndpoint(next.wsUrl ?? undefined, 'graphql') ?? null };
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
: {}),
|
|
83
103
|
}, this.session, this.metrics);
|
|
84
104
|
const managementGraphqlEndpoint = config.managementGraphqlEndpoint ??
|
|
85
105
|
toGraphqlEndpoint(config.managementUrl, 'graphql') ??
|
package/dist/index.d.ts
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* or internal tooling, never an untrusted browser.
|
|
46
46
|
*/
|
|
47
47
|
/** The published package version. Mirrors `package.json`. */
|
|
48
|
-
export declare const VERSION = "13.
|
|
48
|
+
export declare const VERSION = "13.5.0";
|
|
49
49
|
export { LbCookieStore } from './lb-cookie-store.js';
|
|
50
50
|
export { CrowdyClient, createCrowdyClient, type CrowdyClientConfig, } from './crowdy-client.js';
|
|
51
51
|
export { BrowserLocalStorageTokenStore, SessionStore, type SessionListener, type TokenStore, } from './session.js';
|
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
* or internal tooling, never an untrusted browser.
|
|
46
46
|
*/
|
|
47
47
|
/** The published package version. Mirrors `package.json`. */
|
|
48
|
-
export const VERSION = '13.
|
|
48
|
+
export const VERSION = '13.5.0';
|
|
49
49
|
export { LbCookieStore } from './lb-cookie-store.js';
|
|
50
50
|
export { CrowdyClient, createCrowdyClient, } from './crowdy-client.js';
|
|
51
51
|
export { BrowserLocalStorageTokenStore, SessionStore, } from './session.js';
|
package/dist/realtime.d.ts
CHANGED
|
@@ -198,6 +198,30 @@ export interface RealtimeConfig {
|
|
|
198
198
|
* {@link RealtimeClient.waitForSequence}). Defaults to `5000`.
|
|
199
199
|
*/
|
|
200
200
|
waitTimeoutMs?: number;
|
|
201
|
+
/**
|
|
202
|
+
* Ask where to connect, when the current instance stops answering.
|
|
203
|
+
*
|
|
204
|
+
* Under direct connect a client is pinned to ONE api instance, so a
|
|
205
|
+
* reconnect loop against a dead or drained address never recovers — the
|
|
206
|
+
* instance the URL names is gone. This is called after
|
|
207
|
+
* {@link rediscoverAfterFailures} consecutive failures, and immediately when
|
|
208
|
+
* the server says it is draining, to ask the load balancer for a new one.
|
|
209
|
+
* The same idea as CrowdyCPP's `doAssign()` on Buddy's COMMAND_RECONNECT.
|
|
210
|
+
*
|
|
211
|
+
* Return null to keep the current URL (nothing better is available).
|
|
212
|
+
* Omitting it entirely keeps the old behaviour: retry one URL forever.
|
|
213
|
+
*/
|
|
214
|
+
rediscover?: () => Promise<{
|
|
215
|
+
wsUrl?: string | null;
|
|
216
|
+
} | null>;
|
|
217
|
+
/**
|
|
218
|
+
* Consecutive connection failures before re-discovery. Defaults to `3`.
|
|
219
|
+
*
|
|
220
|
+
* Not 1: an instance is usually still there and a single failure is far
|
|
221
|
+
* more often a blip than a dead server, and re-resolving on every blip
|
|
222
|
+
* would move clients off healthy instances for no reason.
|
|
223
|
+
*/
|
|
224
|
+
rediscoverAfterFailures?: number;
|
|
201
225
|
/** Optional logger for realtime diagnostics. Defaults to a silent logger. */
|
|
202
226
|
logger?: CrowdyLogger;
|
|
203
227
|
/**
|
|
@@ -251,16 +275,24 @@ export interface RealtimeConfig {
|
|
|
251
275
|
export declare class RealtimeClient {
|
|
252
276
|
private readonly session;
|
|
253
277
|
private readonly metrics?;
|
|
254
|
-
|
|
278
|
+
/** Mutable: re-discovery replaces it in place. */
|
|
279
|
+
private wsUrl;
|
|
255
280
|
private readonly logger;
|
|
256
281
|
private readonly retryAttempts;
|
|
282
|
+
private readonly rediscover?;
|
|
283
|
+
private readonly rediscoverAfterFailures;
|
|
284
|
+
/** Consecutive failed connects; reset by a successful one. */
|
|
285
|
+
private connectFailures;
|
|
286
|
+
/** Guards against several failing attempts all re-resolving at once. */
|
|
287
|
+
private rediscovering;
|
|
257
288
|
private readonly retryInitialDelayMs;
|
|
258
289
|
private readonly retryMaxDelayMs;
|
|
259
290
|
private readonly waitTimeoutMs;
|
|
260
291
|
private readonly lbCookieStore?;
|
|
261
292
|
private readonly wsUplinkMutations;
|
|
262
293
|
private readonly binaryTransport;
|
|
263
|
-
|
|
294
|
+
/** Mutable alongside wsUrl: re-discovery moves both. */
|
|
295
|
+
private binaryRelayUrl;
|
|
264
296
|
private binaryRelay;
|
|
265
297
|
private binaryUnavailable;
|
|
266
298
|
private client;
|
|
@@ -390,6 +422,20 @@ export declare class RealtimeClient {
|
|
|
390
422
|
private openSubscription;
|
|
391
423
|
private ensureBinarySubscription;
|
|
392
424
|
private restart;
|
|
425
|
+
/**
|
|
426
|
+
* Ask discovery for a different instance and reconnect to it.
|
|
427
|
+
*
|
|
428
|
+
* Coalesced: several failing attempts arriving together must not produce
|
|
429
|
+
* several discovery calls, which would spread one client's reconnect across
|
|
430
|
+
* several instances and defeat the point of being pinned to one.
|
|
431
|
+
*
|
|
432
|
+
* Never throws. Discovery being unreachable is not worse than the situation
|
|
433
|
+
* that prompted the call, and the existing backoff keeps retrying the URL we
|
|
434
|
+
* already have.
|
|
435
|
+
*/
|
|
436
|
+
private rediscoverEndpoint;
|
|
437
|
+
/** Drop the relay so the next subscribe builds one against the new URL. */
|
|
438
|
+
private restartBinaryRelay;
|
|
393
439
|
private dispatch;
|
|
394
440
|
private resolvePending;
|
|
395
441
|
private removePending;
|
|
@@ -397,4 +443,10 @@ export declare class RealtimeClient {
|
|
|
397
443
|
private dispatchError;
|
|
398
444
|
private setStatus;
|
|
399
445
|
}
|
|
446
|
+
/**
|
|
447
|
+
* Emitted by an instance the control plane has asked to drain. Matches the
|
|
448
|
+
* server's RealtimeConnectionEvent code so a rolling deploy can move clients
|
|
449
|
+
* off before it stops, instead of dropping them and letting them find out.
|
|
450
|
+
*/
|
|
451
|
+
export declare const SERVER_DRAINING_CODE = "SERVER_DRAINING";
|
|
400
452
|
//# sourceMappingURL=realtime.d.ts.map
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,GACd,cAAc,GACd,QAAQ,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CACvC,4BAA4B,CAAC,kBAAkB,CAAC,CACjD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,CACvC,eAAe,EACf;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAC3B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC3G;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,qBAAqB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/G;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC3G;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,qBAAqB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/G;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACrG,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,wBAAwB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACnG;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC3G;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC3G;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,gCAAgC,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACzH;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,4BAA4B,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACjH;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACzG;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,UAAU,CAAC,EAAE,yBAAyB,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC/G;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC7C;;;OAGG;IACH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,KAAK,IAAI,CAAC;CAC/C;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime.js
CHANGED
|
@@ -38,6 +38,10 @@ export class RealtimeClient {
|
|
|
38
38
|
constructor(config = {}, session, metrics) {
|
|
39
39
|
this.session = session;
|
|
40
40
|
this.metrics = metrics;
|
|
41
|
+
/** Consecutive failed connects; reset by a successful one. */
|
|
42
|
+
this.connectFailures = 0;
|
|
43
|
+
/** Guards against several failing attempts all re-resolving at once. */
|
|
44
|
+
this.rediscovering = null;
|
|
41
45
|
this.binaryRelay = null;
|
|
42
46
|
this.binaryUnavailable = false;
|
|
43
47
|
this.client = null;
|
|
@@ -54,6 +58,8 @@ export class RealtimeClient {
|
|
|
54
58
|
this.subscribedAppId = null;
|
|
55
59
|
this.opening = null;
|
|
56
60
|
this.wsUrl = config.wsUrl || config.wsEndpoint || 'ws://localhost:3000/graphql';
|
|
61
|
+
this.rediscover = config.rediscover;
|
|
62
|
+
this.rediscoverAfterFailures = config.rediscoverAfterFailures ?? 3;
|
|
57
63
|
this.logger = config.logger ?? silentLogger;
|
|
58
64
|
this.retryAttempts = config.retryAttempts ?? 8;
|
|
59
65
|
this.retryInitialDelayMs = config.retryInitialDelayMs ?? 250;
|
|
@@ -387,7 +393,10 @@ export class RealtimeClient {
|
|
|
387
393
|
this.setStatus('connecting');
|
|
388
394
|
const webSocketImpl = createStickyWebSocketImpl(this.lbCookieStore);
|
|
389
395
|
this.client = createClient({
|
|
390
|
-
|
|
396
|
+
// A function, not a string: graphql-ws calls it on every connect, so a
|
|
397
|
+
// re-discovered address is picked up by the reconnect already in
|
|
398
|
+
// flight rather than needing the client to be torn down and rebuilt.
|
|
399
|
+
url: () => this.wsUrl,
|
|
391
400
|
lazy: true,
|
|
392
401
|
retryAttempts: this.retryAttempts,
|
|
393
402
|
...(webSocketImpl ? { webSocketImpl } : {}),
|
|
@@ -416,7 +425,10 @@ export class RealtimeClient {
|
|
|
416
425
|
await new Promise((resolve) => setTimeout(resolve, delay + jitter));
|
|
417
426
|
},
|
|
418
427
|
on: {
|
|
419
|
-
connected: () =>
|
|
428
|
+
connected: () => {
|
|
429
|
+
this.connectFailures = 0;
|
|
430
|
+
this.setStatus('connected');
|
|
431
|
+
},
|
|
420
432
|
closed: () => {
|
|
421
433
|
if (this.desired) {
|
|
422
434
|
this.setStatus('reconnecting');
|
|
@@ -427,6 +439,16 @@ export class RealtimeClient {
|
|
|
427
439
|
},
|
|
428
440
|
error: (error) => {
|
|
429
441
|
this.logger.error?.('Realtime WebSocket error', error);
|
|
442
|
+
// Under direct connect the URL names one instance, so repeated
|
|
443
|
+
// failures are evidence the instance is gone rather than that the
|
|
444
|
+
// network is briefly unhappy. Retrying the same address forever
|
|
445
|
+
// would leave the client permanently offline while the rest of the
|
|
446
|
+
// fleet is healthy.
|
|
447
|
+
this.connectFailures += 1;
|
|
448
|
+
if (this.desired &&
|
|
449
|
+
this.connectFailures >= this.rediscoverAfterFailures) {
|
|
450
|
+
void this.rediscoverEndpoint('repeated connection failures');
|
|
451
|
+
}
|
|
430
452
|
this.dispatchError(new CrowdyRealtimeError('Realtime WebSocket error', {
|
|
431
453
|
code: 'WEBSOCKET_ERROR',
|
|
432
454
|
retryable: true,
|
|
@@ -522,9 +544,76 @@ export class RealtimeClient {
|
|
|
522
544
|
this.client = null;
|
|
523
545
|
this.ensureSubscription();
|
|
524
546
|
}
|
|
547
|
+
/**
|
|
548
|
+
* Ask discovery for a different instance and reconnect to it.
|
|
549
|
+
*
|
|
550
|
+
* Coalesced: several failing attempts arriving together must not produce
|
|
551
|
+
* several discovery calls, which would spread one client's reconnect across
|
|
552
|
+
* several instances and defeat the point of being pinned to one.
|
|
553
|
+
*
|
|
554
|
+
* Never throws. Discovery being unreachable is not worse than the situation
|
|
555
|
+
* that prompted the call, and the existing backoff keeps retrying the URL we
|
|
556
|
+
* already have.
|
|
557
|
+
*/
|
|
558
|
+
async rediscoverEndpoint(reason) {
|
|
559
|
+
if (!this.rediscover)
|
|
560
|
+
return;
|
|
561
|
+
if (this.rediscovering)
|
|
562
|
+
return this.rediscovering;
|
|
563
|
+
this.rediscovering = (async () => {
|
|
564
|
+
try {
|
|
565
|
+
const next = await this.rediscover();
|
|
566
|
+
const wsUrl = next?.wsUrl;
|
|
567
|
+
if (!wsUrl || wsUrl === this.wsUrl) {
|
|
568
|
+
this.logger.debug?.(`Re-discovery (${reason}) returned no new endpoint; staying on ${this.wsUrl}`);
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
this.logger.warn?.(`Re-discovery (${reason}): moving realtime from ${this.wsUrl} to ${wsUrl}`);
|
|
572
|
+
this.wsUrl = wsUrl;
|
|
573
|
+
this.binaryRelayUrl = deriveBinaryRelayUrl(wsUrl);
|
|
574
|
+
this.connectFailures = 0;
|
|
575
|
+
// The graphql-ws client reads its URL through a function, so the
|
|
576
|
+
// reconnect already in flight picks this up. The binary relay holds
|
|
577
|
+
// its URL at construction, so it has to be rebuilt.
|
|
578
|
+
this.restartBinaryRelay();
|
|
579
|
+
}
|
|
580
|
+
catch (error) {
|
|
581
|
+
this.logger.warn?.(`Re-discovery (${reason}) failed; continuing with ${this.wsUrl}`, error);
|
|
582
|
+
}
|
|
583
|
+
finally {
|
|
584
|
+
this.rediscovering = null;
|
|
585
|
+
}
|
|
586
|
+
})();
|
|
587
|
+
return this.rediscovering;
|
|
588
|
+
}
|
|
589
|
+
/** Drop the relay so the next subscribe builds one against the new URL. */
|
|
590
|
+
restartBinaryRelay() {
|
|
591
|
+
if (!this.binaryRelay)
|
|
592
|
+
return;
|
|
593
|
+
try {
|
|
594
|
+
this.binaryRelay.disconnect();
|
|
595
|
+
}
|
|
596
|
+
catch {
|
|
597
|
+
// Already closing; the point is only that it stops using the old URL.
|
|
598
|
+
}
|
|
599
|
+
this.binaryRelay = null;
|
|
600
|
+
if (this.desired && this.binaryTransport && !this.binaryUnavailable) {
|
|
601
|
+
this.ensureBinarySubscription();
|
|
602
|
+
}
|
|
603
|
+
}
|
|
525
604
|
dispatch(notification) {
|
|
526
605
|
this.metrics?.recordReceived(notificationKind(notification.__typename), payloadBytesOf(notification));
|
|
527
606
|
this.resolvePending(notification);
|
|
607
|
+
// The instance is going away on purpose. Move now rather than waiting to
|
|
608
|
+
// fail: during a rolling deploy the server knows it is about to stop, and
|
|
609
|
+
// a client that waits for the socket to drop loses the seconds between
|
|
610
|
+
// the warning and the shutdown. Retryable, unlike the events below —
|
|
611
|
+
// there IS somewhere else to go, which is the whole point of the signal.
|
|
612
|
+
if (notification.__typename === 'RealtimeConnectionEvent' &&
|
|
613
|
+
notification.code === SERVER_DRAINING_CODE) {
|
|
614
|
+
this.logger.warn?.('Server is draining; re-discovering a realtime endpoint');
|
|
615
|
+
void this.rediscoverEndpoint('server draining');
|
|
616
|
+
}
|
|
528
617
|
// A non-retryable connection event (e.g. APP_ID_REQUIRED, AUTH_REQUIRED)
|
|
529
618
|
// means the server completed the subscription and resubscribing would just
|
|
530
619
|
// be rejected again. Stop wanting the connection so the `complete` handler
|
|
@@ -656,6 +745,12 @@ function notificationKind(typename) {
|
|
|
656
745
|
return 'unknown';
|
|
657
746
|
return NOTIFICATION_KINDS[typename] ?? typename;
|
|
658
747
|
}
|
|
748
|
+
/**
|
|
749
|
+
* Emitted by an instance the control plane has asked to drain. Matches the
|
|
750
|
+
* server's RealtimeConnectionEvent code so a rolling deploy can move clients
|
|
751
|
+
* off before it stops, instead of dropping them and letting them find out.
|
|
752
|
+
*/
|
|
753
|
+
export const SERVER_DRAINING_CODE = 'SERVER_DRAINING';
|
|
659
754
|
/** Default relay endpoint: the realtime wsUrl with its path set to /realtime. */
|
|
660
755
|
function deriveBinaryRelayUrl(wsUrl) {
|
|
661
756
|
try {
|
package/package.json
CHANGED