@crowdedkingdomstudios/crowdyjs 4.3.0 → 5.0.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/MIGRATION.md +30 -0
- package/dist/domains/udp.d.ts +9 -5
- package/dist/domains/udp.d.ts.map +1 -1
- package/dist/domains/udp.js +10 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/realtime.d.ts +2 -1
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +26 -2
- package/dist/world.js +1 -1
- package/package.json +1 -1
package/MIGRATION.md
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
# CrowdyJS v5 Migration Notes
|
|
2
|
+
|
|
3
|
+
CrowdyJS v5 makes the realtime subscription **app-scoped** to fix a cross-app
|
|
4
|
+
notification leak: a single game token is app-agnostic and one UDP proxy
|
|
5
|
+
session is shared by every subscription on that token, so a token reused across
|
|
6
|
+
apps (e.g. a player in multiple tabs/apps) used to receive other apps' spatial
|
|
7
|
+
fan-out.
|
|
8
|
+
|
|
9
|
+
## Breaking change
|
|
10
|
+
|
|
11
|
+
- `client.udp.subscribe(handlers, appId)` — **`appId` is now required**. The
|
|
12
|
+
game-api fences `udpNotifications` by app and **rejects app-agnostic
|
|
13
|
+
subscriptions** with a `RealtimeConnectionEvent` `code = 'APP_ID_REQUIRED'`.
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// Before (v4):
|
|
17
|
+
client.udp.subscribe({ actorUpdate });
|
|
18
|
+
// After (v5):
|
|
19
|
+
client.udp.subscribe({ actorUpdate }, '1');
|
|
20
|
+
// Or use the world helper, which passes its appId automatically:
|
|
21
|
+
client.world('1').subscribe({ actorUpdate });
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Run one client per app (sharing the same `tokenStore`) when a player is in
|
|
25
|
+
multiple apps at once.
|
|
26
|
+
|
|
27
|
+
- Requires a game-api that enforces the app fence (`cks-game-api >= v0.9.0`).
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
1
31
|
# CrowdyJS v3 Migration Notes
|
|
2
32
|
|
|
3
33
|
CrowdyJS v3 is a breaking rewrite focused on browser game clients.
|
package/dist/domains/udp.d.ts
CHANGED
|
@@ -54,12 +54,16 @@ export declare class UdpAPI {
|
|
|
54
54
|
*/
|
|
55
55
|
sendChannelMessage(input: SendChannelMessageMutationVariables['input']): Promise<boolean>;
|
|
56
56
|
/**
|
|
57
|
-
* Subscribe to udpNotifications. Pass any combination of
|
|
58
|
-
* handlers; the returned function detaches all of them. The first
|
|
59
|
-
* subscriber opens the shared WebSocket; the last one to leave closes
|
|
60
|
-
*
|
|
57
|
+
* Subscribe to udpNotifications for a single app. Pass any combination of
|
|
58
|
+
* typename handlers; the returned function detaches all of them. The first
|
|
59
|
+
* subscriber opens the shared WebSocket; the last one to leave closes it.
|
|
60
|
+
*
|
|
61
|
+
* `appId` is required and scopes the subscription to one app: the game-api
|
|
62
|
+
* only delivers that app's spatial notifications and rejects app-agnostic
|
|
63
|
+
* subscriptions (a single game token reused across apps would otherwise
|
|
64
|
+
* cross-deliver). Use a separate client per app (sharing the token store).
|
|
61
65
|
*/
|
|
62
|
-
subscribe(handlers: UdpNotificationHandlers): () => void;
|
|
66
|
+
subscribe(handlers: UdpNotificationHandlers, appId: string): () => void;
|
|
63
67
|
private withSequence;
|
|
64
68
|
}
|
|
65
69
|
//# sourceMappingURL=udp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/domains/udp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,uBAAuB,EAG5B,KAAK,6BAA6B,EAElC,KAAK,gCAAgC,EAErC,KAAK,gCAAgC,EAErC,KAAK,gCAAgC,EAErC,KAAK,+BAA+B,EAEpC,KAAK,gCAAgC,EAErC,KAAK,uCAAuC,EAE5C,KAAK,mCAAmC,EACzC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D;;;;;;GAMG;AACH,qBAAa,MAAM;IAIf,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI;IAJd,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;gBAG3C,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,mBAAmB;IAG7B,OAAO,IAAI,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAK9D,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,gBAAgB,IAAI,OAAO,CAC/B,6BAA6B,CAAC,0BAA0B,CAAC,CAC1D;IAQK,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,cAAc,CAClB,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,GAC9C,OAAO,CAAC,OAAO,CAAC;IAKb,qBAAqB,CACzB,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,EAC/C,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAO/B;;;;;;OAMG;IACG,sBAAsB,CAC1B,KAAK,EAAE,uCAAuC,CAAC,OAAO,CAAC,GACtD,OAAO,CAAC,OAAO,CAAC;IAOnB;;;;;;OAMG;IACG,kBAAkB,CACtB,KAAK,EAAE,mCAAmC,CAAC,OAAO,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC;IAKnB
|
|
1
|
+
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/domains/udp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,KAAK,uBAAuB,EAG5B,KAAK,6BAA6B,EAElC,KAAK,gCAAgC,EAErC,KAAK,gCAAgC,EAErC,KAAK,gCAAgC,EAErC,KAAK,+BAA+B,EAEpC,KAAK,gCAAgC,EAErC,KAAK,uCAAuC,EAE5C,KAAK,mCAAmC,EACzC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D;;;;;;GAMG;AACH,qBAAa,MAAM;IAIf,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI;IAJd,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;gBAG3C,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,mBAAmB;IAG7B,OAAO,IAAI,OAAO,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAK9D,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,gBAAgB,IAAI,OAAO,CAC/B,6BAA6B,CAAC,0BAA0B,CAAC,CAC1D;IAQK,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,cAAc,CAClB,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,GAC9C,OAAO,CAAC,OAAO,CAAC;IAKb,qBAAqB,CACzB,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,EAC/C,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAOzB,eAAe,CACnB,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,GAC/C,OAAO,CAAC,OAAO,CAAC;IAKb,sBAAsB,CAC1B,KAAK,EAAE,gCAAgC,CAAC,OAAO,CAAC,EAChD,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,mBAAmB,CAAC;IAO/B;;;;;;OAMG;IACG,sBAAsB,CAC1B,KAAK,EAAE,uCAAuC,CAAC,OAAO,CAAC,GACtD,OAAO,CAAC,OAAO,CAAC;IAOnB;;;;;;OAMG;IACG,kBAAkB,CACtB,KAAK,EAAE,mCAAmC,CAAC,OAAO,CAAC,GAClD,OAAO,CAAC,OAAO,CAAC;IAKnB;;;;;;;;;OASG;IACH,SAAS,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI;IAIvE,OAAO,CAAC,YAAY;CAQrB"}
|
package/dist/domains/udp.js
CHANGED
|
@@ -100,13 +100,17 @@ export class UdpAPI {
|
|
|
100
100
|
return data.sendChannelMessage;
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
|
-
* Subscribe to udpNotifications. Pass any combination of
|
|
104
|
-
* handlers; the returned function detaches all of them. The first
|
|
105
|
-
* subscriber opens the shared WebSocket; the last one to leave closes
|
|
106
|
-
*
|
|
103
|
+
* Subscribe to udpNotifications for a single app. Pass any combination of
|
|
104
|
+
* typename handlers; the returned function detaches all of them. The first
|
|
105
|
+
* subscriber opens the shared WebSocket; the last one to leave closes it.
|
|
106
|
+
*
|
|
107
|
+
* `appId` is required and scopes the subscription to one app: the game-api
|
|
108
|
+
* only delivers that app's spatial notifications and rejects app-agnostic
|
|
109
|
+
* subscriptions (a single game token reused across apps would otherwise
|
|
110
|
+
* cross-deliver). Use a separate client per app (sharing the token store).
|
|
107
111
|
*/
|
|
108
|
-
subscribe(handlers) {
|
|
109
|
-
return this.subs.subscribe(handlers);
|
|
112
|
+
subscribe(handlers, appId) {
|
|
113
|
+
return this.subs.subscribe(handlers, appId);
|
|
110
114
|
}
|
|
111
115
|
withSequence(input) {
|
|
112
116
|
return {
|
package/dist/index.d.ts
CHANGED
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
*
|
|
27
27
|
* const { token, user } = await client.auth.login({ email, password });
|
|
28
28
|
* const me = await client.users.me();
|
|
29
|
-
* const unsub = client.udp.subscribe({
|
|
29
|
+
* const unsub = client.udp.subscribe({ actorUpdate: (n) => { ... } }, appId);
|
|
30
30
|
*
|
|
31
31
|
* Org / app / billing / payments / quotas operations are not in this
|
|
32
32
|
* package; consume `cks-management-api` directly (the management UI does)
|
|
33
33
|
* via Apollo, fetch, or a separate codegen client.
|
|
34
34
|
*/
|
|
35
|
-
export declare const VERSION = "
|
|
35
|
+
export declare const VERSION = "5.0.0";
|
|
36
36
|
export { CrowdyClient, createCrowdyClient, type CrowdyClientConfig, } from './crowdy-client.js';
|
|
37
37
|
export { BrowserLocalStorageTokenStore, SessionStore, type SessionListener, type TokenStore, } from './session.js';
|
|
38
38
|
export { GraphQLClient, GraphQLTransport, type GraphQLClientConfig, } from './client.js';
|
package/dist/index.js
CHANGED
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
*
|
|
27
27
|
* const { token, user } = await client.auth.login({ email, password });
|
|
28
28
|
* const me = await client.users.me();
|
|
29
|
-
* const unsub = client.udp.subscribe({
|
|
29
|
+
* const unsub = client.udp.subscribe({ actorUpdate: (n) => { ... } }, appId);
|
|
30
30
|
*
|
|
31
31
|
* Org / app / billing / payments / quotas operations are not in this
|
|
32
32
|
* package; consume `cks-management-api` directly (the management UI does)
|
|
33
33
|
* via Apollo, fetch, or a separate codegen client.
|
|
34
34
|
*/
|
|
35
|
-
export const VERSION = '
|
|
35
|
+
export const VERSION = '5.0.0';
|
|
36
36
|
export { CrowdyClient, createCrowdyClient, } from './crowdy-client.js';
|
|
37
37
|
export { BrowserLocalStorageTokenStore, SessionStore, } from './session.js';
|
|
38
38
|
export { GraphQLClient, GraphQLTransport, } from './client.js';
|
package/dist/realtime.d.ts
CHANGED
|
@@ -72,13 +72,14 @@ export declare class RealtimeClient {
|
|
|
72
72
|
private readonly subscribers;
|
|
73
73
|
private readonly pending;
|
|
74
74
|
private nextSubscriberId;
|
|
75
|
+
private subscribedAppId;
|
|
75
76
|
constructor(config: RealtimeConfig | undefined, session: SessionStore);
|
|
76
77
|
status(): RealtimeStatus;
|
|
77
78
|
onStatus(listener: (status: RealtimeStatus) => void): () => void;
|
|
78
79
|
connect(): void;
|
|
79
80
|
disconnect(): void;
|
|
80
81
|
close(): void;
|
|
81
|
-
subscribe(handlers: UdpNotificationHandlers): () => void;
|
|
82
|
+
subscribe(handlers: UdpNotificationHandlers, appId: string): () => void;
|
|
82
83
|
waitForSequence(sequenceNumber: number, timeoutMs?: number): Promise<SpatialNotification>;
|
|
83
84
|
private ensureSubscription;
|
|
84
85
|
private restart;
|
package/dist/realtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime.js
CHANGED
|
@@ -14,6 +14,10 @@ export class RealtimeClient {
|
|
|
14
14
|
this.subscribers = new Map();
|
|
15
15
|
this.pending = new Map();
|
|
16
16
|
this.nextSubscriberId = 1;
|
|
17
|
+
// App this realtime session is scoped to. Sent in connectionParams so the
|
|
18
|
+
// game-api only fans this app's spatial notifications to this subscription.
|
|
19
|
+
// The game-api rejects subscriptions that arrive without it.
|
|
20
|
+
this.subscribedAppId = null;
|
|
17
21
|
this.wsUrl = config.wsUrl || config.wsEndpoint || 'ws://localhost:3000/graphql';
|
|
18
22
|
this.logger = config.logger ?? silentLogger;
|
|
19
23
|
this.retryAttempts = config.retryAttempts ?? 8;
|
|
@@ -61,7 +65,11 @@ export class RealtimeClient {
|
|
|
61
65
|
this.subscribers.clear();
|
|
62
66
|
this.rejectAllPending(new CrowdyRealtimeError('Realtime client closed', { retryable: false }));
|
|
63
67
|
}
|
|
64
|
-
subscribe(handlers) {
|
|
68
|
+
subscribe(handlers, appId) {
|
|
69
|
+
// appId is required by the type; guard for JS callers so a missing value
|
|
70
|
+
// is sent as "no app" (cleanly rejected by the game-api) rather than the
|
|
71
|
+
// literal string "undefined".
|
|
72
|
+
this.subscribedAppId = appId != null ? String(appId) : null;
|
|
65
73
|
const id = `s${this.nextSubscriberId++}`;
|
|
66
74
|
this.subscribers.set(id, handlers);
|
|
67
75
|
this.connect();
|
|
@@ -104,7 +112,14 @@ export class RealtimeClient {
|
|
|
104
112
|
retryAttempts: this.retryAttempts,
|
|
105
113
|
connectionParams: () => {
|
|
106
114
|
const currentToken = this.session.getToken();
|
|
107
|
-
|
|
115
|
+
if (!currentToken)
|
|
116
|
+
return {};
|
|
117
|
+
const params = {
|
|
118
|
+
Authorization: `Bearer ${currentToken}`,
|
|
119
|
+
};
|
|
120
|
+
if (this.subscribedAppId != null)
|
|
121
|
+
params.appId = this.subscribedAppId;
|
|
122
|
+
return params;
|
|
108
123
|
},
|
|
109
124
|
retryWait: async (retries) => {
|
|
110
125
|
this.setStatus('reconnecting');
|
|
@@ -172,6 +187,15 @@ export class RealtimeClient {
|
|
|
172
187
|
}
|
|
173
188
|
dispatch(notification) {
|
|
174
189
|
this.resolvePending(notification);
|
|
190
|
+
// A non-retryable connection event (e.g. APP_ID_REQUIRED, AUTH_REQUIRED)
|
|
191
|
+
// means the server completed the subscription and resubscribing would just
|
|
192
|
+
// be rejected again. Stop wanting the connection so the `complete` handler
|
|
193
|
+
// doesn't immediately reopen it (lazy graphql-ws then closes the socket).
|
|
194
|
+
if (notification.__typename === 'RealtimeConnectionEvent' &&
|
|
195
|
+
notification.retryable === false) {
|
|
196
|
+
this.desired = false;
|
|
197
|
+
this.setStatus('failed');
|
|
198
|
+
}
|
|
175
199
|
for (const handlers of [...this.subscribers.values()]) {
|
|
176
200
|
try {
|
|
177
201
|
handlers.any?.(notification);
|
package/dist/world.js
CHANGED