@replicast/core 1.0.0-rc.1 → 1.0.0-rc.10
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/decorators/entity.d.ts +43 -0
- package/dist/decorators/entity.d.ts.map +1 -0
- package/dist/decorators/entity.js +75 -0
- package/dist/decorators/entity.js.map +1 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/metadata.d.ts +5 -1
- package/dist/decorators/metadata.d.ts.map +1 -1
- package/dist/decorators/metadata.js.map +1 -1
- package/dist/entity/base-entity.d.ts +19 -0
- package/dist/entity/base-entity.d.ts.map +1 -0
- package/dist/entity/base-entity.js +18 -0
- package/dist/entity/base-entity.js.map +1 -0
- package/dist/entity/fields.d.ts +21 -0
- package/dist/entity/fields.d.ts.map +1 -0
- package/dist/entity/fields.js +67 -0
- package/dist/entity/fields.js.map +1 -0
- package/dist/entity/registry.d.ts +53 -0
- package/dist/entity/registry.d.ts.map +1 -0
- package/dist/entity/registry.js +167 -0
- package/dist/entity/registry.js.map +1 -0
- package/dist/entity/replicator.d.ts +40 -0
- package/dist/entity/replicator.d.ts.map +1 -0
- package/dist/entity/replicator.js +82 -0
- package/dist/entity/replicator.js.map +1 -0
- package/dist/entity/types.d.ts +29 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +4 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/entity/visibility.d.ts +11 -0
- package/dist/entity/visibility.d.ts.map +1 -0
- package/dist/entity/visibility.js +10 -0
- package/dist/entity/visibility.js.map +1 -0
- package/dist/entity/world.d.ts +67 -0
- package/dist/entity/world.d.ts.map +1 -0
- package/dist/entity/world.js +183 -0
- package/dist/entity/world.js.map +1 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/store/base-store.d.ts +24 -4
- package/dist/store/base-store.d.ts.map +1 -1
- package/dist/store/base-store.js +47 -20
- package/dist/store/base-store.js.map +1 -1
- package/dist/transport/app.d.ts +53 -0
- package/dist/transport/app.d.ts.map +1 -0
- package/dist/transport/app.js +53 -0
- package/dist/transport/app.js.map +1 -0
- package/dist/transport/client.d.ts +13 -1
- package/dist/transport/client.d.ts.map +1 -1
- package/dist/transport/client.js +52 -11
- package/dist/transport/client.js.map +1 -1
- package/dist/transport/context-browser.d.ts +6 -0
- package/dist/transport/context-browser.d.ts.map +1 -0
- package/dist/transport/context-browser.js +11 -0
- package/dist/transport/context-browser.js.map +1 -0
- package/dist/transport/context.d.ts +5 -0
- package/dist/transport/context.d.ts.map +1 -0
- package/dist/transport/context.js +9 -0
- package/dist/transport/context.js.map +1 -0
- package/dist/transport/protocol.d.ts +18 -1
- package/dist/transport/protocol.d.ts.map +1 -1
- package/dist/transport/protocol.js.map +1 -1
- package/dist/transport/server.d.ts +23 -1
- package/dist/transport/server.d.ts.map +1 -1
- package/dist/transport/server.js +176 -15
- package/dist/transport/server.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,17 +1,37 @@
|
|
|
1
1
|
import { BaseServerLifecycle } from '../lifecycle/base-server.js';
|
|
2
2
|
import { BaseStore } from '../store/base-store.js';
|
|
3
|
+
import { EntityWorld } from '../entity/world.js';
|
|
4
|
+
import type { EntityConstructor } from '../entity/types.js';
|
|
3
5
|
interface StoreRegistration {
|
|
4
6
|
name: string;
|
|
5
7
|
instance: BaseStore;
|
|
6
8
|
}
|
|
7
9
|
interface CreateRpcServerOptions {
|
|
8
10
|
stores: StoreRegistration[];
|
|
9
|
-
systems: object
|
|
11
|
+
systems: Record<string, object>;
|
|
10
12
|
lifecycle: BaseServerLifecycle;
|
|
11
13
|
port: number;
|
|
12
14
|
keepaliveInterval?: number;
|
|
13
15
|
maxConcurrentRpc?: number;
|
|
16
|
+
/** Per-connection cap on `@Server` calls per second (system and entity-scoped alike). Default 30. */
|
|
17
|
+
maxRpcPerSecond?: number;
|
|
18
|
+
/** Max encoded size, in bytes, of one rpc call's `args`. Default 16384 (16 KB). */
|
|
19
|
+
maxArgsBytes?: number;
|
|
14
20
|
encoding?: 'json' | 'msgpack';
|
|
21
|
+
/** Optional fixed-rate simulation tick. `onTick` runs inside a server context (useCtx() works; playerId is ''). */
|
|
22
|
+
tick?: TickOptions;
|
|
23
|
+
/** `@Entity` classes this world can spawn. Required for entity replication. */
|
|
24
|
+
entities?: EntityConstructor<object>[];
|
|
25
|
+
/** How often each client's entity delta and every registered store's dirty state is flushed. Defaults to 20 Hz. */
|
|
26
|
+
replication?: ReplicationOptions;
|
|
27
|
+
}
|
|
28
|
+
export interface TickOptions {
|
|
29
|
+
hz: number;
|
|
30
|
+
onTick: (dt: number) => void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface ReplicationOptions {
|
|
33
|
+
/** Entity + store flush rate, independent of the sim tick rate (e.g. sim 30, replication 15). */
|
|
34
|
+
hz?: number;
|
|
15
35
|
}
|
|
16
36
|
export interface RpcServer {
|
|
17
37
|
close(): Promise<void>;
|
|
@@ -19,6 +39,8 @@ export interface RpcServer {
|
|
|
19
39
|
ready: Promise<void>;
|
|
20
40
|
/** The port the server is listening on. Valid after `ready` resolves. */
|
|
21
41
|
port: number;
|
|
42
|
+
/** Server-side entity registry: `spawn`, `despawn`, `byType`, `flush`. */
|
|
43
|
+
world: EntityWorld;
|
|
22
44
|
}
|
|
23
45
|
export declare function createRPCServer(options: CreateRpcServerOptions): RpcServer;
|
|
24
46
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/transport/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/transport/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAIlD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,oBAAoB,CAAA;AA4BjF,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,UAAU,sBAAsB;IAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,SAAS,EAAE,mBAAmB,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,mHAAmH;IACnH,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAA;IACtC,mHAAmH;IACnH,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,iGAAiG;IACjG,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,gFAAgF;IAChF,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,KAAK,EAAE,WAAW,CAAA;CACnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CA2V1E"}
|
package/dist/transport/server.js
CHANGED
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
2
|
import { getMethodRoles } from '../decorators/metadata.js';
|
|
3
|
+
import { contextStorage } from './context.js';
|
|
4
|
+
import { EntityWorld } from '../entity/world.js';
|
|
3
5
|
import { jsonCodec, msgpackCodec } from './codec.js';
|
|
4
6
|
const AUTH_TIMEOUT_MS = 10_000;
|
|
5
7
|
const KEEPALIVE_INTERVAL_MS = 30_000;
|
|
6
8
|
const MAX_CONCURRENT_RPC = 50;
|
|
9
|
+
const REPLICATION_HZ = 20;
|
|
10
|
+
const MAX_RPC_PER_SECOND = 30;
|
|
11
|
+
const MAX_ARGS_BYTES = 16_384;
|
|
12
|
+
// Coarse backstop against giant raw frames, independent of shape or content: `maxArgsBytes` below
|
|
13
|
+
// only measures the encoded `args` of a decoded `rpc` message, so a frame has to be fully received
|
|
14
|
+
// and parsed before that check ever runs. This cap makes `ws` reject an oversized frame outright
|
|
15
|
+
// (closing the connection) before it is even buffered, regardless of message type — including
|
|
16
|
+
// non-rpc or malformed traffic maxArgsBytes never sees. Kept deliberately far above maxArgsBytes'
|
|
17
|
+
// default (16KB) so it only ever fires on frames no legitimate client should send.
|
|
18
|
+
const MAX_MESSAGE_BYTES = 1_000_000;
|
|
7
19
|
export function createRPCServer(options) {
|
|
8
|
-
const { stores, systems, lifecycle, port, keepaliveInterval = KEEPALIVE_INTERVAL_MS, maxConcurrentRpc = MAX_CONCURRENT_RPC, encoding = 'json', } = options;
|
|
20
|
+
const { stores, systems, lifecycle, port, keepaliveInterval = KEEPALIVE_INTERVAL_MS, maxConcurrentRpc = MAX_CONCURRENT_RPC, maxRpcPerSecond = MAX_RPC_PER_SECOND, maxArgsBytes = MAX_ARGS_BYTES, encoding = 'json', tick, entities = [], replication, } = options;
|
|
9
21
|
const codec = encoding === 'msgpack' ? msgpackCodec : jsonCodec;
|
|
10
|
-
const wss = new WebSocketServer({ port });
|
|
22
|
+
const wss = new WebSocketServer({ port, maxPayload: MAX_MESSAGE_BYTES });
|
|
23
|
+
/** Size, in bytes, of `value` encoded with the connection's own codec (json or msgpack). */
|
|
24
|
+
function encodedByteLength(value) {
|
|
25
|
+
const encoded = codec.encode(value);
|
|
26
|
+
return typeof encoded === 'string' ? Buffer.byteLength(encoded, 'utf8') : encoded.byteLength;
|
|
27
|
+
}
|
|
11
28
|
let actualPort = port;
|
|
12
29
|
let resolveReady;
|
|
13
30
|
const ready = new Promise(resolve => { resolveReady = resolve; });
|
|
@@ -27,18 +44,88 @@ export function createRPCServer(options) {
|
|
|
27
44
|
}
|
|
28
45
|
}, keepaliveInterval);
|
|
29
46
|
const connections = new Map();
|
|
47
|
+
/**
|
|
48
|
+
* Per-player @Server call rate limit (system and entity-scoped alike), keyed by playerId rather
|
|
49
|
+
* than by connection — a fresh reconnect must not hand out a fresh full bucket, or the limit is
|
|
50
|
+
* trivially bypassed by disconnecting and reconnecting. Never removed on disconnect, deliberately:
|
|
51
|
+
* removing it would restore the bypass for anyone who reconnects. Same lifetime tradeoff BaseStore
|
|
52
|
+
* already makes for per-player owner data (also never cleared on disconnect) — bounded by how many
|
|
53
|
+
* distinct playerIds the app's own auth hands out, not something replicast can scope down further.
|
|
54
|
+
*/
|
|
55
|
+
const rpcBuckets = new Map();
|
|
56
|
+
function takeRpcToken(playerId) {
|
|
57
|
+
let bucket = rpcBuckets.get(playerId);
|
|
58
|
+
if (!bucket) {
|
|
59
|
+
bucket = { tokens: maxRpcPerSecond, lastRefill: Date.now() };
|
|
60
|
+
rpcBuckets.set(playerId, bucket);
|
|
61
|
+
}
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
const elapsedSec = (now - bucket.lastRefill) / 1000;
|
|
64
|
+
if (elapsedSec > 0) {
|
|
65
|
+
bucket.tokens = Math.min(maxRpcPerSecond, bucket.tokens + elapsedSec * maxRpcPerSecond);
|
|
66
|
+
bucket.lastRefill = now;
|
|
67
|
+
}
|
|
68
|
+
if (bucket.tokens < 1)
|
|
69
|
+
return false;
|
|
70
|
+
bucket.tokens -= 1;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
30
73
|
const methods = new Map();
|
|
31
|
-
for (const system of systems) {
|
|
74
|
+
for (const system of Object.values(systems)) {
|
|
32
75
|
const proto = Object.getPrototypeOf(system);
|
|
33
|
-
|
|
76
|
+
// Prefer the name stamped by @replicast/vite-plugin; constructor.name is unreliable after bundling/minification.
|
|
77
|
+
const className = proto.constructor.__replicastName ?? proto.constructor.name;
|
|
34
78
|
const roles = getMethodRoles(proto);
|
|
35
79
|
for (const [methodName, role] of Object.entries(roles)) {
|
|
36
80
|
if (role === 'server') {
|
|
37
81
|
const key = `${className}.${methodName}`;
|
|
38
|
-
methods.set(key, (ctx, ...args) =>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
82
|
+
methods.set(key, (ctx, ...args) => contextStorage.run(ctx, () => system[methodName](...args)));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function pushToClient(targetId, method, args) {
|
|
87
|
+
const target = connections.get(targetId);
|
|
88
|
+
if (target?.readyState === WebSocket.OPEN) {
|
|
89
|
+
target.send(codec.encode({ type: 'rpc', method, args }));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const world = new EntityWorld({
|
|
93
|
+
types: entities,
|
|
94
|
+
transport: {
|
|
95
|
+
sendRpc(playerId, id, method, args) {
|
|
96
|
+
const target = connections.get(playerId);
|
|
97
|
+
if (target?.readyState === WebSocket.OPEN) {
|
|
98
|
+
target.send(codec.encode({ type: 'entity_rpc', id, method, args }));
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
sendSync(playerId, sync) {
|
|
102
|
+
const target = connections.get(playerId);
|
|
103
|
+
if (target?.readyState === WebSocket.OPEN) {
|
|
104
|
+
target.send(codec.encode({ type: 'entity_sync', ...sync }));
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
players: () => [...connections.keys()],
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
// Runtime dispatch: on the server, calling a @Client / @Multicast method sends it to clients.
|
|
111
|
+
// This makes the server independent of the Vite transform (plain tsx/node works), and lets
|
|
112
|
+
// tick loops and lifecycle hooks call them like any other method.
|
|
113
|
+
for (const system of Object.values(systems)) {
|
|
114
|
+
const proto = Object.getPrototypeOf(system);
|
|
115
|
+
const className = proto.constructor.__replicastName ?? proto.constructor.name;
|
|
116
|
+
for (const [methodName, role] of Object.entries(getMethodRoles(proto))) {
|
|
117
|
+
const key = `${className}.${methodName}`;
|
|
118
|
+
if (role === 'client') {
|
|
119
|
+
Object.defineProperty(system, methodName, {
|
|
120
|
+
value: (targetId, ...args) => { pushToClient(targetId, key, args); },
|
|
121
|
+
configurable: true, writable: true,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else if (role === 'multicast') {
|
|
125
|
+
Object.defineProperty(system, methodName, {
|
|
126
|
+
value: (...args) => { for (const pid of connections.keys())
|
|
127
|
+
pushToClient(pid, key, args); },
|
|
128
|
+
configurable: true, writable: true,
|
|
42
129
|
});
|
|
43
130
|
}
|
|
44
131
|
}
|
|
@@ -66,6 +153,9 @@ export function createRPCServer(options) {
|
|
|
66
153
|
ws._isAlive = true;
|
|
67
154
|
ws.on('pong', () => { ws._isAlive = true; });
|
|
68
155
|
ws.on('message', () => { ws._isAlive = true; });
|
|
156
|
+
// `ws` emits 'error' (e.g. maxPayload exceeded) and closes the socket itself; without a listener
|
|
157
|
+
// here that error event is unhandled and crashes the process — swallow it, 'close' does the cleanup.
|
|
158
|
+
ws.on('error', () => { });
|
|
69
159
|
const authTimeout = setTimeout(() => ws.close(), AUTH_TIMEOUT_MS);
|
|
70
160
|
ws.once('message', async (raw) => {
|
|
71
161
|
// Fix 1: declare playerId in outer scope so catch can clean up
|
|
@@ -106,12 +196,8 @@ export function createRPCServer(options) {
|
|
|
106
196
|
const ctx = {
|
|
107
197
|
playerId: pid,
|
|
108
198
|
get players() { return [...connections.keys()]; },
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if (target?.readyState === WebSocket.OPEN) {
|
|
112
|
-
target.send(codec.encode({ type: 'rpc', method, args }));
|
|
113
|
-
}
|
|
114
|
-
},
|
|
199
|
+
get serverTime() { return Date.now(); },
|
|
200
|
+
sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
|
|
115
201
|
};
|
|
116
202
|
// Fix 2: register RPC and close handlers BEFORE awaiting onPlayerJoined
|
|
117
203
|
let inFlight = 0;
|
|
@@ -130,11 +216,22 @@ export function createRPCServer(options) {
|
|
|
130
216
|
}
|
|
131
217
|
if (msg.type !== 'rpc')
|
|
132
218
|
return;
|
|
219
|
+
if (!takeRpcToken(pid)) {
|
|
220
|
+
ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: 'rate_limited' }));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (encodedByteLength(msg.args) > maxArgsBytes) {
|
|
224
|
+
ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: 'args_too_large' }));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
133
227
|
if (inFlight >= maxConcurrentRpc) {
|
|
134
228
|
ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: 'Too many concurrent requests' }));
|
|
135
229
|
return;
|
|
136
230
|
}
|
|
137
|
-
|
|
231
|
+
// Entity-scoped calls carry the target entity id; the world authorises the caller.
|
|
232
|
+
const handler = msg.entityId !== undefined
|
|
233
|
+
? (c, ...args) => contextStorage.run(c, () => world.invoke(pid, msg.entityId, msg.method, args))
|
|
234
|
+
: methods.get(msg.method);
|
|
138
235
|
if (!handler) {
|
|
139
236
|
ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: `Unknown method: ${msg.method}` }));
|
|
140
237
|
return;
|
|
@@ -161,10 +258,15 @@ export function createRPCServer(options) {
|
|
|
161
258
|
// Fix 3: guard against reconnect overwriting the map entry
|
|
162
259
|
if (connections.get(pid) === ws)
|
|
163
260
|
connections.delete(pid);
|
|
261
|
+
world.dropViewer(pid);
|
|
164
262
|
await lifecycle.onPlayerLeft(ctx);
|
|
165
263
|
});
|
|
166
264
|
await lifecycle.onPlayerJoined(ctx);
|
|
167
265
|
joined = true;
|
|
266
|
+
// Send the initial entity set now rather than waiting for the next replication tick,
|
|
267
|
+
// so entities spawned in onPlayerJoined arrive with the connection.
|
|
268
|
+
if (entities.length > 0)
|
|
269
|
+
world.flush();
|
|
168
270
|
}
|
|
169
271
|
catch (err) {
|
|
170
272
|
// Fix 1: on any error (e.g. onPlayerJoined throw), clean up connection and close
|
|
@@ -174,15 +276,74 @@ export function createRPCServer(options) {
|
|
|
174
276
|
}
|
|
175
277
|
});
|
|
176
278
|
});
|
|
279
|
+
let tickTimer;
|
|
280
|
+
if (tick) {
|
|
281
|
+
const dt = 1 / tick.hz;
|
|
282
|
+
const tickCtx = {
|
|
283
|
+
playerId: '',
|
|
284
|
+
get players() { return [...connections.keys()]; },
|
|
285
|
+
get serverTime() { return Date.now(); },
|
|
286
|
+
sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
|
|
287
|
+
};
|
|
288
|
+
let running = false;
|
|
289
|
+
tickTimer = setInterval(() => {
|
|
290
|
+
if (running)
|
|
291
|
+
return; // skip if the previous async tick hasn't finished
|
|
292
|
+
running = true;
|
|
293
|
+
Promise.resolve()
|
|
294
|
+
// Entity @ServerTick methods run first, so onTick sees the stepped world.
|
|
295
|
+
.then(() => contextStorage.run(tickCtx, () => { world.tick(dt); return tick.onTick(dt); }))
|
|
296
|
+
.catch(err => { console.error('[replicast] tick error:', err); })
|
|
297
|
+
.finally(() => { running = false; });
|
|
298
|
+
}, 1000 / tick.hz);
|
|
299
|
+
}
|
|
300
|
+
// Replication runs on its own clock so snapshots can be slower than the sim (e.g. 30/15).
|
|
301
|
+
// Entities and stores share this one cadence — BaseStore no longer self-schedules via
|
|
302
|
+
// process.nextTick() (see BaseStore.flush()); the server drives every registered store's
|
|
303
|
+
// flush() here, once per tick, right alongside the entity world's flush().
|
|
304
|
+
let replicationTimer;
|
|
305
|
+
if (entities.length > 0 || stores.length > 0) {
|
|
306
|
+
const replicationCtx = {
|
|
307
|
+
playerId: '',
|
|
308
|
+
get players() { return [...connections.keys()]; },
|
|
309
|
+
get serverTime() { return Date.now(); },
|
|
310
|
+
sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
|
|
311
|
+
};
|
|
312
|
+
replicationTimer = setInterval(() => {
|
|
313
|
+
contextStorage.run(replicationCtx, () => {
|
|
314
|
+
if (entities.length > 0) {
|
|
315
|
+
try {
|
|
316
|
+
world.flush();
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
console.error('[replicast] replication flush error:', err);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
for (const { instance } of stores) {
|
|
323
|
+
try {
|
|
324
|
+
instance.flush();
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
console.error('[replicast] store replication flush error:', err);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}, 1000 / (replication?.hz ?? REPLICATION_HZ));
|
|
332
|
+
}
|
|
177
333
|
let closed = false;
|
|
178
334
|
return {
|
|
179
335
|
ready,
|
|
336
|
+
world,
|
|
180
337
|
get port() { return actualPort; },
|
|
181
338
|
close: () => {
|
|
182
339
|
if (closed)
|
|
183
340
|
return Promise.resolve();
|
|
184
341
|
closed = true;
|
|
185
342
|
clearInterval(keepaliveTimer);
|
|
343
|
+
if (tickTimer)
|
|
344
|
+
clearInterval(tickTimer);
|
|
345
|
+
if (replicationTimer)
|
|
346
|
+
clearInterval(replicationTimer);
|
|
186
347
|
// Fix 4: null out store replication callbacks
|
|
187
348
|
for (const { instance } of stores) {
|
|
188
349
|
instance._onReplication = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/transport/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/transport/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@replicast/core",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.10",
|
|
4
4
|
"description": "TypeScript RPC and state-replication framework for multiplayer games",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"access": "public"
|
|
14
14
|
},
|
|
15
15
|
"browser": {
|
|
16
|
-
"./dist/transport/ws-node.js": "./dist/transport/ws-browser.js"
|
|
16
|
+
"./dist/transport/ws-node.js": "./dist/transport/ws-browser.js",
|
|
17
|
+
"./dist/transport/context.js": "./dist/transport/context-browser.js"
|
|
17
18
|
},
|
|
18
19
|
"scripts": {
|
|
19
20
|
"build": "tsc -p tsconfig.build.json",
|