@helixdev/helix-sdk 0.1.1-staging.8 → 0.1.1-staging.9
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/index.d.ts +15 -2
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -1
- package/dist/multiplayer-contract/credential.d.ts +9 -0
- package/dist/multiplayer-contract/index.d.ts +4 -3
- package/dist/multiplayer-contract/index.js +4 -3
- package/dist/multiplayer-contract/index.js.map +1 -1
- package/dist/multiplayer-contract/messages.d.ts +113 -3
- package/dist/multiplayer-contract/messages.js +32 -2
- package/dist/multiplayer-contract/messages.js.map +1 -1
- package/dist/multiplayer-contract/room.d.ts +61 -2
- package/dist/multiplayer-contract/state.d.ts +1 -1
- package/dist/multiplayer.d.ts +30 -3
- package/dist/multiplayer.js +101 -15
- package/dist/multiplayer.js.map +1 -1
- package/dist/protocol.d.ts +11 -1
- package/dist/protocol.js +3 -2
- package/dist/protocol.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/multiplayer.js
CHANGED
|
@@ -8,16 +8,24 @@
|
|
|
8
8
|
import { ClientMessageType, MESSAGE_RATE, } from './multiplayer-contract';
|
|
9
9
|
// ~12s of inputs at 10Hz — generous reconciliation window; bounded so a missing server ack can't grow it forever.
|
|
10
10
|
const INPUT_BUFFER_MAX = 120;
|
|
11
|
+
// sessionStorage key (per world) for the colyseus reconnectionToken + its wsUrl. sessionStorage is per-tab and
|
|
12
|
+
// SURVIVES A RELOAD but not a tab close — exactly the lifetime we want: a reload resumes the held seat; a new
|
|
13
|
+
// tab / post-close start does a fresh join. This is what makes a reload RECONNECT (bypassing the room's
|
|
14
|
+
// onAuth one-seat-per-account gate, which would otherwise reject the reload's fresh join during the grace
|
|
15
|
+
// window) instead of falling back to single-player.
|
|
16
|
+
const RECONNECT_KEY = (worldId) => `helix:mp:reconnect:${worldId}`;
|
|
11
17
|
export class HelixMultiplayer {
|
|
12
18
|
host;
|
|
13
19
|
apiBaseUrl = null;
|
|
14
20
|
room = null;
|
|
15
21
|
callbacks = null;
|
|
16
22
|
seq = 0;
|
|
23
|
+
entitySeq = {}; // per-entity monotonic upload seq (4.6c owner-entity channel)
|
|
24
|
+
entityBatchSeq = 0; // per-connection monotonic batch seq (4.10 owner-entity batch channel)
|
|
17
25
|
pendingInput = null;
|
|
18
26
|
flushTimer = null;
|
|
19
27
|
inputBuffer = [];
|
|
20
|
-
|
|
28
|
+
worldId = null; // the joined world (the reconnect-token storage key)
|
|
21
29
|
constructor(host) {
|
|
22
30
|
this.host = host;
|
|
23
31
|
}
|
|
@@ -41,16 +49,25 @@ export class HelixMultiplayer {
|
|
|
41
49
|
const apiBase = options.apiBaseUrl?.replace(/\/$/, '') ?? this.apiBaseUrl ?? issuerOf(token);
|
|
42
50
|
if (!apiBase)
|
|
43
51
|
throw new Error('Helix.multiplayer: cannot resolve the API base URL — call Helix.multiplayer.configure({ apiBaseUrl })');
|
|
44
|
-
const reservation = await this.requestJoin(apiBase, id, token);
|
|
45
52
|
const colyseus = (await import('@colyseus/sdk'));
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
|
|
53
|
+
// RESUME FIRST: on a reload, a seat persisted in sessionStorage is still held in the server's grace window —
|
|
54
|
+
// reconnect to it (resumes the same seat + its vars, bypassing onAuth) instead of a fresh join that onAuth
|
|
55
|
+
// would reject as a duplicate. On any failure (grace expired / clean despawn / new tab) fall back to /join.
|
|
56
|
+
let room = await this.tryReconnect(colyseus, id);
|
|
57
|
+
if (!room) {
|
|
58
|
+
const reservation = await this.requestJoin(apiBase, id, token);
|
|
59
|
+
const client = new colyseus.Client(reservation.wsUrl);
|
|
60
|
+
// buildId is the matchmaking filter (room filterBy(['buildId'])) — it groups players per active build.
|
|
61
|
+
// The room re-validates it against the verified credential in onAuth, so a spoofed value can't cross builds.
|
|
62
|
+
room = await client.joinOrCreate(reservation.roomName, { token: reservation.credential, buildId: reservation.buildId });
|
|
63
|
+
this.persistReconnect(id, reservation.wsUrl, room.reconnectionToken);
|
|
64
|
+
}
|
|
65
|
+
this.worldId = id;
|
|
50
66
|
this.room = room;
|
|
51
67
|
this.callbacks = colyseus.getStateCallbacks(room);
|
|
52
68
|
this.startFlush();
|
|
53
|
-
|
|
69
|
+
// Keep the persisted token fresh as colyseus rotates it (e.g. after an in-page auto-reconnect).
|
|
70
|
+
room.onReconnect(() => this.persistReconnect(id, this.reconnectWsUrl(id), room.reconnectionToken));
|
|
54
71
|
room.onLeave(() => this.teardown());
|
|
55
72
|
return this.makeHandle(room);
|
|
56
73
|
}
|
|
@@ -87,6 +104,22 @@ export class HelixMultiplayer {
|
|
|
87
104
|
},
|
|
88
105
|
sendAbility: (ability, active) => room.send(ClientMessageType.Ability, { ability, active }),
|
|
89
106
|
sendAction: (name, args) => room.send(ClientMessageType.Action, { name, args }),
|
|
107
|
+
uploadEntity: (entityId, input) => {
|
|
108
|
+
const seq = (this.entitySeq[entityId] = (this.entitySeq[entityId] ?? 0) + 1);
|
|
109
|
+
room.send(ClientMessageType.EntityState, { entity: entityId, seq, position: input.position, vars: input.vars });
|
|
110
|
+
},
|
|
111
|
+
uploadEntities: (entities) => {
|
|
112
|
+
if (entities.length === 0)
|
|
113
|
+
return;
|
|
114
|
+
const seq = ++this.entityBatchSeq;
|
|
115
|
+
const states = entities.map((e) => ({
|
|
116
|
+
e: e.id,
|
|
117
|
+
p: [e.position.x, e.position.y, e.position.z],
|
|
118
|
+
...(e.vars !== undefined ? { v: e.vars } : {}),
|
|
119
|
+
...(e.epoch !== undefined ? { ep: e.epoch } : {}),
|
|
120
|
+
}));
|
|
121
|
+
room.send(ClientMessageType.EntityStateBatch, { seq, states });
|
|
122
|
+
},
|
|
90
123
|
pendingInputs: () => this.inputBuffer.slice(),
|
|
91
124
|
acknowledge: (seq) => {
|
|
92
125
|
this.inputBuffer = this.inputBuffer.filter((m) => m.seq > seq);
|
|
@@ -113,31 +146,84 @@ export class HelixMultiplayer {
|
|
|
113
146
|
if (this.inputBuffer.length > INPUT_BUFFER_MAX)
|
|
114
147
|
this.inputBuffer.shift();
|
|
115
148
|
}
|
|
116
|
-
// D5
|
|
117
|
-
|
|
118
|
-
|
|
149
|
+
// D5 RECONNECTION (sessionStorage-backed): persist / read / clear the colyseus reconnectionToken + its wsUrl
|
|
150
|
+
// per world. sessionStorage is per-tab and survives a RELOAD but not a close — so a reload resumes the held
|
|
151
|
+
// seat (below) while a new tab does a fresh join. We deliberately do NOT consent-leave on tab unload anymore:
|
|
152
|
+
// letting the socket drop holds the seat in the server's grace window so a reload can RECONNECT to it (and
|
|
153
|
+
// keep its vars), instead of a fresh join that the room's one-seat-per-account onAuth gate would reject. A
|
|
154
|
+
// genuine close just lets the grace window expire (the seat despawns after RECONNECT_GRACE_SEC).
|
|
155
|
+
persistReconnect(worldId, wsUrl, reconnectionToken) {
|
|
156
|
+
if (typeof sessionStorage === 'undefined' || !wsUrl || !reconnectionToken)
|
|
157
|
+
return;
|
|
158
|
+
try {
|
|
159
|
+
sessionStorage.setItem(RECONNECT_KEY(worldId), JSON.stringify({ wsUrl, reconnectionToken }));
|
|
160
|
+
}
|
|
161
|
+
catch { /* storage unavailable */ }
|
|
162
|
+
}
|
|
163
|
+
readReconnect(worldId) {
|
|
164
|
+
if (typeof sessionStorage === 'undefined')
|
|
165
|
+
return null;
|
|
166
|
+
try {
|
|
167
|
+
const raw = sessionStorage.getItem(RECONNECT_KEY(worldId));
|
|
168
|
+
const v = raw ? JSON.parse(raw) : null;
|
|
169
|
+
return v?.wsUrl && v.reconnectionToken ? { wsUrl: v.wsUrl, reconnectionToken: v.reconnectionToken } : null;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
reconnectWsUrl(worldId) {
|
|
176
|
+
return this.readReconnect(worldId)?.wsUrl ?? '';
|
|
177
|
+
}
|
|
178
|
+
clearReconnect(worldId) {
|
|
179
|
+
if (typeof sessionStorage === 'undefined')
|
|
119
180
|
return;
|
|
120
|
-
|
|
121
|
-
|
|
181
|
+
try {
|
|
182
|
+
sessionStorage.removeItem(RECONNECT_KEY(worldId));
|
|
183
|
+
}
|
|
184
|
+
catch { /* ignore */ }
|
|
185
|
+
}
|
|
186
|
+
// Resume a grace-held seat (a reload). Returns the resumed room, or null to fall through to a fresh join
|
|
187
|
+
// (no saved token / grace expired / seat despawned / stale wsUrl — reconnect() rejects and we drop the token).
|
|
188
|
+
async tryReconnect(colyseus, worldId) {
|
|
189
|
+
const saved = this.readReconnect(worldId);
|
|
190
|
+
if (!saved)
|
|
191
|
+
return null;
|
|
192
|
+
try {
|
|
193
|
+
const client = new colyseus.Client(saved.wsUrl);
|
|
194
|
+
const room = await client.reconnect(saved.reconnectionToken);
|
|
195
|
+
this.persistReconnect(worldId, saved.wsUrl, room.reconnectionToken); // the token may rotate on resume
|
|
196
|
+
return room;
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
this.clearReconnect(worldId);
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
122
202
|
}
|
|
203
|
+
// Leave for good: consented (frees the seat immediately, no grace) + drop the saved token so we don't try to
|
|
204
|
+
// resume a seat we deliberately left. (A reload does NOT call this — it just unloads.)
|
|
123
205
|
async leave() {
|
|
124
206
|
const room = this.room;
|
|
207
|
+
if (this.worldId)
|
|
208
|
+
this.clearReconnect(this.worldId);
|
|
125
209
|
this.teardown();
|
|
126
210
|
if (room)
|
|
127
211
|
await room.leave(true);
|
|
128
212
|
}
|
|
213
|
+
// Reset in-memory state. Called on a drop too (onLeave) — it does NOT clear the saved reconnect token, so a
|
|
214
|
+
// later reload can still resume the grace-held seat.
|
|
129
215
|
teardown() {
|
|
130
216
|
if (this.flushTimer)
|
|
131
217
|
clearInterval(this.flushTimer);
|
|
132
|
-
if (this.onUnload && typeof window !== 'undefined')
|
|
133
|
-
window.removeEventListener('beforeunload', this.onUnload);
|
|
134
218
|
this.flushTimer = null;
|
|
135
|
-
this.onUnload = null;
|
|
136
219
|
this.room = null;
|
|
137
220
|
this.callbacks = null;
|
|
138
221
|
this.pendingInput = null;
|
|
139
222
|
this.inputBuffer = [];
|
|
223
|
+
this.worldId = null;
|
|
140
224
|
this.seq = 0;
|
|
225
|
+
this.entitySeq = {};
|
|
226
|
+
this.entityBatchSeq = 0;
|
|
141
227
|
}
|
|
142
228
|
}
|
|
143
229
|
// Read the `iss` claim from a JWT without verifying (the world_session issuer is the platform API
|
package/dist/multiplayer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiplayer.js","sourceRoot":"","sources":["../src/multiplayer.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,oGAAoG;AACpG,kFAAkF;AAClF,sGAAsG;AACtG,mGAAmG;AACnG,mGAAmG;AACnG,qEAAqE;AAErE,OAAO,EACL,iBAAiB,EACjB,YAAY,
|
|
1
|
+
{"version":3,"file":"multiplayer.js","sourceRoot":"","sources":["../src/multiplayer.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const PROTOCOL_VERSION =
|
|
1
|
+
export declare const PROTOCOL_VERSION = 2;
|
|
2
2
|
export type HelixUser = {
|
|
3
3
|
id: string;
|
|
4
4
|
username: string;
|
|
@@ -15,18 +15,28 @@ export type HelixSession = {
|
|
|
15
15
|
scopes: string[];
|
|
16
16
|
user: HelixUser;
|
|
17
17
|
};
|
|
18
|
+
export type DebugLogLevel = 'log' | 'info' | 'warn' | 'error' | 'debug';
|
|
19
|
+
export type DebugLogEntry = {
|
|
20
|
+
level: DebugLogLevel;
|
|
21
|
+
args: string[];
|
|
22
|
+
t: number;
|
|
23
|
+
};
|
|
18
24
|
export type WorldToShellMessage = {
|
|
19
25
|
type: 'helix:ready';
|
|
20
26
|
protocolVersion: number;
|
|
21
27
|
} | {
|
|
22
28
|
type: 'helix:request-login';
|
|
23
29
|
requestId: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'helix:log';
|
|
32
|
+
entry: DebugLogEntry;
|
|
24
33
|
};
|
|
25
34
|
export type ShellToWorldMessage = {
|
|
26
35
|
type: 'helix:init';
|
|
27
36
|
protocolVersion: number;
|
|
28
37
|
world: HelixWorldContext;
|
|
29
38
|
session: HelixSession | null;
|
|
39
|
+
debug?: boolean;
|
|
30
40
|
} | {
|
|
31
41
|
type: 'helix:session';
|
|
32
42
|
session: HelixSession | null;
|
package/dist/protocol.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// postMessage protocol between a world (sandboxed iframe) and the HELIX shell
|
|
2
2
|
// (the play page, or a local `helix dev` shell). This file IS the wire contract
|
|
3
|
-
// — both sides import it; version any breaking change.
|
|
4
|
-
|
|
3
|
+
// — both sides import it; version any breaking change. (v2 is additive: helix:init
|
|
4
|
+
// gained `debug`, and helix:log carries world logs to the shell when debug is on.)
|
|
5
|
+
export const PROTOCOL_VERSION = 2;
|
|
5
6
|
export function isShellMessage(data) {
|
|
6
7
|
return (typeof data === 'object' &&
|
|
7
8
|
data !== null &&
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,mFAAmF;AACnF,mFAAmF;AAEnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AA4DlC,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ;QACrD,CAAE,IAAyB,CAAC,IAAI,KAAK,YAAY;YAC9C,IAAyB,CAAC,IAAI,KAAK,eAAe;YAClD,IAAyB,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAC5D,CAAC;AACJ,CAAC"}
|