@replicast/core 1.0.0-rc.6 → 1.0.0-rc.8

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.
Files changed (63) hide show
  1. package/dist/decorators/entity.d.ts +43 -0
  2. package/dist/decorators/entity.d.ts.map +1 -0
  3. package/dist/decorators/entity.js +75 -0
  4. package/dist/decorators/entity.js.map +1 -0
  5. package/dist/decorators/index.d.ts +2 -0
  6. package/dist/decorators/index.d.ts.map +1 -1
  7. package/dist/decorators/index.js +1 -0
  8. package/dist/decorators/index.js.map +1 -1
  9. package/dist/decorators/metadata.d.ts +5 -1
  10. package/dist/decorators/metadata.d.ts.map +1 -1
  11. package/dist/decorators/metadata.js.map +1 -1
  12. package/dist/entity/base-entity.d.ts +19 -0
  13. package/dist/entity/base-entity.d.ts.map +1 -0
  14. package/dist/entity/base-entity.js +18 -0
  15. package/dist/entity/base-entity.js.map +1 -0
  16. package/dist/entity/fields.d.ts +21 -0
  17. package/dist/entity/fields.d.ts.map +1 -0
  18. package/dist/entity/fields.js +67 -0
  19. package/dist/entity/fields.js.map +1 -0
  20. package/dist/entity/registry.d.ts +53 -0
  21. package/dist/entity/registry.d.ts.map +1 -0
  22. package/dist/entity/registry.js +167 -0
  23. package/dist/entity/registry.js.map +1 -0
  24. package/dist/entity/replicator.d.ts +40 -0
  25. package/dist/entity/replicator.d.ts.map +1 -0
  26. package/dist/entity/replicator.js +82 -0
  27. package/dist/entity/replicator.js.map +1 -0
  28. package/dist/entity/types.d.ts +29 -0
  29. package/dist/entity/types.d.ts.map +1 -0
  30. package/dist/entity/types.js +4 -0
  31. package/dist/entity/types.js.map +1 -0
  32. package/dist/entity/visibility.d.ts +11 -0
  33. package/dist/entity/visibility.d.ts.map +1 -0
  34. package/dist/entity/visibility.js +10 -0
  35. package/dist/entity/visibility.js.map +1 -0
  36. package/dist/entity/world.d.ts +67 -0
  37. package/dist/entity/world.d.ts.map +1 -0
  38. package/dist/entity/world.js +183 -0
  39. package/dist/entity/world.js.map +1 -0
  40. package/dist/index.d.ts +15 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +9 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/store/base-store.d.ts +15 -0
  45. package/dist/store/base-store.d.ts.map +1 -1
  46. package/dist/store/base-store.js +26 -2
  47. package/dist/store/base-store.js.map +1 -1
  48. package/dist/transport/app.d.ts +11 -1
  49. package/dist/transport/app.d.ts.map +1 -1
  50. package/dist/transport/app.js +5 -1
  51. package/dist/transport/app.js.map +1 -1
  52. package/dist/transport/client.d.ts +12 -0
  53. package/dist/transport/client.d.ts.map +1 -1
  54. package/dist/transport/client.js +50 -9
  55. package/dist/transport/client.js.map +1 -1
  56. package/dist/transport/protocol.d.ts +18 -1
  57. package/dist/transport/protocol.d.ts.map +1 -1
  58. package/dist/transport/protocol.js.map +1 -1
  59. package/dist/transport/server.d.ts +18 -0
  60. package/dist/transport/server.d.ts.map +1 -1
  61. package/dist/transport/server.js +111 -10
  62. package/dist/transport/server.js.map +1 -1
  63. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
1
  import type { BaseStore } from '../store/base-store.js';
2
2
  import type { BaseServerLifecycle } from '../lifecycle/base-server.js';
3
3
  import type { BaseClientLifecycle } from '../lifecycle/base-client.js';
4
- import type { RpcServer } from './server.js';
4
+ import type { RpcServer, TickOptions, ReplicationOptions } from './server.js';
5
5
  import { WsClient } from './client.js';
6
6
  import type { LatencyThresholds } from './client.js';
7
+ import type { EntityWorld } from '../entity/world.js';
8
+ import type { EntityConstructor } from '../entity/types.js';
7
9
  type StoreConstructor = new () => BaseStore;
8
10
  export type StoreConstructors = Record<string, StoreConstructor>;
