@forgeax/engine-net 0.1.3 → 0.1.6

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 (41) hide show
  1. package/README.md +156 -105
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/endpoint/endpoint.d.ts +7 -0
  4. package/dist/endpoint/endpoint.d.ts.map +1 -1
  5. package/dist/endpoint/memory.d.ts +3 -1
  6. package/dist/endpoint/memory.d.ts.map +1 -1
  7. package/dist/index.d.ts +11 -7
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.mjs +860 -117
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/replication/authority.d.ts +8 -6
  12. package/dist/replication/authority.d.ts.map +1 -1
  13. package/dist/replication/codec.d.ts +4 -22
  14. package/dist/replication/codec.d.ts.map +1 -1
  15. package/dist/replication/constants.d.ts +4 -1
  16. package/dist/replication/constants.d.ts.map +1 -1
  17. package/dist/replication/errors.d.ts +24 -4
  18. package/dist/replication/errors.d.ts.map +1 -1
  19. package/dist/replication/protocol.d.ts +63 -0
  20. package/dist/replication/protocol.d.ts.map +1 -0
  21. package/dist/replication/replica.d.ts +9 -6
  22. package/dist/replication/replica.d.ts.map +1 -1
  23. package/dist/session/net-session.d.ts +40 -6
  24. package/dist/session/net-session.d.ts.map +1 -1
  25. package/dist/session/recovery.d.ts +93 -0
  26. package/dist/session/recovery.d.ts.map +1 -0
  27. package/dist/session/session-plugin.d.ts +8 -2
  28. package/dist/session/session-plugin.d.ts.map +1 -1
  29. package/package.json +4 -4
  30. package/src/endpoint/endpoint.ts +8 -0
  31. package/src/endpoint/memory.ts +23 -1
  32. package/src/index.ts +56 -12
  33. package/src/replication/authority.ts +55 -23
  34. package/src/replication/codec.ts +167 -101
  35. package/src/replication/constants.ts +5 -1
  36. package/src/replication/errors.ts +22 -4
  37. package/src/replication/protocol.ts +86 -0
  38. package/src/replication/replica.ts +88 -28
  39. package/src/session/net-session.ts +612 -38
  40. package/src/session/recovery.ts +204 -0
  41. package/src/session/session-plugin.ts +21 -5
