@aawwaaa/astralcore-syncer 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-websocket.js","sourceRoot":"","sources":["../../../src/impl/server/remote-websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { generateUUID } from "../../util.js";
2
+ import { ResourceManager, ResourceDefiner } from "../../object.js";
3
+ import { access, mkdir, readdir, readFile, rename, unlink, writeFile } from "fs/promises";
4
+ import { dirname, join } from "path";
5
+ export class ServerJSONFileResourceManager extends ResourceManager {
6
+ dataDir;
7
+ constructor(dataDir) {
8
+ super();
9
+ this.dataDir = dataDir;
10
+ (async () => {
11
+ try {
12
+ for (const f of await readdir(join(dataDir, ".temp"))) {
13
+ await unlink(join(dataDir, ".tmp", f));
14
+ }
15
+ }
16
+ catch (e) { }
17
+ mkdir(join(dataDir, ".temp"), {
18
+ recursive: true
19
+ });
20
+ })();
21
+ }
22
+ async loadResource(id) {
23
+ const [definer, realId] = ResourceDefiner.fromId(id);
24
+ const path = definer.loadPath(realId);
25
+ const full = join(this.dataDir, path);
26
+ try {
27
+ await access(full);
28
+ }
29
+ catch (e) {
30
+ return null;
31
+ }
32
+ try {
33
+ const data = (await readFile(full)).toString();
34
+ const content = await (definer.customLoader ?? JSON.parse)(data);
35
+ const res = definer.init(realId);
36
+ void (async () => {
37
+ await res.resLoad(content);
38
+ res.ready();
39
+ })();
40
+ return res;
41
+ }
42
+ catch (e) {
43
+ console.error("Failed to load " + full);
44
+ // return null
45
+ throw e;
46
+ }
47
+ }
48
+ unloadResource(res) {
49
+ void this.saveResource(res);
50
+ res.resDrop();
51
+ }
52
+ async saveResource(res) {
53
+ try {
54
+ const path = join(this.dataDir, res.definer().savePath(res));
55
+ const data = res.resSave(false);
56
+ await mkdir(dirname(path), {
57
+ recursive: true
58
+ });
59
+ const temp = this.mktemp();
60
+ await writeFile(temp, (res.definer().customSaver ?? JSON.stringify)(data));
61
+ await rename(temp, path);
62
+ }
63
+ catch (e) {
64
+ console.error("An error occurred when saving object for ", res, ": ", e);
65
+ }
66
+ }
67
+ async removeResource(res) {
68
+ const path = join(this.dataDir, res.definer().savePath(res));
69
+ try {
70
+ try {
71
+ await access(path);
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ await unlink(path);
77
+ res.resDrop();
78
+ }
79
+ catch (e) {
80
+ console.error("Failed to remove resource: ", path, res.path(), e);
81
+ }
82
+ }
83
+ async saveAll() {
84
+ const p = [];
85
+ for (const resource of this.resourceMap.values()) {
86
+ p.push(this.saveResource(resource));
87
+ }
88
+ await Promise.allSettled(p);
89
+ }
90
+ async shutdown() {
91
+ const p = [];
92
+ for (const resource of this.resourceMap.values()) {
93
+ p.push((async () => {
94
+ await this.saveResource(resource);
95
+ resource.resDrop();
96
+ })());
97
+ }
98
+ await Promise.allSettled(p);
99
+ }
100
+ mktemp() {
101
+ return join(this.dataDir, ".temp", generateUUID());
102
+ }
103
+ }
104
+ //# sourceMappingURL=resource-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-json.js","sourceRoot":"","sources":["../../../src/impl/server/resource-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { ResourceManager, ResourceDefiner } from "../../object.js";
2
+ export class ServerMemoryResourceManager extends ResourceManager {
3
+ memory = new Map();
4
+ constructor() {
5
+ super();
6
+ }
7
+ async loadResource(id) {
8
+ const [definer, realId] = ResourceDefiner.fromId(id);
9
+ const path = definer.loadPath(realId);
10
+ if (!this.memory.has(path))
11
+ return null;
12
+ try {
13
+ const data = this.memory.get(path);
14
+ const content = await (definer.customLoader ?? JSON.parse)(data);
15
+ const res = definer.init(realId);
16
+ void (async () => {
17
+ await res.resLoad(content);
18
+ res.ready();
19
+ })();
20
+ return res;
21
+ }
22
+ catch (e) {
23
+ console.error("Failed to load " + path);
24
+ // return null
25
+ throw e;
26
+ }
27
+ }
28
+ unloadResource(res) {
29
+ void this.saveResource(res);
30
+ res.resDrop();
31
+ }
32
+ async saveResource(res) {
33
+ try {
34
+ const path = res.definer().savePath(res);
35
+ const data = res.resSave(false);
36
+ this.memory.set(path, data);
37
+ }
38
+ catch (e) {
39
+ console.error("An error occurred when saving object for ", res, ": ", e);
40
+ }
41
+ }
42
+ async removeResource(res) {
43
+ const path = res.definer().savePath(res);
44
+ try {
45
+ this.memory.delete(path);
46
+ res.resDrop();
47
+ }
48
+ catch (e) {
49
+ console.error("Failed to remove resource: ", path, res.path(), e);
50
+ }
51
+ }
52
+ async saveAll() {
53
+ const p = [];
54
+ for (const resource of this.resourceMap.values()) {
55
+ p.push(this.saveResource(resource));
56
+ }
57
+ await Promise.allSettled(p);
58
+ }
59
+ async shutdown() {
60
+ const p = [];
61
+ for (const resource of this.resourceMap.values()) {
62
+ p.push((async () => {
63
+ await this.saveResource(resource);
64
+ resource.resDrop();
65
+ })());
66
+ }
67
+ await Promise.allSettled(p);
68
+ }
69
+ }
70
+ //# sourceMappingURL=resource-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-memory.js","sourceRoot":"","sources":["../../../src/impl/server/resource-memory.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { ResourceEnvironment, resourceEnvironment, resourceEnvironmentSetImpl } from "./environment.js";
2
+ export { EventBus } from "./event.js";
3
+ export * from "./object.js";
4
+ export { typedValuePackData } from "./protocol.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EAEnB,mBAAmB,EACnB,0BAA0B,EAC7B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAEH,QAAQ,EACX,MAAM,YAAY,CAAA;AACnB,cAAc,aAAa,CAAA;AAC3B,OAAO,EAEH,kBAAkB,EACrB,MAAM,eAAe,CAAA"}
package/dist/object.js ADDED
@@ -0,0 +1,465 @@
1
+ import { EventBus } from "./event.js";
2
+ import { typedValuePackData } from "./protocol.js";
3
+ import { resourceEnvironment as env } from "./environment.js";
4
+ const symbolInvokeMethods = Symbol.for("invokeMethods");
5
+ const symbolEmitEvents = Symbol.for("emitEvents");
6
+ const symbolDefiner = Symbol.for("definer");
7
+ export const DebugRefTracker = {
8
+ enabled: false,
9
+ map: new Map(),
10
+ async handleRefAdd(res) {
11
+ if (!this.enabled)
12
+ return;
13
+ const error = new Error();
14
+ const stack = (error.stack).split("\n").slice(3).join("\n");
15
+ if (!this.map.has(res))
16
+ this.map.set(res, []);
17
+ const ref = stringifyResourceRef(env().resource.ref(res));
18
+ // if (!ref.startsWith("chunk@test-(-1,0)")) return
19
+ // if (!ref.includes("chunk")) return
20
+ if (!stack.includes("Tile"))
21
+ this.map.get(res)?.push(stack);
22
+ // const {Chunk, World} = await import("./world/world.js")
23
+ // if (res instanceof World) return
24
+ // if (res instanceof Chunk) return
25
+ console.trace(`[RefTracker] + Ref: [${res.refcount}] ${ref}`);
26
+ },
27
+ async handleRefRemove(res) {
28
+ if (!this.enabled)
29
+ return;
30
+ const error = new Error();
31
+ const stack = (error.stack);
32
+ const ref = stringifyResourceRef(env().resource.ref(res));
33
+ // if (!ref.includes("entity")) return
34
+ // if (!ref.startsWith("chunk@test-(-1,0)")) return
35
+ // const {Chunk, World} = await import("./world/world.js")
36
+ // if (res instanceof World) return
37
+ // if (res instanceof Chunk) return
38
+ console.trace(`[RefTracker] - Deref: [${res.refcount}] ${stringifyResourceRef(env().resource.ref(res))}`);
39
+ },
40
+ async handleResDrop(res) {
41
+ if (!this.enabled)
42
+ return;
43
+ const ref = stringifyResourceRef(env().resource.ref(res));
44
+ // if (!ref.startsWith("chunk@test-(-1,0)")) return
45
+ console.log(`[RefTracker] * Drop: [*] ${stringifyResourceRef(env().resource.ref(res))}`);
46
+ this.map.delete(res);
47
+ }
48
+ };
49
+ globalThis.DebugRefTracker = DebugRefTracker;
50
+ export class BaseResource {
51
+ event;
52
+ refcount = 0;
53
+ refremovers = [];
54
+ resDropped = false;
55
+ subResources = new Map();
56
+ resGoingToRemove = false;
57
+ constructor() {
58
+ this.event = new EventBus();
59
+ if (env().remote.isServer())
60
+ this.event.rpcs.push(this.rpcEvent.bind(this));
61
+ }
62
+ [Symbol.dispose]() {
63
+ this.refRemove();
64
+ }
65
+ returnMove() {
66
+ this.refAdd();
67
+ return this;
68
+ }
69
+ refAdd(remover) {
70
+ this.refcount++;
71
+ if (remover)
72
+ this.refremovers.push(remover);
73
+ DebugRefTracker.handleRefAdd(this);
74
+ }
75
+ refRemove() {
76
+ this.refcount--;
77
+ if (this.isReady() && this.refcount <= 0 && !this.resDropped) {
78
+ this.resDrop();
79
+ }
80
+ DebugRefTracker.handleRefRemove(this);
81
+ }
82
+ resDrop() {
83
+ if (this.resDropped)
84
+ return;
85
+ for (const sub of this.subResources.values()) {
86
+ sub.resDrop();
87
+ }
88
+ this.resDropped = true;
89
+ this.refremovers.forEach(cb => cb(this));
90
+ DebugRefTracker.handleResDrop(this);
91
+ }
92
+ async resRemove() {
93
+ if (this.resDropped)
94
+ return;
95
+ if (!env().remote.isServer())
96
+ throw new Error("Only available on server side");
97
+ this.resGoingToRemove = true;
98
+ for (const child of this.subResources.values()) {
99
+ child.resRemove();
100
+ }
101
+ env().remote.rpcEmit(this, "$remove");
102
+ this.resDrop();
103
+ }
104
+ resSync() {
105
+ if (env().remote.isClient())
106
+ return;
107
+ env().remote.rpcEmit(this, "$sync", typedValuePackData(this.resSave(true)));
108
+ }
109
+ // method -> RpcManager
110
+ async rpcInvoke(method, ...args) {
111
+ if (Object.getPrototypeOf(this)[symbolInvokeMethods][method]) {
112
+ try {
113
+ return Promise.resolve(await this[method].apply(this, args));
114
+ }
115
+ catch (error) {
116
+ return Promise.reject(error);
117
+ }
118
+ }
119
+ return Promise.reject(new Error('Method not found: ' + method));
120
+ }
121
+ // event -> RpcManager
122
+ rpcEmit(event, ...args) {
123
+ if (event == "$sync") {
124
+ this.resLoad(args[0]).catch(e => {
125
+ console.error("Error during syncing for ", this.path(), " with data ", args[0], ": ", e);
126
+ }).then(() => {
127
+ this.event.emit("sync");
128
+ });
129
+ return;
130
+ }
131
+ if (event == "$remove") {
132
+ this.event.emit("remove");
133
+ }
134
+ if (Object.getPrototypeOf(this)[symbolEmitEvents][event]) {
135
+ this.event.emit(event, ...args);
136
+ }
137
+ }
138
+ rpcEvent(event, ...args) {
139
+ if (Object.getPrototypeOf(this)[symbolEmitEvents][event]) {
140
+ env().remote.rpcEmit(this, event, ...args);
141
+ }
142
+ }
143
+ resChild(path) {
144
+ if (path.length == 0)
145
+ return [this, []];
146
+ const child = this.subResources.get(path[0]);
147
+ if (!child)
148
+ return [null, path];
149
+ return child.resChild(path.slice(1));
150
+ }
151
+ definer() {
152
+ return Object.getPrototypeOf(this)[symbolDefiner];
153
+ }
154
+ }
155
+ export class Resource extends BaseResource {
156
+ static definers = new Map();
157
+ id;
158
+ _isReady = false;
159
+ constructor(id) {
160
+ super();
161
+ this.id = id;
162
+ }
163
+ async resRemove() {
164
+ await super.resRemove();
165
+ env().resource.removeResource(this);
166
+ }
167
+ static define(clazz, key) {
168
+ if (this.definers.has(key)) {
169
+ throw new Error(`Resource definer with key ${key} already exists`);
170
+ }
171
+ return new ResourceDefiner(clazz, key);
172
+ }
173
+ path() {
174
+ return [this.definer().id(this.id)];
175
+ }
176
+ definer() {
177
+ return Object.getPrototypeOf(this)[symbolDefiner];
178
+ }
179
+ ready() {
180
+ this._isReady = true;
181
+ env().resource.ready(this);
182
+ this.event.emit("sync");
183
+ }
184
+ isReady() {
185
+ return this._isReady;
186
+ }
187
+ }
188
+ export class SubResource extends BaseResource {
189
+ parent;
190
+ id;
191
+ constructor(parent, id) {
192
+ super();
193
+ this.parent = parent;
194
+ parent.subResources.set(id, this);
195
+ this.id = id;
196
+ }
197
+ refAdd(remover) {
198
+ this.parent.refAdd(remover ? () => remover(this) : void 0);
199
+ }
200
+ refRemove() {
201
+ this.parent.refRemove();
202
+ }
203
+ resDrop() {
204
+ if (this.resDropped)
205
+ return;
206
+ super.resDrop();
207
+ this.parent.subResources.delete(this.id);
208
+ }
209
+ static define(clazz, key) {
210
+ return new SubResourceDefiner(clazz, key);
211
+ }
212
+ path() {
213
+ return [...this.parent.path(), this.id];
214
+ }
215
+ isReady() {
216
+ return this.parent.isReady();
217
+ }
218
+ }
219
+ export class BaseResourceDefiner {
220
+ clazz;
221
+ key;
222
+ constructor(clazz, key) {
223
+ this.clazz = clazz;
224
+ this.key = key;
225
+ const parent = Object.getPrototypeOf(clazz.prototype);
226
+ const parentMap = parent[symbolInvokeMethods] || {};
227
+ clazz.prototype[symbolInvokeMethods] = Object.create(parentMap);
228
+ const parentEvent = parent[symbolEmitEvents] || {};
229
+ clazz.prototype[symbolEmitEvents] = Object.create(parentEvent);
230
+ clazz.prototype[symbolDefiner] = this;
231
+ const _invoke = clazz.prototype.rpcInvoke;
232
+ clazz.prototype.rpcInvoke = function __filter__(...args) {
233
+ if (env().remote.isClient())
234
+ throw new Error("Clientside!");
235
+ return _invoke.apply(this, args);
236
+ };
237
+ // const _emit = clazz.prototype.resEmit
238
+ // clazz.prototype.rpcInvoke = function __filter__ (...args: any[]) {
239
+ // if (env().remote.isServer()) throw new Error("Serverside!")
240
+ // return _emit.apply(this, args)
241
+ // }
242
+ }
243
+ invoke(key) {
244
+ this.clazz.prototype[symbolInvokeMethods][key] = true;
245
+ const _method = this.clazz.prototype[key];
246
+ // replace method
247
+ this.clazz.prototype[key] = function __invoke__(...args) {
248
+ if (env().remote.isClient()) {
249
+ return env().remote.rpcInvoke(this, key, ...args);
250
+ }
251
+ return _method.apply(this, args);
252
+ };
253
+ return this;
254
+ }
255
+ emit(key) {
256
+ this.clazz.prototype[symbolEmitEvents][key] = true;
257
+ return this;
258
+ }
259
+ static of(clazz) {
260
+ return clazz.prototype[symbolDefiner];
261
+ }
262
+ }
263
+ export class ResourceDefiner extends BaseResourceDefiner {
264
+ clazz;
265
+ key;
266
+ savePath = (o) => `/obj/${o.id}.json`;
267
+ loadPath = (id) => `/obj/${id}.json`;
268
+ customLoader;
269
+ customSaver;
270
+ implementation;
271
+ constructor(clazz, key) {
272
+ super(clazz, key);
273
+ this.clazz = clazz;
274
+ this.key = key;
275
+ this.implementation = clazz;
276
+ Resource.definers.set(key, this);
277
+ this.extendFrom(Object.getPrototypeOf(clazz.prototype));
278
+ }
279
+ extendFrom(parent) {
280
+ if (!parent)
281
+ return;
282
+ const definer = parent[symbolDefiner];
283
+ if (definer && definer instanceof ResourceDefiner) {
284
+ this.savePath = definer.savePath;
285
+ this.loadPath = definer.loadPath;
286
+ }
287
+ else {
288
+ this.extendFrom(Object.getPrototypeOf(parent));
289
+ }
290
+ }
291
+ static fromId(id) {
292
+ const [type, ...rest] = id.split("@");
293
+ return [Resource.definers.get(type), rest.join("@")];
294
+ }
295
+ init(id) {
296
+ return new this.implementation(id);
297
+ }
298
+ id(id) {
299
+ return this.key + "@" + id;
300
+ }
301
+ async create(...args) {
302
+ if (!env().remote.isServer())
303
+ throw new Error("Only available on server side");
304
+ return this.createWithId(Math.random().toString(), ...args);
305
+ }
306
+ async createWithId(id, ...args) {
307
+ const obj = this.init(id);
308
+ await obj.resCreate(...args);
309
+ obj.ready();
310
+ obj.refAdd();
311
+ return obj;
312
+ }
313
+ async resolve(id) {
314
+ const o = await env().resource.resolve([this.id(id)]);
315
+ if (o != null) {
316
+ return o;
317
+ }
318
+ throw new Error("Failed to request");
319
+ }
320
+ async loadOrCreate(id, ...args) {
321
+ if (!env().remote.isServer())
322
+ throw new Error("Only available on server side");
323
+ const o = await env().resource.resolve([this.id(id)]);
324
+ if (o != null) {
325
+ return o;
326
+ }
327
+ return await this.createWithId(id, ...args);
328
+ }
329
+ path(savePath, loadPath) {
330
+ this.savePath = savePath;
331
+ this.loadPath = loadPath;
332
+ return this;
333
+ }
334
+ serializer(loader, saver) {
335
+ this.customLoader = loader;
336
+ this.customSaver = saver;
337
+ return this;
338
+ }
339
+ implement(impl) {
340
+ this.implementation = impl;
341
+ impl.prototype[symbolDefiner] = this;
342
+ return this;
343
+ }
344
+ }
345
+ class SubResourceDefiner extends BaseResourceDefiner {
346
+ clazz;
347
+ key;
348
+ constructor(clazz, key) {
349
+ super(clazz, key);
350
+ this.clazz = clazz;
351
+ this.key = key;
352
+ }
353
+ }
354
+ export function stringifyResourceRef(ref) {
355
+ return ref ? ref.join("::") : "::null";
356
+ }
357
+ export class ResourceManager {
358
+ resourceMap = new Map();
359
+ awaitings = new Map();
360
+ listenings = new Map();
361
+ ready(res) {
362
+ const id = res.path()[0];
363
+ this.resourceMap.set(id, res);
364
+ res.refremovers.push(() => {
365
+ this.resourceMap.delete(id);
366
+ if (!res.resGoingToRemove)
367
+ this.unloadResource(res);
368
+ });
369
+ const awaitings = this.awaitings.get(id);
370
+ if (awaitings) {
371
+ awaitings.forEach((resolve) => resolve(res));
372
+ this.awaitings.delete(id);
373
+ }
374
+ const listenings = this.listenings.get(id);
375
+ if (listenings) {
376
+ listenings.forEach(cb => cb(res));
377
+ }
378
+ }
379
+ listen(ref, callback) {
380
+ if (!ref)
381
+ return;
382
+ const id = ref[0];
383
+ if (!this.listenings.has(id))
384
+ this.listenings.set(id, []);
385
+ this.listenings.get(id).push(callback);
386
+ if (this.resourceMap.has(id))
387
+ callback(this.resourceMap.get(id));
388
+ }
389
+ getOrNull(ref) {
390
+ if (!ref || ref.length != 1)
391
+ return null;
392
+ return this.resourceMap.get(ref[0]) ?? null;
393
+ }
394
+ async getResource(id) {
395
+ if (this.resourceMap.has(id))
396
+ return this.resourceMap.get(id);
397
+ if (this.awaitings.has(id)) {
398
+ // console.log("A-> ", id)
399
+ return new Promise((resolve) => {
400
+ this.awaitings.get(id).push(resolve);
401
+ });
402
+ }
403
+ // console.log("L-> ", id)
404
+ this.awaitings.set(id, []);
405
+ void this.loadResource(id)
406
+ .then(r => {
407
+ if (r?.resDropped)
408
+ throw new Error("Returning something already dropped!");
409
+ // console.log("D-> ", id, r? "Some": "None")
410
+ if (r == null) {
411
+ this.awaitings.get(id).forEach(res => res(null));
412
+ this.awaitings.delete(id);
413
+ }
414
+ }); // resource calls ready
415
+ return new Promise((resolve) => {
416
+ this.awaitings.get(id).push(resolve);
417
+ });
418
+ }
419
+ /**
420
+ * DO NOT FORGET release!
421
+ */
422
+ async resolve(path, refadd = true) {
423
+ // console.log("--> ", stringifyResourceRef(path))
424
+ if (path == null)
425
+ return null;
426
+ const [first, ...rest] = path;
427
+ const res = await this.getResource(first);
428
+ // console.log("--> ", stringifyResourceRef(path), res? "Some": "None")
429
+ if (!res)
430
+ return null;
431
+ if (refadd)
432
+ res.refAdd(typeof (refadd) == "function" ? refadd : void 0);
433
+ const [ret, left] = res.resChild(rest);
434
+ if (left.length != 0)
435
+ debugger;
436
+ // console.log("--> ", stringifyResourceRef(path), " -> ", ret? "Some": "None", left)
437
+ return ret;
438
+ }
439
+ ref(resource) {
440
+ if (resource == null)
441
+ return null;
442
+ return resource.path();
443
+ }
444
+ }
445
+ export function freeResourcesInObject(o) {
446
+ if (o instanceof BaseResource) {
447
+ o.refRemove();
448
+ return;
449
+ }
450
+ const def = env().getSpecialDef(o);
451
+ if (def) {
452
+ def.freeInside(o);
453
+ return;
454
+ }
455
+ if (Array.isArray(o)) {
456
+ o.forEach(i => freeResourcesInObject(i));
457
+ return;
458
+ }
459
+ for (const k in o) {
460
+ if (typeof (o[k]) == "object") {
461
+ freeResourcesInObject(o[k]);
462
+ }
463
+ }
464
+ }
465
+ //# sourceMappingURL=object.js.map