9
11
  export type StoreInstances<T extends StoreConstructors> = {
@@ -15,6 +17,10 @@ export interface ServeOptions {
15
17
  keepaliveInterval?: number;
16
18
  maxConcurrentRpc?: number;
17
19
  encoding?: 'json' | 'msgpack';
20
+ /** Fixed-rate server simulation loop (e.g. { hz: 20, onTick: dt => sim.step(dt) }). Also drives `@ServerTick`. */
21
+ tick?: TickOptions;
22
+ /** Entity flush rate, independent of the sim tick rate (e.g. `{ hz: 15 }`). Defaults to 20 Hz. */
23
+ replication?: ReplicationOptions;
18
24
  }
19
25
  export interface ConnectOptions {
20
26
  url: string;
@@ -28,6 +34,8 @@ export interface App<TStores extends StoreConstructors, TSystems extends Record<
28
34
  server: RpcServer;
29
35
  stores: StoreInstances<TStores>;
30
36
  systems: TSystems;
37
+ /** Server-side entity registry: `spawn`, `despawn`, `byType`, `flush`. */
38
+ world: EntityWorld;
31
39
  };
32
40
  connect(options: ConnectOptions): {
33
41
  client: WsClient;
@@ -38,6 +46,8 @@ export interface App<TStores extends StoreConstructors, TSystems extends Record<
38
46
  export declare function createApp<TStores extends StoreConstructors, TSystems extends Record<string, object>>(config: {
39
47
  stores: TStores;
40
48
  systems: (stores: StoreInstances<TStores>) => TSystems;
49
+ /** `@Entity` classes used by this app. Shared by both sides so the client can mirror them. */
50
+ entities?: EntityConstructor<object>[];
41
51
  }): App<TStores, TSystems>;
42
52
  export {};
43
53
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/transport/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,KAAK,gBAAgB,GAAG,UAAU,SAAS,CAAA;AAC3C,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAChE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,iBAAiB,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEhG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,mBAAmB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,mBAAmB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,GAAG,CAAC,OAAO,SAAS,iBAAiB,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAC7F,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAA;KAAE,CAAA;IACvG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAA;KAAE,CAAA;CAC3G;AAED,wBAAgB,SAAS,CACvB,OAAO,SAAS,iBAAiB,EACjC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,MAAM,EAAE;IACR,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAA;CACvD,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CA8CzB"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/transport/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,KAAK,gBAAgB,GAAG,UAAU,SAAS,CAAA;AAC3C,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAChE,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,iBAAiB,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEhG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,mBAAmB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,kHAAkH;IAClH,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,kGAAkG;IAClG,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,mBAAmB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,GAAG,CAAC,OAAO,SAAS,iBAAiB,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAC7F,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG;QAC5B,MAAM,EAAE,SAAS,CAAA;QACjB,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;QAC/B,OAAO,EAAE,QAAQ,CAAA;QACjB,0EAA0E;QAC1E,KAAK,EAAE,WAAW,CAAA;KACnB,CAAA;IACD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAA;KAAE,CAAA;CAC3G;AAED,wBAAgB,SAAS,CACvB,OAAO,SAAS,iBAAiB,EACjC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,MAAM,EAAE;IACR,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAA;IACtD,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAA;CACvC,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAkDzB"}
@@ -24,8 +24,11 @@ export function createApp(config) {
24
24
  keepaliveInterval: options.keepaliveInterval,
25
25
  maxConcurrentRpc: options.maxConcurrentRpc,
26
26
  encoding: options.encoding,
27
+ tick: options.tick,
28
+ entities: config.entities,
29
+ replication: options.replication,
27
30
  });
28
- return { server, stores, systems };
31
+ return { server, stores, systems, world: server.world };
29
32
  },
30
33
  connect(options) {
31
34
  const { stores, systems } = instantiate();
@@ -41,6 +44,7 @@ export function createApp(config) {
41
44
  latencyThresholds: options.latencyThresholds,
42
45
  pingInterval: options.pingInterval,
43
46
  rpcTimeout: options.rpcTimeout,
47
+ entities: config.entities,
44
48
  });
45
49
  return { client, stores, systems };
46
50
  },
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/transport/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AA4BtC,MAAM,UAAU,SAAS,CAGvB,MAGD;IACC,SAAS,WAAW;QAClB,MAAM,MAAM,GAAG,EAA6B,CAAA;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAc,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;QACnC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAO;YACX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI;gBACJ,QAAQ,EAAE,QAAqB;aAChC,CAAC,CAAC,CAAA;YACH,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC7B,MAAM,EAAE,SAAS;gBACjB,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QACpC,CAAC;QACD,OAAO,CAAC,OAAO;YACb,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI;gBACJ,QAAQ,EAAE,QAAqB;aAChC,CAAC,CAAC,CAAA;YACH,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,SAAS;gBACjB,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QACpC,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/transport/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAwCtC,MAAM,UAAU,SAAS,CAGvB,MAKD;IACC,SAAS,WAAW;QAClB,MAAM,MAAM,GAAG,EAA6B,CAAA;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAc,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;QACnC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC5B,CAAC;IAED,OAAO;QACL,KAAK,CAAC,OAAO;YACX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI;gBACJ,QAAQ,EAAE,QAAqB;aAChC,CAAC,CAAC,CAAA;YACH,MAAM,MAAM,GAAG,eAAe,CAAC;gBAC7B,MAAM,EAAE,SAAS;gBACjB,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;gBAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;QACzD,CAAC;QACD,OAAO,CAAC,OAAO;YACb,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;YACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,IAAI;gBACJ,QAAQ,EAAE,QAAqB;aAChC,CAAC,CAAC,CAAA;YACH,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,SAAS;gBACjB,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QACpC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { BaseClientLifecycle } from '../lifecycle/base-client.js';
2
2
  import { BaseStore } from '../store/base-store.js';