@@ -1 +1 @@
1
- {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/replication/authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAEL,KAAK,gBAAgB,EAGtB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEhF,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AASD,qBAAa,oBAAoB;;gBAOnB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB;IAIrD,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAGnC,OAAO,IAAI,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC;IAG3C,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC;CAiGhD;AACD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,GAC1B,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/replication/authority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,KAAK,EAEV,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,eAAe,GAAG,qBAAqB,GAAG;IACpD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B,CAAC;AASF,qBAAa,oBAAoB;;gBAUnB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,GAAE,SAA0B;IAK5F,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAGnC,OAAO,IAAI,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC;IAG5C,WAAW,IAAI,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC;IAGhD,oBAAoB,CAAC,SAAS,UAAQ,GAAG,MAAM;CAyHhD;AACD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,GAC1B,oBAAoB,CAEtB"}
@@ -1,26 +1,8 @@
1
1
  import { type Result } from '@forgeax/engine-types';
2
2
  import { NetError } from './errors';
3
3
  import type { ReplicationLimits } from './profile';
4
- export type NetEntityId = number & {
5
- readonly __netEntityId: unique symbol;
6
- };
7
- export interface ReplicationComponentRecord {
8
- readonly name: string;
9
- readonly operation?: 'replace' | 'remove';
10
- readonly data: Record<string, unknown>;
11
- }
12
- export interface ReplicationEntityRecord {
13
- readonly id: number;
14
- readonly kind: 'upsert' | 'despawn';
15
- readonly components: readonly ReplicationComponentRecord[];
16
- }
17
- export interface ReplicationBatch {
18
- readonly version: number;
19
- readonly fingerprint: string;
20
- readonly tick: number;
21
- readonly full: boolean;
22
- readonly entities: readonly ReplicationEntityRecord[];
23
- }
24
- export declare function encodeReplicationBatch(batch: ReplicationBatch, limits: ReplicationLimits): Result<Uint8Array, NetError>;
25
- export declare function decodeReplicationBatch(bytes: Uint8Array, limits: ReplicationLimits): Result<ReplicationBatch, NetError>;
4
+ import type { ReplicationPacket } from './protocol';
5
+ export type { ReplicationComponentRecord, ReplicationEntityRecord } from './protocol';
6
+ export declare function encodeReplicationPacket(packet: ReplicationPacket, limits: ReplicationLimits): Result<Uint8Array, NetError>;
7
+ export declare function decodeReplicationPacket(bytes: Uint8Array, limits: ReplicationLimits): Result<ReplicationPacket, NetError>;
26
8
  //# sourceMappingURL=codec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/replication/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC5D;AACD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACvD;AA2MD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAI9B;AACD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAoBpC"}
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/replication/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAkD,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpG,YAAY,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAsStF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAO9B;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAOrC"}
@@ -1,2 +1,5 @@
1
- export declare const REPLICATION_PROTOCOL_VERSION = 1;
1
+ /** The sole application replication protocol version published by net. */
2
+ export declare const REPLICATION_PROTOCOL_VERSION = 2;
3
+ /** Fixed wire prefix used to reject non-v2 replication bytes before dispatch. */
4
+ export declare const REPLICATION_PROTOCOL_PREFIX = "FXRP2";
2
5
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/replication/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/replication/constants.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,UAAU,CAAC"}
@@ -1,4 +1,4 @@
1
- type NetErrorDetailByCode = {
1
+ export type NetErrorDetailByCode = {
2
2
  'handshake-profile-mismatch': {
3
3
  readonly localFingerprint: string;
4
4
  readonly remoteFingerprint: string;
@@ -30,9 +30,29 @@ type NetErrorDetailByCode = {
30
30
  'apply-invariant-failed': {
31
31
  readonly reason: string;
32
32
  };
33
+ 'protocol-unsupported-version': {
34
+ readonly receivedVersion: number;
35
+ readonly supportedVersion: number;
36
+ };
37
+ 'session-illegal-transition': {
38
+ readonly from: string;
39
+ readonly to: string;
40
+ };
41
+ 'recovery-policy-invalid': {
42
+ readonly field: string;
43
+ readonly reason: string;
44
+ };
45
+ 'recovery-rejected': {
46
+ readonly reason: string;
47
+ };
48
+ 'recovery-exhausted': {
49
+ readonly attempts: number;
50
+ readonly maxAttempts: number;
51
+ };
33
52
  };
34
53
  export type NetErrorCode = keyof NetErrorDetailByCode;
35
- export type NetErrorDetail = NetErrorDetailByCode[NetErrorCode];
54
+ export type NetErrorDetailFor<C extends NetErrorCode> = NetErrorDetailByCode[C];
55
+ export type NetErrorDetail = NetErrorDetailFor<NetErrorCode>;
36
56
  declare class NetErrorClass extends Error {
37
57
  readonly code: NetErrorCode;
38
58
  readonly expected: string;
@@ -47,7 +67,7 @@ declare class NetErrorClass extends Error {
47
67
  }
48
68
  type Variant<C extends NetErrorCode> = NetErrorClass & {
49
69
  readonly code: C;
50
- readonly detail: NetErrorDetailByCode[C];
70
+ readonly detail: NetErrorDetailFor<C>;
51
71
  };
52
72
  export type NetError = {
53
73
  [C in NetErrorCode]: Variant<C>;
@@ -57,7 +77,7 @@ interface NetErrorConstructor {
57
77
  code: C;
58
78
  expected: string;
59
79
  hint: string;
60
- detail: NetErrorDetailByCode[C];
80
+ detail: NetErrorDetailFor<C>;
61
81
  }): Variant<C>;
62
82
  readonly prototype: NetErrorClass;
63
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/replication/errors.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG;IAC1B,4BAA4B,EAAE;QAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACpC,CAAC;IACF,wBAAwB,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,uBAAuB,EAAE;QACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,uBAAuB,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,kBAAkB,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,gBAAgB,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,4BAA4B,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,wBAAwB,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;AAEhE,cAAM,aAAc,SAAQ,KAAK;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBACpB,IAAI,EAAE;QAChB,IAAI,EAAE,YAAY,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,cAAc,CAAC;KACxB;CAQF;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,YAAY,IAAI,aAAa,GAAG;IACrD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;KACpB,CAAC,IAAI,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;CAChC,CAAC,YAAY,CAAC,CAAC;AAEhB,UAAU,mBAAmB;IAC3B,KAAK,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE;QACjC,IAAI,EAAE,CAAC,CAAC;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;KACjC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;CACnC;AACD,eAAO,MAAM,QAAQ,EAAE,mBAAqE,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/replication/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { SessionId } from '../session/recovery';
2
+ /** Replicated ECS entity operations owned by the protocol manifest. */
3
+ export type ReplicationEntityKind = 'upsert' | 'despawn';
4
+ export interface ReplicationComponentRecord {
5
+ readonly name: string;
6
+ readonly operation?: 'replace' | 'remove';
7
+ readonly data: Record<string, unknown>;
8
+ }
9
+ export interface ReplicationEntityRecord {
10
+ readonly id: number;
11
+ readonly kind: ReplicationEntityKind;
12
+ readonly components: readonly ReplicationComponentRecord[];
13
+ }
14
+ export type ReplicationPacketKind = 'session-open' | 'session-resume' | 'baseline' | 'delta' | 'ack' | 'rejection';
15
+ /** Control packet that opens or resumes one application session. */
16
+ export interface ReplicationSessionPacket {
17
+ readonly version: 2;
18
+ readonly kind: 'session-open' | 'session-resume';
19
+ readonly sessionId: SessionId;
20
+ readonly epoch: number;
21
+ readonly sequence: 0;
22
+ }
23
+ /** Shared fields for baseline and delta data packets. */
24
+ export interface ReplicationDataPacketBase {
25
+ readonly version: 2;
26
+ readonly kind: 'baseline' | 'delta';
27
+ readonly sessionId: SessionId;
28
+ readonly epoch: number;
29
+ readonly sequence: number;
30
+ readonly tick: number;
31
+ readonly fingerprint: string;
32
+ readonly entities: readonly ReplicationEntityRecord[];
33
+ }
34
+ /** Complete authoritative baseline; sequence one is required for every epoch. */
35
+ export interface ReplicationBaselinePacket extends ReplicationDataPacketBase {
36
+ readonly kind: 'baseline';
37
+ readonly sequence: 1;
38
+ }
39
+ /** Ordered authoritative delta after the accepted baseline. */
40
+ export interface ReplicationDeltaPacket extends ReplicationDataPacketBase {
41
+ readonly kind: 'delta';
42
+ readonly sequence: number;
43
+ }
44
+ export type ReplicationDataPacket = ReplicationBaselinePacket | ReplicationDeltaPacket;
45
+ export interface ReplicationAckPacket {
46
+ readonly version: 2;
47
+ readonly kind: 'ack';
48
+ readonly sessionId: SessionId;
49
+ readonly epoch: number;
50
+ readonly acknowledgedSequence: number;
51
+ }
52
+ export interface ReplicationRejectionPacket {
53
+ readonly version: 2;
54
+ readonly kind: 'rejection';
55
+ readonly sessionId: SessionId;
56
+ readonly epoch: number;
57
+ readonly sequence: number;
58
+ readonly rejectedKind: ReplicationPacketKind;
59
+ readonly reason: string;
60
+ }
61
+ export type ReplicationPacket = ReplicationSessionPacket | ReplicationBaselinePacket | ReplicationDeltaPacket | ReplicationAckPacket | ReplicationRejectionPacket;
62
+ export type ReplicationDataPacketKind = ReplicationDataPacket['kind'];
63
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/replication/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import type { Component, EntityHandle, World } from '@forgeax/engine-ecs';
2
2
  import { type Result } from '@forgeax/engine-types';
3
3
  import type { NetEndpoint } from '../endpoint/endpoint';
4
- import { type ReplicationBatch } from './codec';
5
4
  import { NetError } from './errors';
6
5
  import type { ReplicationLimits, ReplicationProfile } from './profile';
6
+ import type { ReplicationDataPacket } from './protocol';
7
7
  export declare class ReplicaCoordinator {
8
8
  #private;
9
- constructor(world: World, profile: ReplicationProfile, endpoint?: NetEndpoint);
9
+ constructor(world: World, profile: ReplicationProfile, _endpoint?: unknown);
10
10
  entityFor(id: number): EntityHandle | undefined;
11
11
  readComponent(id: number, component: Component): Record<string, unknown> | undefined;
12
12
  snapshot(): readonly {
@@ -18,10 +18,13 @@ export declare class ReplicaCoordinator {
18
18
  clear(): void;
19
19
  get stopped(): boolean;
20
20
  get tick(): number;
21
- validate(batch: ReplicationBatch): NetError | null;
22
- apply(batch: ReplicationBatch): Result<void, NetError>;
21
+ /** Report the last accepted, duplicate, or stale-epoch packet decision. */
22
+ get lastPacketOutcome(): 'accepted' | 'duplicate' | 'ignored-old-epoch';
23
+ getPendingUnresolvedReferences(): number;
24
+ validate(packet: ReplicationDataPacket): NetError | null;
25
+ apply(packet: ReplicationDataPacket): Result<void, NetError>;
23
26
  }
24
27
  export declare function createReplicaCoordinator(world: World, profile: ReplicationProfile, endpoint?: NetEndpoint): ReplicaCoordinator;
25
- export declare function applyReplicaBatch(replica: ReplicaCoordinator, batch: ReplicationBatch): Result<void, NetError>;
26
- export declare function decodeAndApplyReplicaBatch(replica: ReplicaCoordinator, bytes: Uint8Array, limits: ReplicationLimits): Result<void, NetError>;
28
+ export declare function applyReplicationPacket(replica: ReplicaCoordinator, packet: ReplicationDataPacket): Result<void, NetError>;
29
+ export declare function decodeAndApplyReplicationPacket(replica: ReplicaCoordinator, bytes: Uint8Array, limits: ReplicationLimits): Result<void, NetError>;
27
30
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../../src/replication/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEvE,qBAAa,kBAAkB;;gBAOjB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EAAE,WAAW;IAK7E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAG/C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAMpF,QAAQ,IAAI,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE;IAUpE,UAAU,IAAI,IAAI;IAGlB,6EAA6E;IAC7E,KAAK,IAAI,IAAI;IAIb,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAOD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,QAAQ,GAAG,IAAI;IAiFlD,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;CAwEvD;AACD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,WAAW,GACrB,kBAAkB,CAEpB;AACD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,gBAAgB,GACtB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAExB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAOxB"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../../src/replication/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,kBAAkB;;gBASjB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,OAAO;IAI1E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAG/C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IAMpF,QAAQ,IAAI,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE;IAUpE,UAAU,IAAI,IAAI;IAClB,6EAA6E;IAC7E,KAAK,IAAI,IAAI;IAIb,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,2EAA2E;IAC3E,IAAI,iBAAiB,IAAI,UAAU,GAAG,WAAW,GAAG,mBAAmB,CAEtE;IACD,8BAA8B,IAAI,MAAM;IASxC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,QAAQ,GAAG,IAAI;IAiHxD,KAAK,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;CAoF7D;AACD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,CAAC,EAAE,WAAW,GACrB,kBAAkB,CAEpB;AACD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAExB;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAgBxB"}
@@ -1,20 +1,42 @@
1
1
  import { type Result } from '@forgeax/engine-types';
2
- import type { NetEndpoint, PeerId } from '../endpoint/endpoint';
3
- import type { EndpointError } from '../endpoint/errors';
2
+ import type { NetEndpoint, NetEndpointConnector, PeerId } from '../endpoint/endpoint';
3
+ import { type EndpointError } from '../endpoint/errors';
4
4
  import type { AuthorityCoordinator } from '../replication/authority';
5
- import type { NetError } from '../replication/errors';
6
- import type { ReplicationLimits } from '../replication/profile';
5
+ import { NetError } from '../replication/errors';
6
+ import { type ReplicationLimits } from '../replication/profile';
7
7
  import { type ReplicaCoordinator } from '../replication/replica';
8
+ import { type NetRecoveryOutcome, type NetRecoveryPolicy, type NetRecoverySnapshot, type SessionId } from './recovery';
8
9
  export interface PeerSnapshot {
9
10
  readonly peerIds: ReadonlyArray<PeerId>;
10
11
  readonly connected: boolean;
11
12
  }
13
+ export interface SessionSnapshot {
14
+ readonly sessionIds: ReadonlyArray<SessionId>;
15
+ readonly connected: boolean;
16
+ }
17
+ export interface NetSessionClock {
18
+ readonly now: () => number;
19
+ readonly schedule: (delayMs: number, callback: () => void) => {
20
+ cancel(): void;
21
+ };
22
+ }
23
+ export interface NetSessionResourceCounts {
24
+ readonly pendingConnects: number;
25
+ readonly timers: number;
26
+ readonly ledgers: number;
27
+ readonly callbacks: number;
28
+ }
12
29
  export interface NetSessionConfig {
13
- readonly endpoint: NetEndpoint;
30
+ readonly endpoint?: NetEndpoint;
31
+ readonly connector?: NetEndpointConnector;
32
+ readonly sessionId?: SessionId | number;
33
+ readonly recovery?: Partial<NetRecoveryPolicy>;
34
+ readonly clock?: NetSessionClock;
14
35
  readonly maxRawMessages: number;
15
36
  }
16
37
  export interface RawMessage {
17
38
  readonly peerId: PeerId;
39
+ readonly sessionId: SessionId;
18
40
  readonly data: Uint8Array;
19
41
  }
20
42
  export declare class NetSession {
@@ -23,10 +45,22 @@ export declare class NetSession {
23
45
  receiveEvents(): readonly NetError[];
24
46
  drainRawMessages(): RawMessage[];
25
47
  getPeerSnapshot(): PeerSnapshot;
26
- sendRaw(peerId: PeerId, data: Uint8Array): Result<void, EndpointError>;
48
+ getSessionSnapshot(): SessionSnapshot;
49
+ /** Return lifecycle, epoch, sequence, ledger, and owned-resource evidence. */
50
+ getRecoverySnapshot(): NetRecoverySnapshot;
51
+ getResourceSnapshot(): NetSessionResourceCounts;
52
+ recover(): NetRecoveryOutcome;
53
+ advanceRecovery(): void;
54
+ sendRaw(peerId: PeerId, data: Uint8Array): Result<void, EndpointError | NetError>;
55
+ /** Send one application command through the current replica attachment. */
56
+ sendToAuthority(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError>;
57
+ /** Send one application message to an authority-owned logical session. */
58
+ sendToSession(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError>;
27
59
  attachAuthority(authority: AuthorityCoordinator): void;
28
60
  requestFullBaseline(peerId: PeerId): void;
61
+ requestFullBaselineForSession(sessionId: SessionId): void;
29
62
  attachReplica(coordinator: ReplicaCoordinator, limits: ReplicationLimits): void;
30
63
  publish(): Result<void, NetError | EndpointError>;
64
+ dispose(): void;
31
65
  }
32
66
  //# sourceMappingURL=net-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"net-session.d.ts","sourceRoot":"","sources":["../../src/session/net-session.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE7F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,qBAAa,UAAU;;gBAWT,MAAM,EAAE,gBAAgB;IAKpC,aAAa,IAAI,SAAS,QAAQ,EAAE;IA4BpC,gBAAgB,IAAI,UAAU,EAAE;IAIhC,eAAe,IAAI,YAAY;IAK/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAKtE,eAAe,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAItD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzC,aAAa,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI/E,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC;CAqBlD"}
1
+ {"version":3,"file":"net-session.d.ts","sourceRoot":"","sources":["../../src/session/net-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type Result } from '@forgeax/engine-types';
2
+ import type { NetEndpointConnector } from '../endpoint/endpoint';
3
+ import type { EndpointError } from '../endpoint/errors';
4
+ import { NetError, type NetErrorCode } from '../replication/errors';
5
+ declare const sessionIdBrand: unique symbol;
6
+ /** Authority-issued application identity; it is distinct from transport PeerId. */
7
+ export type SessionId = number & {
8
+ readonly [sessionIdBrand]: true;
9
+ };
10
+ export type NetSessionStateKind = 'connecting' | 'resyncing' | 'active' | 'recovering' | 'failed' | 'retired';
11
+ export type NetSessionFailure = NetError | EndpointError;
12
+ /** Public lifecycle state owned by one logical session. */
13
+ export type NetSessionState = {
14
+ readonly kind: 'connecting';
15
+ readonly sessionId: SessionId;
16
+ } | {
17
+ readonly kind: 'resyncing';
18
+ readonly sessionId: SessionId;
19
+ readonly epoch: number;
20
+ } | {
21
+ readonly kind: 'active';
22
+ readonly sessionId: SessionId;
23
+ readonly epoch: number;
24
+ readonly sequence: number;
25
+ } | {
26
+ readonly kind: 'recovering';
27
+ readonly sessionId: SessionId;
28
+ readonly epoch: number;
29
+ readonly attempt: number;
30
+ } | {
31
+ readonly kind: 'failed';
32
+ readonly sessionId: SessionId;
33
+ readonly error: NetSessionFailure;
34
+ } | {
35
+ readonly kind: 'retired';
36
+ readonly sessionId: SessionId;
37
+ readonly reason: 'disposed' | 'terminal-failure';
38
+ };
39
+ export interface NetRecoveryPolicy {
40
+ readonly maxSessions: number;
41
+ readonly maxPendingPackets: number;
42
+ readonly ackTimeoutMs: number;
43
+ readonly maxPacketRetries: number;
44
+ readonly maxReconnectAttempts: number;
45
+ readonly reconnectDeadlineMs: number;
46
+ readonly reconnectDelaysMs: readonly number[];
47
+ }
48
+ /** Finite, deterministic recovery bounds shared by every transport adapter. */
49
+ export declare const DEFAULT_NET_RECOVERY_POLICY: NetRecoveryPolicy;
50
+ /** Validate a complete policy without mutating it. */
51
+ export declare function validateNetRecoveryPolicy(policy: NetRecoveryPolicy): Result<void, NetError>;
52
+ /** Merge caller overrides with the bounded defaults and validate the result. */
53
+ export declare function resolveNetRecoveryPolicy(overrides?: Partial<NetRecoveryPolicy>): Result<NetRecoveryPolicy, NetError>;
54
+ /** Create a positive application identity without allowing plain numbers to cross the seam. */
55
+ export declare function createSessionId(value: number): Result<SessionId, NetError>;
56
+ /** Observable bounded accounting for one logical recovery session. */
57
+ export interface NetRecoverySnapshot {
58
+ readonly sessionId: SessionId;
59
+ readonly state: NetSessionState;
60
+ readonly pendingPackets: number;
61
+ readonly maxPendingPackets: number;
62
+ readonly acknowledgedSequence: number;
63
+ readonly reconnectAttempts: number;
64
+ readonly epoch: number;
65
+ readonly sequence: number;
66
+ readonly ownedResources: {
67
+ readonly pendingConnects: number;
68
+ readonly timers: number;
69
+ readonly ledgers: number;
70
+ readonly callbacks: number;
71
+ };
72
+ readonly lastError?: NetSessionFailure;
73
+ }
74
+ /** Stable result kinds for repeated recovery requests. */
75
+ export type NetRecoveryOutcome = {
76
+ readonly kind: 'started';
77
+ readonly sessionId: SessionId;
78
+ } | {
79
+ readonly kind: 'already-recovering';
80
+ readonly sessionId: SessionId;
81
+ } | {
82
+ readonly kind: 'already-active';
83
+ readonly sessionId: SessionId;
84
+ } | {
85
+ readonly kind: 'retired';
86
+ readonly sessionId: SessionId;
87
+ };
88
+ export declare function isLegalNetSessionTransition(from: NetSessionStateKind, to: NetSessionStateKind): boolean;
89
+ /** Validate an immutable state replacement before a session publishes it. */
90
+ export declare function transitionNetSessionState(from: NetSessionState, to: NetSessionState): Result<NetSessionState, NetError>;
91
+ export type { NetEndpointConnector };
92
+ export declare const RECOVERY_ERROR_CODES: readonly NetErrorCode[];
93
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/session/recovery.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,13 @@
1
1
  import type { Plugin } from '@forgeax/engine-plugin';
2
- import type { NetEndpoint } from '../endpoint/endpoint';
2
+ import type { NetEndpoint, NetEndpointConnector } from '../endpoint/endpoint';
3
+ import { type NetSessionClock } from './net-session';
4
+ import type { NetRecoveryPolicy } from './recovery';
3
5
  export interface NetPluginConfig {
4
- readonly endpoint: NetEndpoint;
6
+ readonly endpoint?: NetEndpoint;
7
+ readonly connector?: NetEndpointConnector;
8
+ readonly sessionId?: number;
9
+ readonly recovery?: Partial<NetRecoveryPolicy>;
10
+ readonly clock?: NetSessionClock;
5
11
  readonly maxRawMessages?: number;
6
12
  }
7
13
  export declare function netPlugin(config: NetPluginConfig): Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"session-plugin.d.ts","sourceRoot":"","sources":["../../src/session/session-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAsCzD"}
1
+ {"version":3,"file":"session-plugin.d.ts","sourceRoot":"","sources":["../../src/session/session-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiDzD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-net",
3
- "version": "0.1.3",
3
+ "version": "0.1.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -22,9 +22,9 @@
22
22
  "LICENSE"
23
23
  ],
24
24
  "dependencies": {
25
- "@forgeax/engine-ecs": "0.1.3",
26
- "@forgeax/engine-plugin": "0.1.3",
27
- "@forgeax/engine-types": "0.1.3"
25
+ "@forgeax/engine-ecs": "0.1.6",
26
+ "@forgeax/engine-plugin": "0.1.6",
27
+ "@forgeax/engine-types": "0.1.6"
28
28
  },
29
29
  "forgeax": {
30
30
  "metrics": {
@@ -48,3 +48,11 @@ export interface NetEndpoint {
48
48
  /** Close the endpoint. No further send/poll should succeed after close. */
49
49
  close(): Result<void, EndpointError>;
50
50
  }
51
+
52
+ /**
53
+ * Realm-neutral capability for creating a replacement endpoint.
54
+ * Session policy, retry bounds, and replication semantics remain in net.
55
+ */
56
+ export interface NetEndpointConnector {
57
+ connect(signal: AbortSignal): Promise<Result<NetEndpoint, EndpointError>>;
58
+ }
@@ -4,7 +4,7 @@
4
4
 
5
5
  import type { Result } from '@forgeax/engine-types';
6
6
  import { err, ok } from '@forgeax/engine-types';
7
- import type { EndpointEvent, NetEndpoint, PeerId } from './endpoint';
7
+ import type { EndpointEvent, NetEndpoint, NetEndpointConnector, PeerId } from './endpoint';
8
8
  import type { EndpointError as EndpointErrorType } from './errors';
9
9
  import { ENDPOINT_ERROR_HINTS, ENDPOINT_EXPECTED, EndpointError } from './errors';
10
10
 
@@ -170,3 +170,25 @@ export function createMemoryEndpointPairWithController(): {
170
170
 
171
171
  return { endpoints: [epA, epB], controller };
172
172
  }
173
+
174
+ /** Create a replaceable, realm-neutral connector over a deterministic endpoint factory. */
175
+ export function createMemoryEndpointConnector(
176
+ createEndpoint: () => NetEndpoint,
177
+ ): NetEndpointConnector {
178
+ return {
179
+ connect(signal) {
180
+ if (signal.aborted)
181
+ return Promise.resolve(
182
+ err(
183
+ new EndpointError({
184
+ code: 'connection-failed',
185
+ expected: ENDPOINT_EXPECTED['connection-failed'],
186
+ hint: ENDPOINT_ERROR_HINTS['connection-failed'],
187
+ detail: { address: 'memory', cause: 'connect aborted' },
188
+ }),
189
+ ),
190
+ );
191
+ return Promise.resolve(ok(createEndpoint()));
192
+ },
193
+ };
194
+ }
package/src/index.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  // and @forgeax/engine-types (Result, errors). No WebSocket, browser, app, or runtime dependency.
5
5
 
6
6
  // Endpoint contract (requirements AC-02, AC-13)
7
- export type { EndpointEvent, NetEndpoint, PeerId } from './endpoint/endpoint';
7
+ export type { EndpointEvent, NetEndpoint, NetEndpointConnector, PeerId } from './endpoint/endpoint';
8
8
  export type { EndpointErrorCode, EndpointErrorDetail } from './endpoint/errors';
9
9
  export {
10
10
  ENDPOINT_ERROR_HINTS,
@@ -15,32 +15,76 @@ export {
15
15
  export type { MemoryFaultController } from './endpoint/memory';
16
16
  // Memory endpoint (requirements AC-03)
17
17
  export {
18
+ createMemoryEndpointConnector,
18
19
  createMemoryEndpointPair,
19
20
  createMemoryEndpointPairWithController,
20
21
  } from './endpoint/memory';
21
22
  export { AuthorityCoordinator, createAuthorityCoordinator } from './replication/authority';
22
- export type {
23
- NetEntityId,
24
- ReplicationBatch,
25
- ReplicationComponentRecord,
26
- ReplicationEntityRecord,
27
- } from './replication/codec';
28
- export { NetError, type NetErrorCode, type NetErrorDetail } from './replication/errors';
23
+ export { decodeReplicationPacket, encodeReplicationPacket } from './replication/codec';
24
+ export {
25
+ REPLICATION_PROTOCOL_PREFIX,
26
+ REPLICATION_PROTOCOL_VERSION,
27
+ } from './replication/constants';
28
+ export {
29
+ NetError,
30
+ type NetErrorCode,
31
+ type NetErrorDetail,
32
+ type NetErrorDetailByCode,
33
+ type NetErrorDetailFor,
34
+ } from './replication/errors';
29
35
  export { validateHandshake } from './replication/handshake';
30
36
  export type {
31
37
  DefineReplicationOptions,
32
38
  ReplicationLimits,
33
39
  ReplicationProfile,
34
40
  } from './replication/profile';
35
- export { defineReplication } from './replication/profile';
41
+ export { DEFAULT_REPLICATION_LIMITS, defineReplication } from './replication/profile';
42
+ export type {
43
+ ReplicationAckPacket,
44
+ ReplicationBaselinePacket,
45
+ ReplicationComponentRecord,
46
+ ReplicationDataPacket,
47
+ ReplicationDataPacketBase,
48
+ ReplicationDataPacketKind,
49
+ ReplicationDeltaPacket,
50
+ ReplicationEntityKind,
51
+ ReplicationEntityRecord,
52
+ ReplicationPacket,
53
+ ReplicationPacketKind,
54
+ ReplicationRejectionPacket,
55
+ ReplicationSessionPacket,
56
+ } from './replication/protocol';
36
57
  export {
37
- applyReplicaBatch,
58
+ applyReplicationPacket,
38
59
  createReplicaCoordinator,
39
- decodeAndApplyReplicaBatch,
60
+ decodeAndApplyReplicationPacket,
40
61
  ReplicaCoordinator,
41
62
  } from './replication/replica';
42
- export type { NetSessionConfig, PeerSnapshot, RawMessage } from './session/net-session';
63
+ export type {
64
+ NetSessionConfig,
65
+ PeerSnapshot,
66
+ RawMessage,
67
+ SessionSnapshot,
68
+ } from './session/net-session';
43
69
  // Session (requirements AC-04)
44
70
  export { NetSession } from './session/net-session';
71
+ export type {
72
+ NetRecoveryOutcome,
73
+ NetRecoveryPolicy,
74
+ NetRecoverySnapshot,
75
+ NetSessionFailure,
76
+ NetSessionState,
77
+ NetSessionStateKind,
78
+ SessionId,
79
+ } from './session/recovery';
80
+ export {
81
+ createSessionId,
82
+ DEFAULT_NET_RECOVERY_POLICY,
83
+ isLegalNetSessionTransition,
84
+ RECOVERY_ERROR_CODES,
85
+ resolveNetRecoveryPolicy,
86
+ transitionNetSessionState,
87
+ validateNetRecoveryPolicy,
88
+ } from './session/recovery';
45
89
  export type { NetPluginConfig } from './session/session-plugin';
46
90
  export { netPlugin } from './session/session-plugin';