@vworlds/vecs-server 1.0.16
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/node_modules/@vworlds/vecs-protocol/package.json +14 -0
- package/node_modules/@vworlds/vecs-protocol/src/cid.d.ts +14 -0
- package/node_modules/@vworlds/vecs-protocol/src/cid.js +58 -0
- package/node_modules/@vworlds/vecs-protocol/src/cid.js.map +1 -0
- package/node_modules/@vworlds/vecs-protocol/src/index.d.ts +5 -0
- package/node_modules/@vworlds/vecs-protocol/src/index.js +5 -0
- package/node_modules/@vworlds/vecs-protocol/src/index.js.map +1 -0
- package/node_modules/@vworlds/vecs-protocol/src/messages.d.ts +42 -0
- package/node_modules/@vworlds/vecs-protocol/src/messages.js +149 -0
- package/node_modules/@vworlds/vecs-protocol/src/messages.js.map +1 -0
- package/node_modules/@vworlds/vecs-protocol/src/network_world.d.ts +18 -0
- package/node_modules/@vworlds/vecs-protocol/src/network_world.js +93 -0
- package/node_modules/@vworlds/vecs-protocol/src/network_world.js.map +1 -0
- package/node_modules/@vworlds/vecs-protocol/src/rpc.d.ts +36 -0
- package/node_modules/@vworlds/vecs-protocol/src/rpc.js +140 -0
- package/node_modules/@vworlds/vecs-protocol/src/rpc.js.map +1 -0
- package/node_modules/@vworlds/vecs-protocol/src/transport.d.ts +21 -0
- package/node_modules/@vworlds/vecs-protocol/src/transport.js +2 -0
- package/node_modules/@vworlds/vecs-protocol/src/transport.js.map +1 -0
- package/node_modules/@vworlds/vecs-wire/package.json +14 -0
- package/node_modules/@vworlds/vecs-wire/src/any.d.ts +27 -0
- package/node_modules/@vworlds/vecs-wire/src/any.js +43 -0
- package/node_modules/@vworlds/vecs-wire/src/any.js.map +1 -0
- package/node_modules/@vworlds/vecs-wire/src/decoder.d.ts +31 -0
- package/node_modules/@vworlds/vecs-wire/src/decoder.js +180 -0
- package/node_modules/@vworlds/vecs-wire/src/decoder.js.map +1 -0
- package/node_modules/@vworlds/vecs-wire/src/decorators.d.ts +4 -0
- package/node_modules/@vworlds/vecs-wire/src/decorators.js +139 -0
- package/node_modules/@vworlds/vecs-wire/src/decorators.js.map +1 -0
- package/node_modules/@vworlds/vecs-wire/src/encoder.d.ts +32 -0
- package/node_modules/@vworlds/vecs-wire/src/encoder.js +230 -0
- package/node_modules/@vworlds/vecs-wire/src/encoder.js.map +1 -0
- package/node_modules/@vworlds/vecs-wire/src/index.d.ts +5 -0
- package/node_modules/@vworlds/vecs-wire/src/index.js +5 -0
- package/node_modules/@vworlds/vecs-wire/src/index.js.map +1 -0
- package/package.json +28 -0
- package/vecs-protocol/src/cid.d.ts +14 -0
- package/vecs-protocol/src/cid.js +58 -0
- package/vecs-protocol/src/cid.js.map +1 -0
- package/vecs-protocol/src/index.d.ts +5 -0
- package/vecs-protocol/src/index.js +5 -0
- package/vecs-protocol/src/index.js.map +1 -0
- package/vecs-protocol/src/messages.d.ts +42 -0
- package/vecs-protocol/src/messages.js +149 -0
- package/vecs-protocol/src/messages.js.map +1 -0
- package/vecs-protocol/src/network_world.d.ts +18 -0
- package/vecs-protocol/src/network_world.js +93 -0
- package/vecs-protocol/src/network_world.js.map +1 -0
- package/vecs-protocol/src/rpc.d.ts +36 -0
- package/vecs-protocol/src/rpc.js +140 -0
- package/vecs-protocol/src/rpc.js.map +1 -0
- package/vecs-protocol/src/transport.d.ts +21 -0
- package/vecs-protocol/src/transport.js +2 -0
- package/vecs-protocol/src/transport.js.map +1 -0
- package/vecs-server/src/history.d.ts +14 -0
- package/vecs-server/src/history.js +104 -0
- package/vecs-server/src/history.js.map +1 -0
- package/vecs-server/src/index.d.ts +9 -0
- package/vecs-server/src/index.js +6 -0
- package/vecs-server/src/index.js.map +1 -0
- package/vecs-server/src/networked.d.ts +8 -0
- package/vecs-server/src/networked.js +13 -0
- package/vecs-server/src/networked.js.map +1 -0
- package/vecs-server/src/server_world.d.ts +34 -0
- package/vecs-server/src/server_world.js +215 -0
- package/vecs-server/src/server_world.js.map +1 -0
- package/vecs-server/src/vecs_listener.d.ts +11 -0
- package/vecs-server/src/vecs_listener.js +23 -0
- package/vecs-server/src/vecs_listener.js.map +1 -0
- package/vecs-server/src/view.d.ts +45 -0
- package/vecs-server/src/view.js +207 -0
- package/vecs-server/src/view.js.map +1 -0
- package/vecs-server/src/world_path.d.ts +1 -0
- package/vecs-server/src/world_path.js +4 -0
- package/vecs-server/src/world_path.js.map +1 -0
- package/vecs-wire/src/any.d.ts +27 -0
- package/vecs-wire/src/any.js +43 -0
- package/vecs-wire/src/any.js.map +1 -0
- package/vecs-wire/src/decoder.d.ts +31 -0
- package/vecs-wire/src/decoder.js +180 -0
- package/vecs-wire/src/decoder.js.map +1 -0
- package/vecs-wire/src/decorators.d.ts +4 -0
- package/vecs-wire/src/decorators.js +139 -0
- package/vecs-wire/src/decorators.js.map +1 -0
- package/vecs-wire/src/encoder.d.ts +32 -0
- package/vecs-wire/src/encoder.js +230 -0
- package/vecs-wire/src/encoder.js.map +1 -0
- package/vecs-wire/src/index.d.ts +5 -0
- package/vecs-wire/src/index.js +5 -0
- package/vecs-wire/src/index.js.map +1 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { World } from "@vworlds/vecs";
|
|
2
|
+
import { cid_pack, setLocalComponentMin } from "./cid.js";
|
|
3
|
+
const DEFAULT_ENTITY_ID_START = 1000;
|
|
4
|
+
const MODULE_ID_RANGE_SIZE = 100;
|
|
5
|
+
let configuredLocalComponentMin;
|
|
6
|
+
export class NetworkWorld extends World {
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
const networkComponents = options.networkComponents ?? [];
|
|
9
|
+
const localComponentMin = getLocalComponentMinFor(networkComponents.length);
|
|
10
|
+
configureLocalComponentMin(localComponentMin);
|
|
11
|
+
super({
|
|
12
|
+
idPools: buildNetworkIdPools(localComponentMin, options),
|
|
13
|
+
});
|
|
14
|
+
this._networkComponentsByType = new Map();
|
|
15
|
+
this.localComponentMin = localComponentMin;
|
|
16
|
+
this.networkComponents = networkComponents.map((Class, index) => {
|
|
17
|
+
const type = index + 1;
|
|
18
|
+
cid_pack(0, type);
|
|
19
|
+
this.component(Class, type);
|
|
20
|
+
const registered = { Class, type };
|
|
21
|
+
this._networkComponentsByType.set(type, registered);
|
|
22
|
+
return registered;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
getNetworkComponent(type) {
|
|
26
|
+
return this._networkComponentsByType.get(type);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function configureLocalComponentMin(localComponentMin) {
|
|
30
|
+
if (configuredLocalComponentMin === undefined) {
|
|
31
|
+
configuredLocalComponentMin = localComponentMin;
|
|
32
|
+
setLocalComponentMin(localComponentMin);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (configuredLocalComponentMin !== localComponentMin) {
|
|
36
|
+
throw new Error(`NetworkWorld localComponentMin ${localComponentMin} does not match existing value ${configuredLocalComponentMin}`);
|
|
37
|
+
}
|
|
38
|
+
setLocalComponentMin(localComponentMin);
|
|
39
|
+
}
|
|
40
|
+
function buildNetworkIdPools(localComponentMin, options) {
|
|
41
|
+
const entityIdStart = options.entityIdStart ?? DEFAULT_ENTITY_ID_START;
|
|
42
|
+
validateEntityStart("entityIdStart", entityIdStart);
|
|
43
|
+
if (entityIdStart <= localComponentMin) {
|
|
44
|
+
throw new Error("entityIdStart must leave room for local component ids");
|
|
45
|
+
}
|
|
46
|
+
const moduleIdStart = entityIdStart - MODULE_ID_RANGE_SIZE;
|
|
47
|
+
if (moduleIdStart <= localComponentMin) {
|
|
48
|
+
throw new Error("entityIdStart must leave room for local component and module ids");
|
|
49
|
+
}
|
|
50
|
+
const pools = [
|
|
51
|
+
{ name: "network", min: 1, max: localComponentMin - 1 },
|
|
52
|
+
{ name: "component", min: localComponentMin, max: moduleIdStart - 1 },
|
|
53
|
+
{ name: "module", min: moduleIdStart, max: entityIdStart - 1 },
|
|
54
|
+
];
|
|
55
|
+
if (options.localEntityIdStart === undefined) {
|
|
56
|
+
pools.push({ name: "entity", min: entityIdStart });
|
|
57
|
+
return pools;
|
|
58
|
+
}
|
|
59
|
+
const localEntityIdStart = options.localEntityIdStart;
|
|
60
|
+
validateEntityStart("localEntityIdStart", localEntityIdStart);
|
|
61
|
+
if (localEntityIdStart <= entityIdStart) {
|
|
62
|
+
throw new Error("localEntityIdStart must be greater than entityIdStart");
|
|
63
|
+
}
|
|
64
|
+
const networkEntityPool = {
|
|
65
|
+
name: "network_entity",
|
|
66
|
+
min: entityIdStart,
|
|
67
|
+
max: localEntityIdStart - 1,
|
|
68
|
+
};
|
|
69
|
+
if (options.networkEntityReuseWaitFrames !== undefined) {
|
|
70
|
+
networkEntityPool.reuseWaitFrames = options.networkEntityReuseWaitFrames;
|
|
71
|
+
}
|
|
72
|
+
pools.push(networkEntityPool, { name: "entity", min: localEntityIdStart });
|
|
73
|
+
return pools;
|
|
74
|
+
}
|
|
75
|
+
function getLocalComponentMinFor(networkComponentCount) {
|
|
76
|
+
return nextPowerOfTwo(Math.max(2, networkComponentCount + 1));
|
|
77
|
+
}
|
|
78
|
+
function nextPowerOfTwo(value) {
|
|
79
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
80
|
+
throw new Error("Network component count must be a positive safe integer");
|
|
81
|
+
}
|
|
82
|
+
let power = 1;
|
|
83
|
+
while (power < value) {
|
|
84
|
+
power *= 2;
|
|
85
|
+
}
|
|
86
|
+
return power;
|
|
87
|
+
}
|
|
88
|
+
function validateEntityStart(name, value) {
|
|
89
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
90
|
+
throw new Error(`${name} must be a positive safe integer`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=network_world.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network_world.js","sourceRoot":"","sources":["../../../../vecs-protocol/src/network_world.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Decoder, Encoder, type IEncodable } from "@vworlds/vecs-wire";
|
|
2
|
+
export declare const RPC_RESPONSE_ID = 0;
|
|
3
|
+
export declare const FIRST_USER_RPC_ID = 101;
|
|
4
|
+
export declare class RPC implements IEncodable {
|
|
5
|
+
rpcId: number;
|
|
6
|
+
callId: number;
|
|
7
|
+
params: unknown[];
|
|
8
|
+
error: number;
|
|
9
|
+
message: string;
|
|
10
|
+
constructor(values?: Partial<RPC>);
|
|
11
|
+
wireEncode(encoder: Encoder): void;
|
|
12
|
+
static wireDecode(decoder: Decoder): RPC;
|
|
13
|
+
}
|
|
14
|
+
export type RPCHandler = (params: unknown[], request: RPC) => Promise<unknown[] | unknown> | unknown[] | unknown;
|
|
15
|
+
export declare const RPC_TIMEOUT_ERROR: {
|
|
16
|
+
error: number;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
export declare class SessionRPC {
|
|
20
|
+
private readonly _defaultTTL;
|
|
21
|
+
private _nextCallId;
|
|
22
|
+
private readonly _pending;
|
|
23
|
+
private readonly _outbox;
|
|
24
|
+
private readonly _cachedReplies;
|
|
25
|
+
private readonly _handlers;
|
|
26
|
+
constructor(_defaultTTL?: number);
|
|
27
|
+
listen(rpcId: number, handler: RPCHandler): void;
|
|
28
|
+
invoke(rpcId: number, params?: unknown[], ttl?: number): Promise<RPC>;
|
|
29
|
+
process(messages: RPC[]): void;
|
|
30
|
+
private _processResponse;
|
|
31
|
+
private _processRequest;
|
|
32
|
+
private _queueResponse;
|
|
33
|
+
timeoutTick(elapsed: number): void;
|
|
34
|
+
get pendingTotal(): number;
|
|
35
|
+
getOutgoing(): RPC[];
|
|
36
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export const RPC_RESPONSE_ID = 0;
|
|
2
|
+
export const FIRST_USER_RPC_ID = 101;
|
|
3
|
+
export class RPC {
|
|
4
|
+
constructor(values) {
|
|
5
|
+
this.rpcId = 0;
|
|
6
|
+
this.callId = 0;
|
|
7
|
+
this.params = [];
|
|
8
|
+
this.error = 0;
|
|
9
|
+
this.message = "";
|
|
10
|
+
if (values) {
|
|
11
|
+
Object.assign(this, values);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
wireEncode(encoder) {
|
|
15
|
+
encoder.write_u32(this.rpcId);
|
|
16
|
+
encoder.write_u32(this.callId);
|
|
17
|
+
encoder.write_u32(this.error);
|
|
18
|
+
encoder.write_string(this.message);
|
|
19
|
+
encoder.write_u32(this.params.length);
|
|
20
|
+
this.params.forEach((param) => encoder.write_any(param));
|
|
21
|
+
}
|
|
22
|
+
static wireDecode(decoder) {
|
|
23
|
+
const rpc = new RPC({
|
|
24
|
+
rpcId: decoder.read_u32(),
|
|
25
|
+
callId: decoder.read_u32(),
|
|
26
|
+
error: decoder.read_u32(),
|
|
27
|
+
message: decoder.read_string(),
|
|
28
|
+
});
|
|
29
|
+
const count = decoder.read_u32();
|
|
30
|
+
for (let i = 0; i < count; i++) {
|
|
31
|
+
rpc.params.push(decoder.read_any());
|
|
32
|
+
}
|
|
33
|
+
return rpc;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export const RPC_TIMEOUT_ERROR = { error: -1, message: "Timeout" };
|
|
37
|
+
export class SessionRPC {
|
|
38
|
+
constructor(_defaultTTL = 5000) {
|
|
39
|
+
this._defaultTTL = _defaultTTL;
|
|
40
|
+
this._nextCallId = 0;
|
|
41
|
+
this._pending = new Map();
|
|
42
|
+
this._outbox = new Map();
|
|
43
|
+
this._cachedReplies = new Map();
|
|
44
|
+
this._handlers = new Map();
|
|
45
|
+
}
|
|
46
|
+
listen(rpcId, handler) {
|
|
47
|
+
if (rpcId <= RPC_RESPONSE_ID) {
|
|
48
|
+
throw new Error("RPC handler ids must be positive request ids");
|
|
49
|
+
}
|
|
50
|
+
this._handlers.set(rpcId, handler);
|
|
51
|
+
}
|
|
52
|
+
invoke(rpcId, params = [], ttl = this._defaultTTL) {
|
|
53
|
+
if (rpcId < FIRST_USER_RPC_ID) {
|
|
54
|
+
throw new Error(`RPC ids 0-${FIRST_USER_RPC_ID - 1} are reserved`);
|
|
55
|
+
}
|
|
56
|
+
const callId = this._nextCallId++;
|
|
57
|
+
const request = new RPC({ rpcId, callId, params });
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
this._pending.set(callId, { request, resolve, reject, ttl });
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
process(messages) {
|
|
63
|
+
messages.forEach((message) => {
|
|
64
|
+
if (message.rpcId === RPC_RESPONSE_ID) {
|
|
65
|
+
this._processResponse(message);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
void this._processRequest(message);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
_processResponse(message) {
|
|
73
|
+
const pending = this._pending.get(message.callId);
|
|
74
|
+
if (!pending) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this._pending.delete(message.callId);
|
|
78
|
+
if (message.error) {
|
|
79
|
+
pending.reject({ error: message.error, message: message.message });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
pending.resolve(message);
|
|
83
|
+
}
|
|
84
|
+
async _processRequest(message) {
|
|
85
|
+
const cached = this._cachedReplies.get(message.callId);
|
|
86
|
+
if (cached) {
|
|
87
|
+
this._outbox.set(message.callId, cached.response);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const response = new RPC({ rpcId: RPC_RESPONSE_ID, callId: message.callId });
|
|
91
|
+
const handler = this._handlers.get(message.rpcId);
|
|
92
|
+
if (!handler) {
|
|
93
|
+
response.error = 1;
|
|
94
|
+
response.message = `Unknown RPC id ${message.rpcId}`;
|
|
95
|
+
this._queueResponse(response);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const result = await handler(message.params, message);
|
|
100
|
+
response.params = Array.isArray(result) ? result : result === undefined ? [] : [result];
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
response.error =
|
|
104
|
+
typeof err?.error === "number"
|
|
105
|
+
? err.error
|
|
106
|
+
: 1;
|
|
107
|
+
response.message = err instanceof Error ? err.message : String(err);
|
|
108
|
+
}
|
|
109
|
+
this._queueResponse(response);
|
|
110
|
+
}
|
|
111
|
+
_queueResponse(response) {
|
|
112
|
+
this._cachedReplies.set(response.callId, { response, ttl: this._defaultTTL });
|
|
113
|
+
this._outbox.set(response.callId, response);
|
|
114
|
+
}
|
|
115
|
+
timeoutTick(elapsed) {
|
|
116
|
+
this._pending.forEach((pending, callId) => {
|
|
117
|
+
pending.ttl -= elapsed;
|
|
118
|
+
if (pending.ttl <= 0) {
|
|
119
|
+
this._pending.delete(callId);
|
|
120
|
+
pending.reject(RPC_TIMEOUT_ERROR);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
this._cachedReplies.forEach((reply, callId) => {
|
|
124
|
+
reply.ttl -= elapsed;
|
|
125
|
+
if (reply.ttl <= 0) {
|
|
126
|
+
this._cachedReplies.delete(callId);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
get pendingTotal() {
|
|
131
|
+
return this._pending.size + this._outbox.size;
|
|
132
|
+
}
|
|
133
|
+
getOutgoing() {
|
|
134
|
+
const outgoing = [...this._pending.values()].map((pending) => pending.request);
|
|
135
|
+
outgoing.push(...this._outbox.values());
|
|
136
|
+
this._outbox.clear();
|
|
137
|
+
return outgoing;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../vecs-protocol/src/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ConnectionError extends Error {
|
|
2
|
+
status: number;
|
|
3
|
+
statusText: string;
|
|
4
|
+
}
|
|
5
|
+
export interface VecsSocketEvents {
|
|
6
|
+
receive: (data: Uint8Array) => void;
|
|
7
|
+
disconnect: () => void;
|
|
8
|
+
connect: (err?: ConnectionError) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface VecsSocket {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
on<K extends keyof VecsSocketEvents>(event: K, handler: VecsSocketEvents[K]): unknown;
|
|
13
|
+
send(data: Uint8Array): void;
|
|
14
|
+
close(): void;
|
|
15
|
+
}
|
|
16
|
+
export interface VecsSocketListenerEvents {
|
|
17
|
+
new: (socket: VecsSocket) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface VecsSocketListener {
|
|
20
|
+
on<K extends keyof VecsSocketListenerEvents>(event: K, handler: VecsSocketListenerEvents[K]): unknown;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../vecs-protocol/src/transport.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { StateDiff } from "@vworlds/vecs-protocol";
|
|
2
|
+
export declare const HISTORY_LENGTH = 5;
|
|
3
|
+
export declare class History {
|
|
4
|
+
private readonly _length;
|
|
5
|
+
private readonly _buffer;
|
|
6
|
+
private _lastFrame;
|
|
7
|
+
constructor(_length?: number, lastFrame?: number);
|
|
8
|
+
get lastFrame(): number;
|
|
9
|
+
get oldestFrame(): number;
|
|
10
|
+
push(diff: StateDiff): void;
|
|
11
|
+
get(frame: number): StateDiff;
|
|
12
|
+
pull(from: number, to: number): StateDiff;
|
|
13
|
+
private _index;
|
|
14
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ArrayMap } from "@vworlds/vecs";
|
|
2
|
+
import { ALL_COMPONENTS, StateDiff, } from "@vworlds/vecs-protocol";
|
|
3
|
+
export const HISTORY_LENGTH = 5;
|
|
4
|
+
const REMOVED = 0;
|
|
5
|
+
export class History {
|
|
6
|
+
constructor(_length = HISTORY_LENGTH, lastFrame = -1) {
|
|
7
|
+
this._length = _length;
|
|
8
|
+
this._lastFrame = lastFrame;
|
|
9
|
+
this._buffer = new Array(_length);
|
|
10
|
+
for (let i = 0; i < _length; i++) {
|
|
11
|
+
const toFrame = lastFrame - i;
|
|
12
|
+
this._buffer[this._index(toFrame)] = emptyDiff(toFrame);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
get lastFrame() {
|
|
16
|
+
return this._lastFrame;
|
|
17
|
+
}
|
|
18
|
+
get oldestFrame() {
|
|
19
|
+
return this._lastFrame - this._length + 1;
|
|
20
|
+
}
|
|
21
|
+
push(diff) {
|
|
22
|
+
if (diff.toFrame !== this._lastFrame + 1) {
|
|
23
|
+
throw new Error(`Expected frame ${this._lastFrame + 1}, got ${diff.toFrame}`);
|
|
24
|
+
}
|
|
25
|
+
this._lastFrame = diff.toFrame;
|
|
26
|
+
this._buffer[this._index(diff.toFrame)] = diff;
|
|
27
|
+
}
|
|
28
|
+
get(frame) {
|
|
29
|
+
if (frame < this.oldestFrame || frame > this._lastFrame) {
|
|
30
|
+
throw new Error(`Frame ${frame} is outside history window`);
|
|
31
|
+
}
|
|
32
|
+
return this._buffer[this._index(frame)];
|
|
33
|
+
}
|
|
34
|
+
pull(from, to) {
|
|
35
|
+
if (to < from) {
|
|
36
|
+
throw new Error(`Invalid history range ${from}..${to}`);
|
|
37
|
+
}
|
|
38
|
+
if (to === from) {
|
|
39
|
+
return new StateDiff({ fromFrame: from, toFrame: to });
|
|
40
|
+
}
|
|
41
|
+
if (to === from + 1) {
|
|
42
|
+
return this.get(to);
|
|
43
|
+
}
|
|
44
|
+
const entities = new Map();
|
|
45
|
+
for (let frame = from + 1; frame <= to; frame++) {
|
|
46
|
+
applyDiff(entities, this.get(frame));
|
|
47
|
+
}
|
|
48
|
+
return forgeDiff(from, to, entities);
|
|
49
|
+
}
|
|
50
|
+
_index(frame) {
|
|
51
|
+
return ((frame % this._length) + this._length) % this._length;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function applyDiff(entities, diff) {
|
|
55
|
+
diff.snapshots.forEach((snapshot) => {
|
|
56
|
+
let entity = entities.get(snapshot.eid);
|
|
57
|
+
if (entity === undefined || entity === REMOVED) {
|
|
58
|
+
entity = new ArrayMap();
|
|
59
|
+
entities.set(snapshot.eid, entity);
|
|
60
|
+
}
|
|
61
|
+
entity.set(snapshot.type, snapshot);
|
|
62
|
+
});
|
|
63
|
+
diff.removed.forEach(([eid, type]) => {
|
|
64
|
+
if (type === ALL_COMPONENTS) {
|
|
65
|
+
entities.set(eid, REMOVED);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const entity = entities.get(eid);
|
|
69
|
+
if (entity === REMOVED) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const components = entity ?? new ArrayMap();
|
|
73
|
+
components.set(type, REMOVED);
|
|
74
|
+
entities.set(eid, components);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function forgeDiff(from, to, entities) {
|
|
78
|
+
const snapshots = [];
|
|
79
|
+
const removed = [];
|
|
80
|
+
entities.forEach((entity, eid) => {
|
|
81
|
+
if (entity === REMOVED) {
|
|
82
|
+
removed.push([eid, ALL_COMPONENTS]);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
entity.forEach((slot, type) => {
|
|
86
|
+
if (slot === REMOVED) {
|
|
87
|
+
removed.push([eid, type]);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
snapshots.push(slot);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
return new StateDiff({ fromFrame: from, toFrame: to, snapshots, removed });
|
|
95
|
+
}
|
|
96
|
+
function emptyDiff(toFrame) {
|
|
97
|
+
return new StateDiff({
|
|
98
|
+
fromFrame: toFrame - 1,
|
|
99
|
+
toFrame,
|
|
100
|
+
snapshots: [],
|
|
101
|
+
removed: [],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { NetworkClient, NetworkInput, Networked } from "./networked.js";
|
|
2
|
+
export { VecsListener } from "./vecs_listener.js";
|
|
3
|
+
export type { VecsListenerOptions } from "./vecs_listener.js";
|
|
4
|
+
export { ServerWorld } from "./server_world.js";
|
|
5
|
+
export type { ServerWorldOptions } from "./server_world.js";
|
|
6
|
+
export type { InstallSystemsOptions } from "./server_world.js";
|
|
7
|
+
export { EntityTracker, TrackerCache, View } from "./view.js";
|
|
8
|
+
export type { IEntityTracker, IEntityTrackerListener } from "./view.js";
|
|
9
|
+
export { worldPath } from "./world_path.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { NetworkClient, NetworkInput, Networked } from "./networked.js";
|
|
2
|
+
export { VecsListener } from "./vecs_listener.js";
|
|
3
|
+
export { ServerWorld } from "./server_world.js";
|
|
4
|
+
export { EntityTracker, TrackerCache, View } from "./view.js";
|
|
5
|
+
export { worldPath } from "./world_path.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networked.js","sourceRoot":"","sources":["../../../src/networked.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;CAAG;AAEzB,MAAM,OAAO,aAAa;IAA1B;QACS,OAAE,GAAG,EAAE,CAAC;IACjB,CAAC;CAAA;AAED,MAAM,OAAO,YAAY;IAAzB;QACS,UAAK,GAAY,SAAS,CAAC;IACpC,CAAC;CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NetworkWorld, type NetworkWorldOptions, type RPCHandler } from "@vworlds/vecs-protocol";
|
|
2
|
+
import { type IPhase } from "@vworlds/vecs";
|
|
3
|
+
export interface ServerWorldOptions extends NetworkWorldOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
encodeBufferSize?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface InstallSystemsOptions {
|
|
8
|
+
collectPhase: string | IPhase;
|
|
9
|
+
sendPhase: string | IPhase;
|
|
10
|
+
}
|
|
11
|
+
export declare class ServerWorld extends NetworkWorld {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
private readonly _components;
|
|
14
|
+
private readonly _sessions;
|
|
15
|
+
private readonly _rpcHandlers;
|
|
16
|
+
private readonly _updates;
|
|
17
|
+
private readonly _snapshotCache;
|
|
18
|
+
private readonly _trackerCache;
|
|
19
|
+
private readonly _encodeBuffer;
|
|
20
|
+
private _clients;
|
|
21
|
+
private _frame;
|
|
22
|
+
private _systemsInstalled;
|
|
23
|
+
constructor(options?: ServerWorldOptions);
|
|
24
|
+
handleRpc(rpcId: number, handler: RPCHandler): void;
|
|
25
|
+
installSystems(options: InstallSystemsOptions): void;
|
|
26
|
+
send(): void;
|
|
27
|
+
private _onNewConnection;
|
|
28
|
+
private _onDisconnect;
|
|
29
|
+
private _receive;
|
|
30
|
+
private _record;
|
|
31
|
+
private _pushEntitySnapshots;
|
|
32
|
+
private _encodeSnapshot;
|
|
33
|
+
private _encode;
|
|
34
|
+
}
|