3
+ import { ClientEntityRegistry } from '../entity/registry.js';
4
+ import type { EntityConstructor, EntityId } from '../entity/types.js';
3
5
  interface StoreRegistration {
4
6
  name: string;
5
7
  instance: BaseStore;
@@ -18,6 +20,8 @@ export interface WsClientOptions {
18
20
  latencyThresholds?: LatencyThresholds;
19
21
  pingInterval?: number;
20
22
  rpcTimeout?: number;
23
+ /** `@Entity` classes this client can mirror. Must match the server's registered types. */
24
+ entities?: EntityConstructor<object>[];
21
25
  }
22
26
  export declare class WsClient {
23
27
  private options;
@@ -41,6 +45,8 @@ export declare class WsClient {
41
45
  private receivedStoreCount;
42
46
  private readonly rpcTimeout;
43
47
  private codec;
48
+ /** Mirror of the entities this client can currently see. */
49
+ readonly entities: ClientEntityRegistry;
44
50
  constructor(options: WsClientOptions);
45
51
  private encode;
46
52
  private decode;
@@ -53,6 +59,12 @@ export declare class WsClient {
53
59
  private openConnection;
54
60
  connect(): Promise<void>;
55
61
  call(method: string, args: unknown[]): Promise<unknown>;
62
+ /**
63
+ * Calls a `@Server` method on one entity. The client bundle's transformed `@Server` bodies call
64
+ * through here; the server authorises the caller against the entity's `canCall` rule.
65
+ */
66
+ callEntity(entityId: EntityId, method: string, args: unknown[]): Promise<unknown>;
67
+ private send;
56
68
  disconnect(): Promise<void>;
57
69
  }
58
70
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAMlD,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAA;AAC3F,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAExD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,SAAS,EAAE,mBAAmB,CAAA;IAC9B,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,QAAQ;IAwBP,OAAO,CAAC,OAAO;IAvB3B,OAAO,CAAC,EAAE,CAAC,CAA6B;IACxC,OAAO,CAAC,YAAY,CAAmF;IACvG,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAErC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAO;IAC7B,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAO;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAO;IAC9B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACnD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAEvE,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,KAAK,CAAmB;gBAEZ,OAAO,EAAE,eAAe;IAS5C,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,YAAY;IAkHpB,OAAO,CAAC,cAAc;IAsCtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBvD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
+ import { getMethodRoles } from '../decorators/metadata.js';
1
2
  import WsImpl from './ws-node.js';
2
3
  import { ConnectionLostError, AuthRejectedError, RpcError, TimeoutError } from './protocol.js';
3
4
  import { v4 as uuidv4 } from 'uuid';
4
5
  import { jsonCodec, msgpackCodec } from './codec.js';
6
+ import { ClientEntityRegistry } from '../entity/registry.js';
5
7
  export class WsClient {
6
8
  options;
7
9
  ws;
@@ -24,11 +26,18 @@ export class WsClient {
24
26
  receivedStoreCount = 0;
25
27
  rpcTimeout;
26
28
  codec = jsonCodec;
29
+ /** Mirror of the entities this client can currently see. */
30
+ entities;
27
31
  constructor(options) {
28
32
  this.options = options;
29
33
  this.thresholds = options.latencyThresholds ?? { good: 100, fair: 300 };
30
34
  this.pingInterval = options.pingInterval ?? 5_000;
31
35
  this.rpcTimeout = options.rpcTimeout ?? 30_000;
36
+ this.entities = new ClientEntityRegistry({
37
+ types: options.entities ?? [],
38
+ getPlayerId: () => this.playerId,
39
+ client: this,
40
+ });
32
41
  for (const system of Object.values(options.systems)) {
33
42
  system.__wsClient = this;
34
43
  }
@@ -109,9 +118,9 @@ export class WsClient {
109
118
  ;
110
119
  store.instance[key] = value;
111
120
  }
112
- if (typeof store.instance._onReplication === 'function') {
121
+ if (typeof store.instance._emitReplication === 'function' || typeof store.instance._onReplication === 'function') {
113
122
  ;
114
- store.instance._onReplication({
123
+ (store.instance._emitReplication ?? store.instance._onReplication).call(store.instance, {
115
124
  globalSeq: 0,
116
125
  global: msg.snapshot,
117
126
  ownerByPlayer: new Map()
@@ -143,7 +152,7 @@ export class WsClient {
143
152
  ;
144
153
  store.instance[key] = value;
145
154
  }
146
- if (typeof store.instance._onReplication === 'function') {
155
+ if (typeof store.instance._emitReplication === 'function' || typeof store.instance._onReplication === 'function') {
147
156
  const batch = {
148
157
  globalSeq: msg.scope === 'global' ? msg.seq : 0,
149
158
  global: msg.scope === 'global' ? msg.patch : {},
@@ -151,21 +160,39 @@ export class WsClient {
151
160
  ? new Map([[this.playerId, { seq: msg.seq, patch: msg.patch }]])
152
161
  : new Map()
153
162
  };
154
- store.instance._onReplication(batch);
163
+ (store.instance._emitReplication ?? store.instance._onReplication).call(store.instance, batch);
155
164
  }
156
165
  }
157
166
  return;
158
167
  }
159
168
  if (msg.type === 'rpc') {
160
- const methodName = msg.method.split('.')[1];
169
+ const [className, methodName] = msg.method.split('.');
161
170
  for (const system of Object.values(systems)) {
162
- if (typeof system[methodName] === 'function') {
163
- ;
171
+ const proto = Object.getPrototypeOf(system);
172
+ const stamped = proto.constructor.__replicastName ?? proto.constructor.name;
173
+ // Match on class when we can (stamped by the Vite plugin or an unminified name); fall back to any system with the method.
174
+ if (className && stamped && stamped !== className && stamped !== '')
175
+ continue;
176
+ if (typeof system[methodName] !== 'function')
177
+ continue;
178
+ // @Client methods declare targetId as their first parameter (consumed by the server when
179
+ // routing); on the receiving client that slot is our own playerId so the signature stays truthful.
180
+ const role = getMethodRoles(proto)[methodName];
181
+ if (role === 'client')
182
+ system[methodName](this.playerId, ...msg.args);
183
+ else
164
184
  system[methodName](...msg.args);
165
- }
166
185
  }
167
186
  return;
168
187
  }
188
+ if (msg.type === 'entity_sync') {
189
+ this.entities.applySync({ enter: msg.enter, update: msg.update, leave: msg.leave });
190
+ return;
191
+ }
192
+ if (msg.type === 'entity_rpc') {
193
+ this.entities.applyRpc(msg.id, msg.method, msg.args);
194
+ return;
195
+ }
169
196
  if (msg.type === 'rpc_result') {
170
197
  const pending = this.pendingCalls.get(msg.id);
171
198
  if (!pending)
@@ -210,6 +237,8 @@ export class WsClient {
210
237
  this.ws.on('close', async () => {
211
238
  this.stopPinging();
212
239
  this.rejectPending();
240
+ // Entities re-enter in full on reconnect, so drop the stale mirrors (running @ClientDespawn).
241
+ this.entities.clear();
213
242
  await lifecycle.onDisconnected();
214
243
  if (this.shouldReconnect) {
215
244
  this.reconnectAttempt++;
@@ -234,6 +263,16 @@ export class WsClient {
234
263
  return this.openConnection();
235
264
  }
236
265
  call(method, args) {
266
+ return this.send(method, args);
267
+ }
268
+ /**
269
+ * Calls a `@Server` method on one entity. The client bundle's transformed `@Server` bodies call
270
+ * through here; the server authorises the caller against the entity's `canCall` rule.
271
+ */
272
+ callEntity(entityId, method, args) {
273
+ return this.send(method, args, entityId);
274
+ }
275
+ send(method, args, entityId) {
237
276
  return new Promise((resolve, reject) => {
238
277
  if (!this.ws || this.ws.readyState !== WsImpl.OPEN) {
239
278
  reject(new Error('Not connected'));
@@ -250,7 +289,9 @@ export class WsClient {
250
289
  resolve: (v) => { clearTimeout(timer); resolve(v); },
251
290
  reject: (e) => { clearTimeout(timer); reject(e); },
252
291
  });
253
- this.ws.send(this.encode({ type: 'rpc', method, args, id }));
292
+ this.ws.send(this.encode(entityId === undefined
293
+ ? { type: 'rpc', method, args, id }
294
+ : { type: 'rpc', method, args, id, entityId }));
254
295
  });
255
296
  }
256
297
  disconnect() {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE9F,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAc,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAyBhE,MAAM,OAAO,QAAQ;IAwBC;IAvBZ,EAAE,CAA8B;IAChC,YAAY,GAAG,IAAI,GAAG,EAAyE,CAAA;IAC/F,eAAe,GAAG,KAAK,CAAA;IACvB,gBAAgB,GAAG,CAAC,CAAA;IACX,QAAQ,GAAG,MAAM,CAAA;IACjB,SAAS,GAAG,KAAK,CAAA;IAC1B,SAAS,CAAiC;IAC1C,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA,CAAE,sBAAsB;IACvD,UAAU,CAAmB;IAC7B,YAAY,CAAQ;IAErC,OAAO,GAAkB,IAAI,CAAA;IAC7B,OAAO,GAA6B,IAAI,CAAA;IACxC,QAAQ,GAAkB,IAAI,CAAA;IAC9B,cAAc,CAAqC;IACnD,eAAe,CAAwD;IAE/D,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA,CAAM,2BAA2B;IACpE,kBAAkB,GAAG,CAAC,CAAA;IACtB,kBAAkB,GAAG,CAAC,CAAA;IACb,UAAU,CAAQ;IAC3B,KAAK,GAAU,SAAS,CAAA;IAEhC,YAAoB,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;QACvE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAA;QACjD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;QAC9C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,MAAc,CAAC,UAAU,GAAG,IAAI,CAAA;QACnC,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAEO,MAAM,CAAC,GAAY;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAiD,CAA0B,CAAA;IACtG,CAAC;IAEO,QAAQ;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1F,OAAO,KAAK,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;IAC5C,CAAC;IAEO,aAAa;QACnB,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAA;QACnC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,MAAM,CAAC,IAAI;gBAAE,OAAM;YAC/C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;YACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACjD,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;IACvB,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;YAAE,OAAO,MAAM,CAAA;QAC7C,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;YAAE,OAAO,MAAM,CAAA;QAC7C,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,YAAY,CAAC,GAA0B,EAAE,OAAmB,EAAE,MAA0B;QAC9F,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAEnD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACjC,8CAA8C;YAC9C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;YAC5B,SAAS,CAAC,YAAY,EAAE;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;iBAC3C,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1B,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,YAAY,CAAA;YACzD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;YAC5B,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,UAAU,CAAA;YACxC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAA;YAC3B,oCAAoC;YACpC,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAChC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;oBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAA;oBAClC,IAAI,CAAC,YAAY,EAAE,CAAA;oBACnB,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1B,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,gEAAgE;YAChE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,SAAS,CAAC,CAAA;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAA;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,CAAA;YACpD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxD,CAAC;oBAAC,KAAK,CAAC,QAA+C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACtE,CAAC;gBACD,IAAI,OAAQ,KAAK,CAAC,QAAgB,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;oBACjE,CAAC;oBAAC,KAAK,CAAC,QAAgB,CAAC,cAAc,CAAC;wBACtC,SAAS,EAAE,CAAC;wBACZ,MAAM,EAAE,GAAG,CAAC,QAAQ;wBACpB,aAAa,EAAE,IAAI,GAAG,EAAE;qBACzB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,sDAAsD;YACtD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACvD,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAChC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;oBACzB,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAA;oBAClC,IAAI,CAAC,YAAY,EAAE,CAAA;oBACnB,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1B,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC/B,gDAAgD;YAChD,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,CAAA;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC7C,IAAI,GAAG,CAAC,GAAG,IAAI,OAAO;gBAAE,OAAM;YAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,CAAA;YACpD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,CAAC;oBAAC,KAAK,CAAC,QAA+C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACtE,CAAC;gBACD,IAAI,OAAQ,KAAK,CAAC,QAAgB,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;oBACjE,MAAM,KAAK,GAAG;wBACZ,SAAS,EAAE,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC/C,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;wBAC/C,aAAa,EAAE,GAAG,CAAC,KAAK,KAAK,OAAO;4BAClC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAS,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;4BACjE,CAAC,CAAC,IAAI,GAAG,EAAE;qBACd,CACA;oBAAC,KAAK,CAAC,QAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAChD,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,OAAQ,MAAc,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE,CAAC;oBACtD,CAAC;oBAAC,MAAc,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC3C,CAAC;YACH,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC7C,IAAI,CAAC,OAAO;gBAAE,OAAM;YACpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,IAAI,GAAG,CAAC,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;;gBACjD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1C,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAM;YAC9B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;YAC7B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;YACvC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;YAEzB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAE3B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC5B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAA;gBAC3C,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC5B,IAAI,GAA0B,CAAA;gBAC9B,IAAI,CAAC;oBAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAM;gBAAC,CAAC;gBAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAC7B,IAAI,CAAC,WAAW,EAAE,CAAA;gBAClB,IAAI,CAAC,aAAa,EAAE,CAAA;gBACpB,MAAM,SAAS,CAAC,cAAc,EAAE,CAAA;gBAChC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACzB,IAAI,CAAC,gBAAgB,EAAE,CAAA;oBACvB,IAAI,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAA;oBACrC,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;4BACzB,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC,CAAA;4BACnC,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;wBACvC,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACrB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAA;gBACvC,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAA;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC,CAAA;QACnC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;IAC9B,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,IAAe;QAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;gBAClC,OAAM;YACR,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;YACnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBAC5B,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAA;gBAC5B,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;gBACxB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC;gBACnD,MAAM,EAAG,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC;aACnD,CAAC,CAAA;YACF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC9D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,UAAU;QACR,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,EAAE,CAAC;gBAAC,OAAM;YAAC,CAAC;YAC3E,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YACtC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
+ import type { EntityId, EntityEnter, EntityUpdate } from '../entity/types.js';
1
2
  export interface RpcCallMessage {
2
3
  type: 'rpc';
3
4
  method: string;
4
5
  args: unknown[];
5
6
  id: string;
7
+ /** Set when the call targets a `@Server` method on one entity rather than a system. */
8
+ entityId?: EntityId;
6
9
  }
7
10
  export interface RpcResultMessage {
8
11
  type: 'rpc_result';
@@ -41,6 +44,20 @@ export interface ConnectedMessage {
41
44
  storeCount: number;
42
45
  encoding: 'json' | 'msgpack';
43
46
  }
47
+ /** One client's entity delta for a replication flush. */
48
+ export interface EntitySyncMessage {
49
+ type: 'entity_sync';
50
+ enter: EntityEnter[];
51
+ update: EntityUpdate[];
52
+ leave: EntityId[];
53
+ }
54
+ /** A server-initiated `@Client` / `@Multicast` call on one entity. */
55
+ export interface EntityRpcMessage {
56
+ type: 'entity_rpc';
57
+ id: EntityId;
58
+ method: string;
59
+ args: unknown[];
60
+ }
44
61
  export interface PingMessage {
45
62
  type: 'ping';
46
63
  id: string;
@@ -50,7 +67,7 @@ export interface PongMessage {
50
67
  id: string;
51
68
  }
52
69
  export type ClientToServerMessage = RpcCallMessage | AuthPayloadMessage | PingMessage;
53
- export type ServerToClientMessage = ConnectedMessage | RpcResultMessage | RpcPushMessage | StateInitMessage | StatePatchMessage | AuthRejectedMessage | PongMessage;
70
+ export type ServerToClientMessage = ConnectedMessage | RpcResultMessage | RpcPushMessage | StateInitMessage | StatePatchMessage | AuthRejectedMessage | PongMessage | EntitySyncMessage | EntityRpcMessage;
54
71
  export declare class ConnectionLostError extends Error {
55
72
  constructor();
56
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;CACX;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,kBAAkB,GAAG,WAAW,CAAA;AAErF,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,WAAW,CAAA;AAEf,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAED,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED,qBAAa,QAAS,SAAQ,KAAK;aACL,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM;CAIlD;AAED,qBAAa,YAAa,SAAQ,KAAK;;CAKtC"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAG7E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,uFAAuF;IACvF,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,EAAE,QAAQ,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG,kBAAkB,GAAG,WAAW,CAAA;AAErF,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,WAAW,GACX,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAED,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED,qBAAa,QAAS,SAAQ,KAAK;aACL,aAAa,EAAE,MAAM;gBAArB,aAAa,EAAE,MAAM;CAIlD;AAED,qBAAa,YAAa,SAAQ,KAAK;;CAKtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"AA0EA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACL;IAA5B,YAA4B,aAAqB;QAC/C,KAAK,CAAC,aAAa,CAAC,CAAA;QADM,kBAAa,GAAb,aAAa,CAAQ;QAE/C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC;QACE,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/transport/protocol.ts"],"names":[],"mappings":"AAgGA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACL;IAA5B,YAA4B,aAAqB;QAC/C,KAAK,CAAC,aAAa,CAAC,CAAA;QADM,kBAAa,GAAb,aAAa,CAAQ;QAE/C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC;QACE,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF"}
@@ -1,5 +1,7 @@
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;
@@ -12,6 +14,20 @@ interface CreateRpcServerOptions {
12
14
  keepaliveInterval?: number;
13
15
  maxConcurrentRpc?: number;
14
16
  encoding?: 'json' | 'msgpack';
17
+ /** Optional fixed-rate simulation tick. `onTick` runs inside a server context (useCtx() works; playerId is ''). */
18
+ tick?: TickOptions;
19
+ /** `@Entity` classes this world can spawn. Required for entity replication. */
20
+ entities?: EntityConstructor<object>[];
21
+ /** How often each client's entity delta is flushed. Defaults to 20 Hz. */
22
+ replication?: ReplicationOptions;
23
+ }
24
+ export interface TickOptions {
25
+ hz: number;
26
+ onTick: (dt: number) => void | Promise<void>;
27
+ }
28
+ export interface ReplicationOptions {
29
+ /** Entity flush rate, independent of the sim tick rate (e.g. sim 30, replication 15). */
30
+ hz?: number;
15
31
  }
16
32
  export interface RpcServer {
17
33
  close(): Promise<void>;
@@ -19,6 +35,8 @@ export interface RpcServer {
19
35
  ready: Promise<void>;
20
36
  /** The port the server is listening on. Valid after `ready` resolves. */
21
37
  port: number;
38
+ /** Server-side entity registry: `spawn`, `despawn`, `byType`, `flush`. */
39
+ world: EntityWorld;
22
40
  }
23
41
  export declare function createRPCServer(options: CreateRpcServerOptions): RpcServer;
24
42
  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;AAmBlD,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,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B;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;CACb;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,CAkM1E"}
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;AAsBjF,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,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,0EAA0E;IAC1E,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,yFAAyF;IACzF,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,CAiS1E"}
@@ -1,14 +1,19 @@
1
1
  import { WebSocketServer, WebSocket } from 'ws';
2
2
  import { getMethodRoles } from '../decorators/metadata.js';
3
3
  import { contextStorage } from './context.js';
4
+ import { EntityWorld } from '../entity/world.js';
4
5
  import { jsonCodec, msgpackCodec } from './codec.js';
5
6
  const AUTH_TIMEOUT_MS = 10_000;
6
7
  const KEEPALIVE_INTERVAL_MS = 30_000;
7
8
  const MAX_CONCURRENT_RPC = 50;
9
+ const REPLICATION_HZ = 20;
10
+ // Stopgap until R-5 lands per-message `maxArgsBytes`: reject anything wildly larger than a
11
+ // legitimate rpc/entity_rpc payload before it is even buffered, instead of the `ws` default (~100MiB).
12
+ const MAX_MESSAGE_BYTES = 1_000_000;
8
13
  export function createRPCServer(options) {
9
- const { stores, systems, lifecycle, port, keepaliveInterval = KEEPALIVE_INTERVAL_MS, maxConcurrentRpc = MAX_CONCURRENT_RPC, encoding = 'json', } = options;
14
+ const { stores, systems, lifecycle, port, keepaliveInterval = KEEPALIVE_INTERVAL_MS, maxConcurrentRpc = MAX_CONCURRENT_RPC, encoding = 'json', tick, entities = [], replication, } = options;
10
15
  const codec = encoding === 'msgpack' ? msgpackCodec : jsonCodec;
11
- const wss = new WebSocketServer({ port });
16
+ const wss = new WebSocketServer({ port, maxPayload: MAX_MESSAGE_BYTES });
12
17
  let actualPort = port;
13
18
  let resolveReady;
14
19
  const ready = new Promise(resolve => { resolveReady = resolve; });
@@ -31,7 +36,8 @@ export function createRPCServer(options) {
31
36
  const methods = new Map();
32
37
  for (const system of Object.values(systems)) {
33
38
  const proto = Object.getPrototypeOf(system);
34
- const className = proto.constructor.name;
39
+ // Prefer the name stamped by @replicast/vite-plugin; constructor.name is unreliable after bundling/minification.
40
+ const className = proto.constructor.__replicastName ?? proto.constructor.name;
35
41
  const roles = getMethodRoles(proto);
36
42
  for (const [methodName, role] of Object.entries(roles)) {
37
43
  if (role === 'server') {
@@ -40,6 +46,53 @@ export function createRPCServer(options) {
40
46
  }
41
47
  }
42
48
  }
49
+ function pushToClient(targetId, method, args) {
50
+ const target = connections.get(targetId);
51
+ if (target?.readyState === WebSocket.OPEN) {
52
+ target.send(codec.encode({ type: 'rpc', method, args }));
53
+ }
54
+ }
55
+ const world = new EntityWorld({
56
+ types: entities,
57
+ transport: {
58
+ sendRpc(playerId, id, method, args) {
59
+ const target = connections.get(playerId);
60
+ if (target?.readyState === WebSocket.OPEN) {
61
+ target.send(codec.encode({ type: 'entity_rpc', id, method, args }));
62
+ }
63
+ },
64
+ sendSync(playerId, sync) {
65
+ const target = connections.get(playerId);
66
+ if (target?.readyState === WebSocket.OPEN) {
67
+ target.send(codec.encode({ type: 'entity_sync', ...sync }));
68
+ }
69
+ },
70
+ players: () => [...connections.keys()],
71
+ },
72
+ });
73
+ // Runtime dispatch: on the server, calling a @Client / @Multicast method sends it to clients.
74
+ // This makes the server independent of the Vite transform (plain tsx/node works), and lets
75
+ // tick loops and lifecycle hooks call them like any other method.
76
+ for (const system of Object.values(systems)) {
77
+ const proto = Object.getPrototypeOf(system);
78
+ const className = proto.constructor.__replicastName ?? proto.constructor.name;
79
+ for (const [methodName, role] of Object.entries(getMethodRoles(proto))) {
80
+ const key = `${className}.${methodName}`;
81
+ if (role === 'client') {
82
+ Object.defineProperty(system, methodName, {
83
+ value: (targetId, ...args) => { pushToClient(targetId, key, args); },
84
+ configurable: true, writable: true,
85
+ });
86
+ }
87
+ else if (role === 'multicast') {
88
+ Object.defineProperty(system, methodName, {
89
+ value: (...args) => { for (const pid of connections.keys())
90
+ pushToClient(pid, key, args); },
91
+ configurable: true, writable: true,
92
+ });
93
+ }
94
+ }
95
+ }
43
96
  for (const { name, instance } of stores) {
44
97
  instance._onReplication = (batch) => {
45
98
  if (batch.globalSeq > 0) {
@@ -63,6 +116,9 @@ export function createRPCServer(options) {
63
116
  ws._isAlive = true;
64
117
  ws.on('pong', () => { ws._isAlive = true; });
65
118
  ws.on('message', () => { ws._isAlive = true; });
119
+ // `ws` emits 'error' (e.g. maxPayload exceeded) and closes the socket itself; without a listener
120
+ // here that error event is unhandled and crashes the process — swallow it, 'close' does the cleanup.
121
+ ws.on('error', () => { });
66
122
  const authTimeout = setTimeout(() => ws.close(), AUTH_TIMEOUT_MS);
67
123
  ws.once('message', async (raw) => {
68
124
  // Fix 1: declare playerId in outer scope so catch can clean up
@@ -103,12 +159,7 @@ export function createRPCServer(options) {
103
159
  const ctx = {
104
160
  playerId: pid,
105
161
  get players() { return [...connections.keys()]; },
106
- sendToClient(targetId, method, ...args) {
107
- const target = connections.get(targetId);
108
- if (target?.readyState === WebSocket.OPEN) {
109
- target.send(codec.encode({ type: 'rpc', method, args }));
110
- }
111
- },
162
+ sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
112
163
  };
113
164
  // Fix 2: register RPC and close handlers BEFORE awaiting onPlayerJoined
114
165
  let inFlight = 0;
@@ -131,7 +182,10 @@ export function createRPCServer(options) {
131
182
  ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: 'Too many concurrent requests' }));
132
183
  return;
133
184
  }
134
- const handler = methods.get(msg.method);
185
+ // Entity-scoped calls carry the target entity id; the world authorises the caller.
186
+ const handler = msg.entityId !== undefined
187
+ ? (c, ...args) => contextStorage.run(c, () => world.invoke(pid, msg.entityId, msg.method, args))
188
+ : methods.get(msg.method);
135
189
  if (!handler) {
136
190
  ws.send(codec.encode({ type: 'rpc_result', id: msg.id, error: `Unknown method: ${msg.method}` }));
137
191
  return;
@@ -158,10 +212,15 @@ export function createRPCServer(options) {
158
212
  // Fix 3: guard against reconnect overwriting the map entry
159
213
  if (connections.get(pid) === ws)
160
214
  connections.delete(pid);
215
+ world.dropViewer(pid);
161
216
  await lifecycle.onPlayerLeft(ctx);
162
217
  });
163
218
  await lifecycle.onPlayerJoined(ctx);
164
219
  joined = true;
220
+ // Send the initial entity set now rather than waiting for the next replication tick,
221
+ // so entities spawned in onPlayerJoined arrive with the connection.
222
+ if (entities.length > 0)
223
+ world.flush();
165
224
  }
166
225
  catch (err) {
167
226
  // Fix 1: on any error (e.g. onPlayerJoined throw), clean up connection and close
@@ -171,15 +230,57 @@ export function createRPCServer(options) {
171
230
  }
172
231
  });
173
232
  });
233
+ let tickTimer;
234
+ if (tick) {
235
+ const dt = 1 / tick.hz;
236
+ const tickCtx = {
237
+ playerId: '',
238
+ get players() { return [...connections.keys()]; },
239
+ sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
240
+ };
241
+ let running = false;
242
+ tickTimer = setInterval(() => {
243
+ if (running)
244
+ return; // skip if the previous async tick hasn't finished
245
+ running = true;
246
+ Promise.resolve()
247
+ // Entity @ServerTick methods run first, so onTick sees the stepped world.
248
+ .then(() => contextStorage.run(tickCtx, () => { world.tick(dt); return tick.onTick(dt); }))
249
+ .catch(err => { console.error('[replicast] tick error:', err); })
250
+ .finally(() => { running = false; });
251
+ }, 1000 / tick.hz);
252
+ }
253
+ // Entity replication runs on its own clock so snapshots can be slower than the sim (e.g. 30/15).
254
+ let replicationTimer;
255
+ if (entities.length > 0) {
256
+ const replicationCtx = {
257
+ playerId: '',
258
+ get players() { return [...connections.keys()]; },
259
+ sendToClient(targetId, method, ...args) { pushToClient(targetId, method, args); },
260
+ };
261
+ replicationTimer = setInterval(() => {
262
+ try {
263
+ contextStorage.run(replicationCtx, () => world.flush());
264
+ }
265
+ catch (err) {
266
+ console.error('[replicast] replication flush error:', err);
267
+ }
268
+ }, 1000 / (replication?.hz ?? REPLICATION_HZ));
269
+ }
174
270
  let closed = false;
175
271
  return {
176
272
  ready,
273
+ world,
177
274
  get port() { return actualPort; },
178
275
  close: () => {
179
276
  if (closed)
180
277
  return Promise.resolve();
181
278
  closed = true;
182
279
  clearInterval(keepaliveTimer);
280
+ if (tickTimer)
281
+ clearInterval(tickTimer);
282
+ if (replicationTimer)
283
+ clearInterval(replicationTimer);
183
284
  // Fix 4: null out store replication callbacks
184
285
  for (const { instance } of stores) {
185
286
  instance._onReplication = undefined;