@dcl/sdk 7.24.6-29505165911.commit-d270434 → 7.24.6-29864780231.commit-4d12b50

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 (72) hide show
  1. package/composite-provider.js +4 -9
  2. package/internal/utf8.d.ts +15 -0
  3. package/internal/utf8.js +172 -0
  4. package/network/binary-message-bus.d.ts +3 -6
  5. package/network/binary-message-bus.js +5 -9
  6. package/network/index.d.ts +2 -8
  7. package/network/index.js +3 -16
  8. package/network/message-bus-sync.d.ts +1 -14
  9. package/network/message-bus-sync.js +103 -161
  10. package/network/state.js +5 -3
  11. package/package.json +6 -7
  12. package/src/composite-provider.ts +3 -10
  13. package/src/internal/utf8.ts +167 -0
  14. package/src/network/binary-message-bus.ts +4 -9
  15. package/src/network/index.ts +3 -40
  16. package/src/network/message-bus-sync.ts +110 -174
  17. package/src/network/state.ts +4 -3
  18. package/src/text-codec.ts +59 -12
  19. package/text-codec.d.ts +23 -8
  20. package/text-codec.js +55 -13
  21. package/atom.d.ts +0 -19
  22. package/atom.js +0 -83
  23. package/future.d.ts +0 -8
  24. package/future.js +0 -26
  25. package/network/chunking.d.ts +0 -5
  26. package/network/chunking.js +0 -38
  27. package/network/events/implementation.d.ts +0 -93
  28. package/network/events/implementation.js +0 -221
  29. package/network/events/index.d.ts +0 -42
  30. package/network/events/index.js +0 -43
  31. package/network/events/protocol.d.ts +0 -27
  32. package/network/events/protocol.js +0 -66
  33. package/network/events/registry.d.ts +0 -8
  34. package/network/events/registry.js +0 -3
  35. package/network/server/index.d.ts +0 -14
  36. package/network/server/index.js +0 -219
  37. package/network/server/utils.d.ts +0 -18
  38. package/network/server/utils.js +0 -135
  39. package/server/env-var.d.ts +0 -15
  40. package/server/env-var.js +0 -31
  41. package/server/index.d.ts +0 -2
  42. package/server/index.js +0 -3
  43. package/server/storage/constants.d.ts +0 -23
  44. package/server/storage/constants.js +0 -2
  45. package/server/storage/index.d.ts +0 -22
  46. package/server/storage/index.js +0 -29
  47. package/server/storage/player.d.ts +0 -43
  48. package/server/storage/player.js +0 -92
  49. package/server/storage/scene.d.ts +0 -38
  50. package/server/storage/scene.js +0 -90
  51. package/server/storage-url.d.ts +0 -10
  52. package/server/storage-url.js +0 -29
  53. package/server/utils.d.ts +0 -35
  54. package/server/utils.js +0 -56
  55. package/src/atom.ts +0 -98
  56. package/src/ethereum-provider/text-encoding.d.ts +0 -4
  57. package/src/future.ts +0 -38
  58. package/src/network/chunking.ts +0 -45
  59. package/src/network/events/implementation.ts +0 -271
  60. package/src/network/events/index.ts +0 -48
  61. package/src/network/events/protocol.ts +0 -94
  62. package/src/network/events/registry.ts +0 -18
  63. package/src/network/server/index.ts +0 -301
  64. package/src/network/server/utils.ts +0 -189
  65. package/src/server/env-var.ts +0 -36
  66. package/src/server/index.ts +0 -2
  67. package/src/server/storage/constants.ts +0 -22
  68. package/src/server/storage/index.ts +0 -44
  69. package/src/server/storage/player.ts +0 -156
  70. package/src/server/storage/scene.ts +0 -149
  71. package/src/server/storage-url.ts +0 -34
  72. package/src/server/utils.ts +0 -73
package/src/text-codec.ts CHANGED
@@ -1,23 +1,70 @@
1
- import TextEncodingPolyfill from 'text-encoding'
2
1
  import { setGlobalPolyfill } from '@dcl/ecs'
2
+ import { decodeUtf8, encodeUtf8, encodeUtf8Into } from './internal/utf8'
3
3
 
4
4
  /**
5
- * Install the `TextEncoder` / `TextDecoder` polyfill on `globalThis`.
5
+ * WHATWG-shaped `TextEncoder` / `TextDecoder` over the SDK's own UTF-8 codec.
6
6
  *
7
- * The QuickJS scene runtime ships no native `TextEncoder` / `TextDecoder`, yet
8
- * `compositeProvider.loadComposite` decodes `.composite` JSON file bytes via
9
- * `TextDecoder`. Callers that load composites at runtime (e.g. `@dcl/asset-packs`'
10
- * `SPAWN_ENTITY`) must install this first.
7
+ * UTF-8 is the only supported encoding: the decoder throws a `RangeError` for
8
+ * any other label instead of silently mis-decoding, and rejects `{ stream: true }`.
9
+ */
10
+
11
+ // Labels the WHATWG Encoding Standard maps to utf-8.
12
+ const UTF8_LABELS = ['unicode-1-1-utf-8', 'unicode11utf8', 'unicode20utf8', 'utf-8', 'utf8', 'x-unicode20utf8']
13
+
14
+ function toUint8Array(input?: ArrayBuffer | ArrayBufferView): Uint8Array {
15
+ if (input === undefined) return new Uint8Array(0)
16
+ if (input instanceof Uint8Array) return input
17
+ if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength)
18
+ return new Uint8Array(input)
19
+ }
20
+
21
+ export class TextEncoder {
22
+ readonly encoding = 'utf-8'
23
+
24
+ encode(input: string = ''): Uint8Array {
25
+ return encodeUtf8(String(input))
26
+ }
27
+
28
+ encodeInto(source: string, destination: Uint8Array): { read: number; written: number } {
29
+ return encodeUtf8Into(String(source), destination)
30
+ }
31
+ }
32
+
33
+ export class TextDecoder {
34
+ readonly encoding = 'utf-8'
35
+ readonly fatal: boolean
36
+ readonly ignoreBOM: boolean
37
+
38
+ constructor(label: string = 'utf-8', options: { fatal?: boolean; ignoreBOM?: boolean } = {}) {
39
+ // the spec strips ASCII whitespace only, so String.prototype.trim is too wide
40
+ const normalized = String(label)
41
+ .replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '')
42
+ .toLowerCase()
43
+ if (!UTF8_LABELS.includes(normalized)) {
44
+ throw new RangeError(`TextDecoder: only utf-8 is supported, got "${label}"`)
45
+ }
46
+ this.fatal = options.fatal === true
47
+ this.ignoreBOM = options.ignoreBOM === true
48
+ }
49
+
50
+ decode(input?: ArrayBuffer | ArrayBufferView, options: { stream?: boolean } = {}): string {
51
+ if (options.stream) throw new TypeError('TextDecoder: streaming is not supported')
52
+ return decodeUtf8(toUint8Array(input), { fatal: this.fatal, ignoreBOM: this.ignoreBOM })
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
58
+ * not provide them (native implementations always win over these polyfills).
11
59
  *
12
60
  * Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
13
- * the polyfill without pulling in the ethereum provider, and without bundling
14
- * `text-encoding` into scenes that never reach this module.
61
+ * the polyfill without pulling in the ethereum provider.
15
62
  */
16
63
  // NOTE: this function mutates globalThis — it is NOT pure. Do not annotate
17
64
  // with /* @__PURE__ */; minifiers would treat the call as dead code and drop
18
- // the polyfill installation, breaking runtime callers like
19
- // compositeProvider.loadComposite that rely on globalThis.TextDecoder.
65
+ // the polyfill installation, breaking third-party code that relies on
66
+ // globalThis.TextDecoder.
20
67
  export function polyfillTextEncoder() {
21
- setGlobalPolyfill('TextEncoder', TextEncodingPolyfill.TextEncoder)
22
- setGlobalPolyfill('TextDecoder', TextEncodingPolyfill.TextDecoder)
68
+ setGlobalPolyfill('TextEncoder', TextEncoder)
69
+ setGlobalPolyfill('TextDecoder', TextDecoder)
23
70
  }
package/text-codec.d.ts CHANGED
@@ -1,13 +1,28 @@
1
+ export declare class TextEncoder {
2
+ readonly encoding = "utf-8";
3
+ encode(input?: string): Uint8Array;
4
+ encodeInto(source: string, destination: Uint8Array): {
5
+ read: number;
6
+ written: number;
7
+ };
8
+ }
9
+ export declare class TextDecoder {
10
+ readonly encoding = "utf-8";
11
+ readonly fatal: boolean;
12
+ readonly ignoreBOM: boolean;
13
+ constructor(label?: string, options?: {
14
+ fatal?: boolean;
15
+ ignoreBOM?: boolean;
16
+ });
17
+ decode(input?: ArrayBuffer | ArrayBufferView, options?: {
18
+ stream?: boolean;
19
+ }): string;
20
+ }
1
21
  /**
2
- * Install the `TextEncoder` / `TextDecoder` polyfill on `globalThis`.
3
- *
4
- * The QuickJS scene runtime ships no native `TextEncoder` / `TextDecoder`, yet
5
- * `compositeProvider.loadComposite` decodes `.composite` JSON file bytes via
6
- * `TextDecoder`. Callers that load composites at runtime (e.g. `@dcl/asset-packs`'
7
- * `SPAWN_ENTITY`) must install this first.
22
+ * Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
23
+ * not provide them (native implementations always win over these polyfills).
8
24
  *
9
25
  * Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
10
- * the polyfill without pulling in the ethereum provider, and without bundling
11
- * `text-encoding` into scenes that never reach this module.
26
+ * the polyfill without pulling in the ethereum provider.
12
27
  */
13
28
  export declare function polyfillTextEncoder(): void;
package/text-codec.js CHANGED
@@ -1,23 +1,65 @@
1
- import TextEncodingPolyfill from 'text-encoding';
2
1
  import { setGlobalPolyfill } from '@dcl/ecs';
2
+ import { decodeUtf8, encodeUtf8, encodeUtf8Into } from './internal/utf8';
3
3
  /**
4
- * Install the `TextEncoder` / `TextDecoder` polyfill on `globalThis`.
4
+ * WHATWG-shaped `TextEncoder` / `TextDecoder` over the SDK's own UTF-8 codec.
5
5
  *
6
- * The QuickJS scene runtime ships no native `TextEncoder` / `TextDecoder`, yet
7
- * `compositeProvider.loadComposite` decodes `.composite` JSON file bytes via
8
- * `TextDecoder`. Callers that load composites at runtime (e.g. `@dcl/asset-packs`'
9
- * `SPAWN_ENTITY`) must install this first.
6
+ * UTF-8 is the only supported encoding: the decoder throws a `RangeError` for
7
+ * any other label instead of silently mis-decoding, and rejects `{ stream: true }`.
8
+ */
9
+ // Labels the WHATWG Encoding Standard maps to utf-8.
10
+ const UTF8_LABELS = ['unicode-1-1-utf-8', 'unicode11utf8', 'unicode20utf8', 'utf-8', 'utf8', 'x-unicode20utf8'];
11
+ function toUint8Array(input) {
12
+ if (input === undefined)
13
+ return new Uint8Array(0);
14
+ if (input instanceof Uint8Array)
15
+ return input;
16
+ if (ArrayBuffer.isView(input))
17
+ return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
18
+ return new Uint8Array(input);
19
+ }
20
+ export class TextEncoder {
21
+ constructor() {
22
+ this.encoding = 'utf-8';
23
+ }
24
+ encode(input = '') {
25
+ return encodeUtf8(String(input));
26
+ }
27
+ encodeInto(source, destination) {
28
+ return encodeUtf8Into(String(source), destination);
29
+ }
30
+ }
31
+ export class TextDecoder {
32
+ constructor(label = 'utf-8', options = {}) {
33
+ this.encoding = 'utf-8';
34
+ // the spec strips ASCII whitespace only, so String.prototype.trim is too wide
35
+ const normalized = String(label)
36
+ .replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '')
37
+ .toLowerCase();
38
+ if (!UTF8_LABELS.includes(normalized)) {
39
+ throw new RangeError(`TextDecoder: only utf-8 is supported, got "${label}"`);
40
+ }
41
+ this.fatal = options.fatal === true;
42
+ this.ignoreBOM = options.ignoreBOM === true;
43
+ }
44
+ decode(input, options = {}) {
45
+ if (options.stream)
46
+ throw new TypeError('TextDecoder: streaming is not supported');
47
+ return decodeUtf8(toUint8Array(input), { fatal: this.fatal, ignoreBOM: this.ignoreBOM });
48
+ }
49
+ }
50
+ /**
51
+ * Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
52
+ * not provide them (native implementations always win over these polyfills).
10
53
  *
11
54
  * Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
12
- * the polyfill without pulling in the ethereum provider, and without bundling
13
- * `text-encoding` into scenes that never reach this module.
55
+ * the polyfill without pulling in the ethereum provider.
14
56
  */
15
57
  // NOTE: this function mutates globalThis — it is NOT pure. Do not annotate
16
58
  // with /* @__PURE__ */; minifiers would treat the call as dead code and drop
17
- // the polyfill installation, breaking runtime callers like
18
- // compositeProvider.loadComposite that rely on globalThis.TextDecoder.
59
+ // the polyfill installation, breaking third-party code that relies on
60
+ // globalThis.TextDecoder.
19
61
  export function polyfillTextEncoder() {
20
- setGlobalPolyfill('TextEncoder', TextEncodingPolyfill.TextEncoder);
21
- setGlobalPolyfill('TextDecoder', TextEncodingPolyfill.TextDecoder);
62
+ setGlobalPolyfill('TextEncoder', TextEncoder);
63
+ setGlobalPolyfill('TextDecoder', TextDecoder);
22
64
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1jb2RlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy90ZXh0LWNvZGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sb0JBQW9CLE1BQU0sZUFBZSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUU1Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILDJFQUEyRTtBQUMzRSw2RUFBNkU7QUFDN0UsMkRBQTJEO0FBQzNELHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNsRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZXh0RW5jb2RpbmdQb2x5ZmlsbCBmcm9tICd0ZXh0LWVuY29kaW5nJ1xuaW1wb3J0IHsgc2V0R2xvYmFsUG9seWZpbGwgfSBmcm9tICdAZGNsL2VjcydcblxuLyoqXG4gKiBJbnN0YWxsIHRoZSBgVGV4dEVuY29kZXJgIC8gYFRleHREZWNvZGVyYCBwb2x5ZmlsbCBvbiBgZ2xvYmFsVGhpc2AuXG4gKlxuICogVGhlIFF1aWNrSlMgc2NlbmUgcnVudGltZSBzaGlwcyBubyBuYXRpdmUgYFRleHRFbmNvZGVyYCAvIGBUZXh0RGVjb2RlcmAsIHlldFxuICogYGNvbXBvc2l0ZVByb3ZpZGVyLmxvYWRDb21wb3NpdGVgIGRlY29kZXMgYC5jb21wb3NpdGVgIEpTT04gZmlsZSBieXRlcyB2aWFcbiAqIGBUZXh0RGVjb2RlcmAuIENhbGxlcnMgdGhhdCBsb2FkIGNvbXBvc2l0ZXMgYXQgcnVudGltZSAoZS5nLiBgQGRjbC9hc3NldC1wYWNrc2AnXG4gKiBgU1BBV05fRU5USVRZYCkgbXVzdCBpbnN0YWxsIHRoaXMgZmlyc3QuXG4gKlxuICogRXhwb3NlZCBmcm9tIHRoZSBsZWFuIGBAZGNsL3Nkay90ZXh0LWNvZGVjYCBzdWJwYXRoIHNvIGNvbnN1bWVycyBjYW4gaW5zdGFsbFxuICogdGhlIHBvbHlmaWxsIHdpdGhvdXQgcHVsbGluZyBpbiB0aGUgZXRoZXJldW0gcHJvdmlkZXIsIGFuZCB3aXRob3V0IGJ1bmRsaW5nXG4gKiBgdGV4dC1lbmNvZGluZ2AgaW50byBzY2VuZXMgdGhhdCBuZXZlciByZWFjaCB0aGlzIG1vZHVsZS5cbiAqL1xuLy8gTk9URTogdGhpcyBmdW5jdGlvbiBtdXRhdGVzIGdsb2JhbFRoaXMg4oCUIGl0IGlzIE5PVCBwdXJlLiBEbyBub3QgYW5ub3RhdGVcbi8vIHdpdGggLyogQF9fUFVSRV9fICovOyBtaW5pZmllcnMgd291bGQgdHJlYXQgdGhlIGNhbGwgYXMgZGVhZCBjb2RlIGFuZCBkcm9wXG4vLyB0aGUgcG9seWZpbGwgaW5zdGFsbGF0aW9uLCBicmVha2luZyBydW50aW1lIGNhbGxlcnMgbGlrZVxuLy8gY29tcG9zaXRlUHJvdmlkZXIubG9hZENvbXBvc2l0ZSB0aGF0IHJlbHkgb24gZ2xvYmFsVGhpcy5UZXh0RGVjb2Rlci5cbmV4cG9ydCBmdW5jdGlvbiBwb2x5ZmlsbFRleHRFbmNvZGVyKCkge1xuICBzZXRHbG9iYWxQb2x5ZmlsbCgnVGV4dEVuY29kZXInLCBUZXh0RW5jb2RpbmdQb2x5ZmlsbC5UZXh0RW5jb2RlcilcbiAgc2V0R2xvYmFsUG9seWZpbGwoJ1RleHREZWNvZGVyJywgVGV4dEVuY29kaW5nUG9seWZpbGwuVGV4dERlY29kZXIpXG59XG4iXX0=
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1jb2RlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy90ZXh0LWNvZGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RTs7Ozs7R0FLRztBQUVILHFEQUFxRDtBQUNyRCxNQUFNLFdBQVcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0FBRS9HLFNBQVMsWUFBWSxDQUFDLEtBQXFDO0lBQ3pELElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pELElBQUksS0FBSyxZQUFZLFVBQVU7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUM3QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3RHLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBQ1csYUFBUSxHQUFHLE9BQU8sQ0FBQTtJQVM3QixDQUFDO0lBUEMsTUFBTSxDQUFDLFFBQWdCLEVBQUU7UUFDdkIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFjLEVBQUUsV0FBdUI7UUFDaEQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3BELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksUUFBZ0IsT0FBTyxFQUFFLFVBQW9ELEVBQUU7UUFKbEYsYUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUt6Qiw4RUFBOEU7UUFDOUUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM3QixPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDO2FBQzNDLFdBQVcsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLEtBQUssR0FBRyxDQUFDLENBQUE7U0FDN0U7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFBO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUE7SUFDN0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFxQyxFQUFFLFVBQWdDLEVBQUU7UUFDOUUsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMseUNBQXlDLENBQUMsQ0FBQTtRQUNsRixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDMUYsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxzRUFBc0U7QUFDdEUsMEJBQTBCO0FBQzFCLE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzdDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2V0R2xvYmFsUG9seWZpbGwgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGRlY29kZVV0ZjgsIGVuY29kZVV0ZjgsIGVuY29kZVV0ZjhJbnRvIH0gZnJvbSAnLi9pbnRlcm5hbC91dGY4J1xuXG4vKipcbiAqIFdIQVRXRy1zaGFwZWQgYFRleHRFbmNvZGVyYCAvIGBUZXh0RGVjb2RlcmAgb3ZlciB0aGUgU0RLJ3Mgb3duIFVURi04IGNvZGVjLlxuICpcbiAqIFVURi04IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBlbmNvZGluZzogdGhlIGRlY29kZXIgdGhyb3dzIGEgYFJhbmdlRXJyb3JgIGZvclxuICogYW55IG90aGVyIGxhYmVsIGluc3RlYWQgb2Ygc2lsZW50bHkgbWlzLWRlY29kaW5nLCBhbmQgcmVqZWN0cyBgeyBzdHJlYW06IHRydWUgfWAuXG4gKi9cblxuLy8gTGFiZWxzIHRoZSBXSEFUV0cgRW5jb2RpbmcgU3RhbmRhcmQgbWFwcyB0byB1dGYtOC5cbmNvbnN0IFVURjhfTEFCRUxTID0gWyd1bmljb2RlLTEtMS11dGYtOCcsICd1bmljb2RlMTF1dGY4JywgJ3VuaWNvZGUyMHV0ZjgnLCAndXRmLTgnLCAndXRmOCcsICd4LXVuaWNvZGUyMHV0ZjgnXVxuXG5mdW5jdGlvbiB0b1VpbnQ4QXJyYXkoaW5wdXQ/OiBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyk6IFVpbnQ4QXJyYXkge1xuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBpbnB1dFxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0LmJ1ZmZlciwgaW5wdXQuYnl0ZU9mZnNldCwgaW5wdXQuYnl0ZUxlbmd0aClcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KVxufVxuXG5leHBvcnQgY2xhc3MgVGV4dEVuY29kZXIge1xuICByZWFkb25seSBlbmNvZGluZyA9ICd1dGYtOCdcblxuICBlbmNvZGUoaW5wdXQ6IHN0cmluZyA9ICcnKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGVuY29kZVV0ZjgoU3RyaW5nKGlucHV0KSlcbiAgfVxuXG4gIGVuY29kZUludG8oc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBVaW50OEFycmF5KTogeyByZWFkOiBudW1iZXI7IHdyaXR0ZW46IG51bWJlciB9IHtcbiAgICByZXR1cm4gZW5jb2RlVXRmOEludG8oU3RyaW5nKHNvdXJjZSksIGRlc3RpbmF0aW9uKVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIHJlYWRvbmx5IGVuY29kaW5nID0gJ3V0Zi04J1xuICByZWFkb25seSBmYXRhbDogYm9vbGVhblxuICByZWFkb25seSBpZ25vcmVCT006IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nID0gJ3V0Zi04Jywgb3B0aW9uczogeyBmYXRhbD86IGJvb2xlYW47IGlnbm9yZUJPTT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgLy8gdGhlIHNwZWMgc3RyaXBzIEFTQ0lJIHdoaXRlc3BhY2Ugb25seSwgc28gU3RyaW5nLnByb3RvdHlwZS50cmltIGlzIHRvbyB3aWRlXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZyhsYWJlbClcbiAgICAgIC5yZXBsYWNlKC9eW1xcdFxcblxcZlxcciBdK3xbXFx0XFxuXFxmXFxyIF0rJC9nLCAnJylcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKCFVVEY4X0xBQkVMUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRleHREZWNvZGVyOiBvbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCwgZ290IFwiJHtsYWJlbH1cImApXG4gICAgfVxuICAgIHRoaXMuZmF0YWwgPSBvcHRpb25zLmZhdGFsID09PSB0cnVlXG4gICAgdGhpcy5pZ25vcmVCT00gPSBvcHRpb25zLmlnbm9yZUJPTSA9PT0gdHJ1ZVxuICB9XG5cbiAgZGVjb2RlKGlucHV0PzogQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcsIG9wdGlvbnM6IHsgc3RyZWFtPzogYm9vbGVhbiB9ID0ge30pOiBzdHJpbmcge1xuICAgIGlmIChvcHRpb25zLnN0cmVhbSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVGV4dERlY29kZXI6IHN0cmVhbWluZyBpcyBub3Qgc3VwcG9ydGVkJylcbiAgICByZXR1cm4gZGVjb2RlVXRmOCh0b1VpbnQ4QXJyYXkoaW5wdXQpLCB7IGZhdGFsOiB0aGlzLmZhdGFsLCBpZ25vcmVCT006IHRoaXMuaWdub3JlQk9NIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxsIGBUZXh0RW5jb2RlcmAgLyBgVGV4dERlY29kZXJgIG9uIGBnbG9iYWxUaGlzYCB3aGVyZSB0aGUgcnVudGltZSBkb2VzXG4gKiBub3QgcHJvdmlkZSB0aGVtIChuYXRpdmUgaW1wbGVtZW50YXRpb25zIGFsd2F5cyB3aW4gb3ZlciB0aGVzZSBwb2x5ZmlsbHMpLlxuICpcbiAqIEV4cG9zZWQgZnJvbSB0aGUgbGVhbiBgQGRjbC9zZGsvdGV4dC1jb2RlY2Agc3VicGF0aCBzbyBjb25zdW1lcnMgY2FuIGluc3RhbGxcbiAqIHRoZSBwb2x5ZmlsbCB3aXRob3V0IHB1bGxpbmcgaW4gdGhlIGV0aGVyZXVtIHByb3ZpZGVyLlxuICovXG4vLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIG11dGF0ZXMgZ2xvYmFsVGhpcyDigJQgaXQgaXMgTk9UIHB1cmUuIERvIG5vdCBhbm5vdGF0ZVxuLy8gd2l0aCAvKiBAX19QVVJFX18gKi87IG1pbmlmaWVycyB3b3VsZCB0cmVhdCB0aGUgY2FsbCBhcyBkZWFkIGNvZGUgYW5kIGRyb3Bcbi8vIHRoZSBwb2x5ZmlsbCBpbnN0YWxsYXRpb24sIGJyZWFraW5nIHRoaXJkLXBhcnR5IGNvZGUgdGhhdCByZWxpZXMgb25cbi8vIGdsb2JhbFRoaXMuVGV4dERlY29kZXIuXG5leHBvcnQgZnVuY3Rpb24gcG9seWZpbGxUZXh0RW5jb2RlcigpIHtcbiAgc2V0R2xvYmFsUG9seWZpbGwoJ1RleHRFbmNvZGVyJywgVGV4dEVuY29kZXIpXG4gIHNldEdsb2JhbFBvbHlmaWxsKCdUZXh0RGVjb2RlcicsIFRleHREZWNvZGVyKVxufVxuIl19
package/atom.d.ts DELETED
@@ -1,19 +0,0 @@
1
- declare class SimpleObservable<T> {
2
- private observers;
3
- private onceObservers;
4
- add(callback: (value: T) => void): (value: T) => void;
5
- addOnce(callback: (value: T) => void): void;
6
- remove(callback: (value: T) => void): void;
7
- notifyObservers(value: T): void;
8
- }
9
- declare const EMPTY: unique symbol;
10
- type EMPTY = typeof EMPTY;
11
- export type Atom<T> = {
12
- deref(): Promise<T>;
13
- getOrNull(): T | null;
14
- observable: SimpleObservable<T>;
15
- swap(value: T): T | void;
16
- pipe(fn: (value: T) => void | Promise<void>): Promise<void>;
17
- };
18
- export declare function Atom<T>(initialValue?: T | EMPTY): Atom<T>;
19
- export {};
package/atom.js DELETED
@@ -1,83 +0,0 @@
1
- import future from './future';
2
- // atom value wrapper like in clojure
3
- // Simple Observable implementation to replace Babylon.js dependency
4
- class SimpleObservable {
5
- constructor() {
6
- this.observers = [];
7
- this.onceObservers = [];
8
- }
9
- add(callback) {
10
- this.observers.push(callback);
11
- return callback;
12
- }
13
- addOnce(callback) {
14
- this.onceObservers.push(callback);
15
- }
16
- remove(callback) {
17
- const index = this.observers.indexOf(callback);
18
- if (index > -1) {
19
- this.observers.splice(index, 1);
20
- }
21
- }
22
- notifyObservers(value) {
23
- this.observers.forEach((observer) => observer(value));
24
- if (this.onceObservers.length > 0) {
25
- this.onceObservers.forEach((observer) => observer(value));
26
- this.onceObservers.length = 0;
27
- }
28
- }
29
- }
30
- const EMPTY = Symbol('empty');
31
- export function Atom(initialValue = EMPTY) {
32
- const observable = new SimpleObservable();
33
- let value = initialValue;
34
- const valueFutures = [];
35
- observable.addOnce((value) => {
36
- valueFutures.forEach(($) => $.resolve(value));
37
- valueFutures.length = 0;
38
- });
39
- return {
40
- async pipe(fn) {
41
- observable.add(async (t) => {
42
- try {
43
- await fn(t);
44
- }
45
- catch (err) {
46
- console.error(err);
47
- }
48
- });
49
- if (value !== EMPTY) {
50
- try {
51
- await fn(value);
52
- }
53
- catch (err) {
54
- console.error(err);
55
- }
56
- }
57
- },
58
- deref() {
59
- if (value === EMPTY) {
60
- const ret = future();
61
- valueFutures.push(ret);
62
- return ret;
63
- }
64
- return Promise.resolve(value);
65
- },
66
- getOrNull() {
67
- if (value === EMPTY) {
68
- return null;
69
- }
70
- return value;
71
- },
72
- observable,
73
- swap(newValue) {
74
- const oldValue = value;
75
- if (newValue !== value) {
76
- value = newValue;
77
- observable.notifyObservers(value);
78
- }
79
- return oldValue === EMPTY ? undefined : oldValue;
80
- }
81
- };
82
- }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9hdG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBbUIsTUFBTSxVQUFVLENBQUE7QUFFMUMscUNBQXFDO0FBRXJDLG9FQUFvRTtBQUNwRSxNQUFNLGdCQUFnQjtJQUF0QjtRQUNVLGNBQVMsR0FBMkIsRUFBRSxDQUFBO1FBQ3RDLGtCQUFhLEdBQTJCLEVBQUUsQ0FBQTtJQTBCcEQsQ0FBQztJQXhCQyxHQUFHLENBQUMsUUFBNEI7UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDN0IsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVELE9BQU8sQ0FBQyxRQUE0QjtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTRCO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFRO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUVyRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDekQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1NBQzlCO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBVzdCLE1BQU0sVUFBVSxJQUFJLENBQUksZUFBMEIsS0FBSztJQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGdCQUFnQixFQUFLLENBQUE7SUFDNUMsSUFBSSxLQUFLLEdBQWMsWUFBWSxDQUFBO0lBQ25DLE1BQU0sWUFBWSxHQUFpQixFQUFFLENBQUE7SUFFckMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzNCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUM3QyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU87UUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDWCxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsSUFBSTtvQkFDRixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDWjtnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2lCQUNuQjtZQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUNuQixJQUFJO29CQUNGLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUNoQjtnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2lCQUNuQjthQUNGO1FBQ0gsQ0FBQztRQUNELEtBQUs7WUFDSCxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUU7Z0JBQ25CLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBSyxDQUFBO2dCQUN2QixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN0QixPQUFPLEdBQUcsQ0FBQTthQUNYO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9CLENBQUM7UUFDRCxTQUFTO1lBQ1AsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUNuQixPQUFPLElBQUksQ0FBQTthQUNaO1lBQ0QsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBQ0QsVUFBVTtRQUNWLElBQUksQ0FBQyxRQUFRO1lBQ1gsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFBO1lBQ3RCLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRTtnQkFDdEIsS0FBSyxHQUFHLFFBQVEsQ0FBQTtnQkFDaEIsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNsQztZQUNELE9BQU8sUUFBUSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDbEQsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZ1dHVyZSwgeyBJRnV0dXJlIH0gZnJvbSAnLi9mdXR1cmUnXG5cbi8vIGF0b20gdmFsdWUgd3JhcHBlciBsaWtlIGluIGNsb2p1cmVcblxuLy8gU2ltcGxlIE9ic2VydmFibGUgaW1wbGVtZW50YXRpb24gdG8gcmVwbGFjZSBCYWJ5bG9uLmpzIGRlcGVuZGVuY3lcbmNsYXNzIFNpbXBsZU9ic2VydmFibGU8VD4ge1xuICBwcml2YXRlIG9ic2VydmVyczogKCh2YWx1ZTogVCkgPT4gdm9pZClbXSA9IFtdXG4gIHByaXZhdGUgb25jZU9ic2VydmVyczogKCh2YWx1ZTogVCkgPT4gdm9pZClbXSA9IFtdXG5cbiAgYWRkKGNhbGxiYWNrOiAodmFsdWU6IFQpID0+IHZvaWQpOiAodmFsdWU6IFQpID0+IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goY2FsbGJhY2spXG4gICAgcmV0dXJuIGNhbGxiYWNrXG4gIH1cblxuICBhZGRPbmNlKGNhbGxiYWNrOiAodmFsdWU6IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uY2VPYnNlcnZlcnMucHVzaChjYWxsYmFjaylcbiAgfVxuXG4gIHJlbW92ZShjYWxsYmFjazogKHZhbHVlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKGNhbGxiYWNrKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG5cbiAgbm90aWZ5T2JzZXJ2ZXJzKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZm9yRWFjaCgob2JzZXJ2ZXIpID0+IG9ic2VydmVyKHZhbHVlKSlcblxuICAgIGlmICh0aGlzLm9uY2VPYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5vbmNlT2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKSA9PiBvYnNlcnZlcih2YWx1ZSkpXG4gICAgICB0aGlzLm9uY2VPYnNlcnZlcnMubGVuZ3RoID0gMFxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBFTVBUWSA9IFN5bWJvbCgnZW1wdHknKVxudHlwZSBFTVBUWSA9IHR5cGVvZiBFTVBUWVxuXG5leHBvcnQgdHlwZSBBdG9tPFQ+ID0ge1xuICBkZXJlZigpOiBQcm9taXNlPFQ+XG4gIGdldE9yTnVsbCgpOiBUIHwgbnVsbFxuICBvYnNlcnZhYmxlOiBTaW1wbGVPYnNlcnZhYmxlPFQ+XG4gIHN3YXAodmFsdWU6IFQpOiBUIHwgdm9pZFxuICBwaXBlKGZuOiAodmFsdWU6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gQXRvbTxUPihpbml0aWFsVmFsdWU6IFQgfCBFTVBUWSA9IEVNUFRZKTogQXRvbTxUPiB7XG4gIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgU2ltcGxlT2JzZXJ2YWJsZTxUPigpXG4gIGxldCB2YWx1ZTogVCB8IEVNUFRZID0gaW5pdGlhbFZhbHVlXG4gIGNvbnN0IHZhbHVlRnV0dXJlczogSUZ1dHVyZTxUPltdID0gW11cblxuICBvYnNlcnZhYmxlLmFkZE9uY2UoKHZhbHVlKSA9PiB7XG4gICAgdmFsdWVGdXR1cmVzLmZvckVhY2goKCQpID0+ICQucmVzb2x2ZSh2YWx1ZSkpXG4gICAgdmFsdWVGdXR1cmVzLmxlbmd0aCA9IDBcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHBpcGUoZm4pIHtcbiAgICAgIG9ic2VydmFibGUuYWRkKGFzeW5jICh0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZm4odClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAodmFsdWUgIT09IEVNUFRZKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZm4odmFsdWUpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkZXJlZigpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gRU1QVFkpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gZnV0dXJlPFQ+KClcbiAgICAgICAgdmFsdWVGdXR1cmVzLnB1c2gocmV0KVxuICAgICAgICByZXR1cm4gcmV0XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKVxuICAgIH0sXG4gICAgZ2V0T3JOdWxsKCkge1xuICAgICAgaWYgKHZhbHVlID09PSBFTVBUWSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBvYnNlcnZhYmxlLFxuICAgIHN3YXAobmV3VmFsdWUpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdmFsdWVcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZVxuICAgICAgICBvYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvbGRWYWx1ZSA9PT0gRU1QVFkgPyB1bmRlZmluZWQgOiBvbGRWYWx1ZVxuICAgIH1cbiAgfVxufVxuIl19
package/future.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export type IFuture<T> = Promise<T> & {
2
- resolve: (x: T) => void;
3
- reject: (x: Error) => void;
4
- finally: (fn: () => void) => void;
5
- isPending: boolean;
6
- };
7
- export declare function future<T = any>(): IFuture<T>;
8
- export default future;
package/future.js DELETED
@@ -1,26 +0,0 @@
1
- export function future() {
2
- let resolver;
3
- let rejecter;
4
- const promise = new Promise((ok, err) => {
5
- resolver = (x) => {
6
- ok(x);
7
- promise.isPending = false;
8
- };
9
- rejecter = (x) => {
10
- err(x);
11
- promise.isPending = false;
12
- };
13
- }).catch((e) => Promise.reject(e));
14
- promise.resolve = resolver;
15
- promise.reject = rejecter;
16
- if (!('finally' in promise)) {
17
- promise.finally = (fn) => {
18
- promise.then(fn);
19
- promise.catch(fn);
20
- };
21
- }
22
- promise.isPending = true;
23
- return promise;
24
- }
25
- export default future;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnV0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3JjL2Z1dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLFVBQVUsTUFBTTtJQUNwQixJQUFJLFFBQXdCLENBQUE7SUFDNUIsSUFBSSxRQUE0QixDQUFBO0lBRWhDLE1BQU0sT0FBTyxHQUFRLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzNDLFFBQVEsR0FBRyxDQUFDLENBQUksRUFBRSxFQUFFO1lBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNMLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzNCLENBQUMsQ0FBQTtRQUNELFFBQVEsR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNOLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzNCLENBQUMsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWxDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUyxDQUFBO0lBQzNCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUyxDQUFBO0lBRTFCLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsRUFBRTtRQUMzQixPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBTyxFQUFFLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ25CLENBQUMsQ0FBQTtLQUNGO0lBRUQsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7SUFFeEIsT0FBTyxPQUFxQixDQUFBO0FBQzlCLENBQUM7QUFFRCxlQUFlLE1BQU0sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElGdXR1cmU8VD4gPSBQcm9taXNlPFQ+ICYge1xuICByZXNvbHZlOiAoeDogVCkgPT4gdm9pZFxuICByZWplY3Q6ICh4OiBFcnJvcikgPT4gdm9pZFxuICBmaW5hbGx5OiAoZm46ICgpID0+IHZvaWQpID0+IHZvaWRcbiAgaXNQZW5kaW5nOiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmdXR1cmU8VCA9IGFueT4oKTogSUZ1dHVyZTxUPiB7XG4gIGxldCByZXNvbHZlcjogKHg6IFQpID0+IHZvaWRcbiAgbGV0IHJlamVjdGVyOiAoeDogRXJyb3IpID0+IHZvaWRcblxuICBjb25zdCBwcm9taXNlOiBhbnkgPSBuZXcgUHJvbWlzZSgob2ssIGVycikgPT4ge1xuICAgIHJlc29sdmVyID0gKHg6IFQpID0+IHtcbiAgICAgIG9rKHgpXG4gICAgICBwcm9taXNlLmlzUGVuZGluZyA9IGZhbHNlXG4gICAgfVxuICAgIHJlamVjdGVyID0gKHg6IEVycm9yKSA9PiB7XG4gICAgICBlcnIoeClcbiAgICAgIHByb21pc2UuaXNQZW5kaW5nID0gZmFsc2VcbiAgICB9XG4gIH0pLmNhdGNoKChlKSA9PiBQcm9taXNlLnJlamVjdChlKSlcblxuICBwcm9taXNlLnJlc29sdmUgPSByZXNvbHZlciFcbiAgcHJvbWlzZS5yZWplY3QgPSByZWplY3RlciFcblxuICBpZiAoISgnZmluYWxseScgaW4gcHJvbWlzZSkpIHtcbiAgICBwcm9taXNlLmZpbmFsbHkgPSAoZm46IGFueSkgPT4ge1xuICAgICAgcHJvbWlzZS50aGVuKGZuKVxuICAgICAgcHJvbWlzZS5jYXRjaChmbilcbiAgICB9XG4gIH1cblxuICBwcm9taXNlLmlzUGVuZGluZyA9IHRydWVcblxuICByZXR1cm4gcHJvbWlzZSBhcyBJRnV0dXJlPFQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1dHVyZVxuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * Chunks CRDT messages from a Uint8Array buffer, respecting message boundaries
3
- * Uses the comprehensive readMessages function that handles all message types
4
- */
5
- export declare function chunkCrdtMessages(data: Uint8Array, maxSizeKB?: number): Uint8Array[];
@@ -1,38 +0,0 @@
1
- import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
2
- import { readMessages } from './server/utils';
3
- /**
4
- * Chunks CRDT messages from a Uint8Array buffer, respecting message boundaries
5
- * Uses the comprehensive readMessages function that handles all message types
6
- */
7
- export function chunkCrdtMessages(data, maxSizeKB = 12) {
8
- if (data.length === 0) {
9
- return [];
10
- }
11
- const networkBuffer = new ReadWriteByteBuffer();
12
- const chunks = [];
13
- for (const message of readMessages(data)) {
14
- // Check if adding this message would exceed the size limit
15
- const currentBufferSize = networkBuffer.toBinary().byteLength;
16
- const messageSize = message.messageBuffer.byteLength;
17
- if ((currentBufferSize + messageSize) / 1024 > maxSizeKB) {
18
- // If the current buffer has content, save it as a chunk
19
- if (currentBufferSize > 0) {
20
- chunks.push(networkBuffer.toCopiedBinary());
21
- networkBuffer.resetBuffer();
22
- }
23
- // If the message itself is larger than the limit, skip it
24
- if (messageSize / 1024 > maxSizeKB) {
25
- console.error(`Message too large (${messageSize} bytes), skipping CRDT message`);
26
- continue;
27
- }
28
- }
29
- // Add message to current buffer
30
- networkBuffer.writeBuffer(message.messageBuffer, false);
31
- }
32
- // Add any remaining data as the final chunk
33
- if (networkBuffer.currentWriteOffset() > 0) {
34
- chunks.push(networkBuffer.toBinary());
35
- }
36
- return chunks;
37
- }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2h1bmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9jaHVua2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFN0M7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQWdCLEVBQUUsWUFBb0IsRUFBRTtJQUN4RSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sRUFBRSxDQUFBO0tBQ1Y7SUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7SUFDL0MsTUFBTSxNQUFNLEdBQWlCLEVBQUUsQ0FBQTtJQUUvQixLQUFLLE1BQU0sT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN4QywyREFBMkQ7UUFDM0QsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFBO1FBQzdELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFBO1FBRXBELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxFQUFFO1lBQ3hELHdEQUF3RDtZQUN4RCxJQUFJLGlCQUFpQixHQUFHLENBQUMsRUFBRTtnQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtnQkFDM0MsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFBO2FBQzVCO1lBRUQsMERBQTBEO1lBQzFELElBQUksV0FBVyxHQUFHLElBQUksR0FBRyxTQUFTLEVBQUU7Z0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFdBQVcsZ0NBQWdDLENBQUMsQ0FBQTtnQkFDaEYsU0FBUTthQUNUO1NBQ0Y7UUFFRCxnQ0FBZ0M7UUFDaEMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0tBQ3hEO0lBRUQsNENBQTRDO0lBQzVDLElBQUksYUFBYSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7S0FDdEM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkV3JpdGVCeXRlQnVmZmVyIH0gZnJvbSAnQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInXG5pbXBvcnQgeyByZWFkTWVzc2FnZXMgfSBmcm9tICcuL3NlcnZlci91dGlscydcblxuLyoqXG4gKiBDaHVua3MgQ1JEVCBtZXNzYWdlcyBmcm9tIGEgVWludDhBcnJheSBidWZmZXIsIHJlc3BlY3RpbmcgbWVzc2FnZSBib3VuZGFyaWVzXG4gKiBVc2VzIHRoZSBjb21wcmVoZW5zaXZlIHJlYWRNZXNzYWdlcyBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYWxsIG1lc3NhZ2UgdHlwZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNodW5rQ3JkdE1lc3NhZ2VzKGRhdGE6IFVpbnQ4QXJyYXksIG1heFNpemVLQjogbnVtYmVyID0gMTIpOiBVaW50OEFycmF5W10ge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW11cblxuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcmVhZE1lc3NhZ2VzKGRhdGEpKSB7XG4gICAgLy8gQ2hlY2sgaWYgYWRkaW5nIHRoaXMgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHNpemUgbGltaXRcbiAgICBjb25zdCBjdXJyZW50QnVmZmVyU2l6ZSA9IG5ldHdvcmtCdWZmZXIudG9CaW5hcnkoKS5ieXRlTGVuZ3RoXG4gICAgY29uc3QgbWVzc2FnZVNpemUgPSBtZXNzYWdlLm1lc3NhZ2VCdWZmZXIuYnl0ZUxlbmd0aFxuXG4gICAgaWYgKChjdXJyZW50QnVmZmVyU2l6ZSArIG1lc3NhZ2VTaXplKSAvIDEwMjQgPiBtYXhTaXplS0IpIHtcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IGJ1ZmZlciBoYXMgY29udGVudCwgc2F2ZSBpdCBhcyBhIGNodW5rXG4gICAgICBpZiAoY3VycmVudEJ1ZmZlclNpemUgPiAwKSB7XG4gICAgICAgIGNodW5rcy5wdXNoKG5ldHdvcmtCdWZmZXIudG9Db3BpZWRCaW5hcnkoKSlcbiAgICAgICAgbmV0d29ya0J1ZmZlci5yZXNldEJ1ZmZlcigpXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQsIHNraXAgaXRcbiAgICAgIGlmIChtZXNzYWdlU2l6ZSAvIDEwMjQgPiBtYXhTaXplS0IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZVNpemV9IGJ5dGVzKSwgc2tpcHBpbmcgQ1JEVCBtZXNzYWdlYClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgbWVzc2FnZSB0byBjdXJyZW50IGJ1ZmZlclxuICAgIG5ldHdvcmtCdWZmZXIud3JpdGVCdWZmZXIobWVzc2FnZS5tZXNzYWdlQnVmZmVyLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIGRhdGEgYXMgdGhlIGZpbmFsIGNodW5rXG4gIGlmIChuZXR3b3JrQnVmZmVyLmN1cnJlbnRXcml0ZU9mZnNldCgpID4gMCkge1xuICAgIGNodW5rcy5wdXNoKG5ldHdvcmtCdWZmZXIudG9CaW5hcnkoKSlcbiAgfVxuXG4gIHJldHVybiBjaHVua3Ncbn1cbiJdfQ==
@@ -1,93 +0,0 @@
1
- import { IEngine } from '@dcl/ecs';
2
- import { EventTypes, EventSchemaRegistry } from './registry';
3
- import { Atom } from '../../atom';
4
- export type EventContext = {
5
- from: string;
6
- };
7
- export type EventCallback<T> = (data: T, context?: EventContext) => void;
8
- export type SendOptions = {
9
- to?: string[];
10
- };
11
- export declare class Room<T extends EventSchemaRegistry = EventSchemaRegistry> {
12
- private listeners;
13
- private binaryMessageBus;
14
- private isServerFuture;
15
- private isRoomReadyAtom;
16
- private messageQueue;
17
- private isProcessingQueue;
18
- constructor(_engine: IEngine, binaryMessageBus: any, isServerFn: Atom<boolean>, isRoomReadyAtom: Atom<boolean>);
19
- /**
20
- * Flush queued messages when room becomes ready
21
- */
22
- private flushMessageQueue;
23
- /**
24
- * Send an event
25
- * @param eventType - The type of event from the registry
26
- * @param data - The event data matching the schema
27
- * @param options - Optional send options (server only)
28
- *
29
- * Messages are automatically queued if the room is not ready and sent once connected.
30
- */
31
- send<K extends keyof T>(eventType: K, data: EventTypes<T>[K], options?: SendOptions): Promise<void>;
32
- /**
33
- * Listen for an event
34
- * @param eventType - The type of event to listen for
35
- * @param callback - Callback to handle the event
36
- * @returns Unsubscribe function
37
- */
38
- onMessage<K extends keyof T>(eventType: K, callback: EventCallback<EventTypes<T>[K]>): () => void;
39
- /**
40
- * Remove all listeners for a specific event type
41
- * @param eventType - The type of event to clear listeners for
42
- */
43
- clear<K extends keyof T>(eventType?: K): void;
44
- /**
45
- * Get the number of listeners for an event type
46
- * @param eventType - The type of event to check
47
- * @returns Number of registered listeners
48
- */
49
- listenerCount<K extends keyof T>(eventType: K): number;
50
- /**
51
- * Check if the room is ready to send messages
52
- * @returns true if messages will be sent immediately, false if they will be queued
53
- */
54
- isReady(): boolean;
55
- /**
56
- * Subscribe to room readiness changes
57
- * @param callback - Called when room becomes ready or disconnected
58
- * @returns Unsubscribe function
59
- *
60
- * @example
61
- * ```ts
62
- * const unsubscribe = room.onReady((isReady) => {
63
- * if (isReady) {
64
- * console.log('Room connected!')
65
- * } else {
66
- * console.log('Room disconnected')
67
- * }
68
- * })
69
- *
70
- * // Later: unsubscribe()
71
- * ```
72
- */
73
- onReady(callback: (isReady: boolean) => void): () => void;
74
- }
75
- /**
76
- * Register message schemas for use with the room
77
- * Call this before main() to define your custom messages
78
- * @param messages - Object containing your message schemas
79
- * @returns Typed room instance for your registered messages
80
- */
81
- export declare function registerMessages<T extends EventSchemaRegistry>(messages: T): Room<T>;
82
- /**
83
- * Get a typed version of the global room
84
- * Use this when you want the room with your specific message types
85
- *
86
- * @example
87
- * ```typescript
88
- * const MyMessages = { ... }
89
- * registerMessages(MyMessages) // Register first
90
- * const room = getRoom<typeof MyMessages>() // Then get typed version
91
- * ```
92
- */
93
- export declare function getRoom<T extends EventSchemaRegistry>(): Room<T>;