@spearwolf/shadow-objects 0.30.2 → 0.32.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.
- package/CHANGELOG.md +23 -1
- package/bundle.js +13 -13
- package/package.json +3 -3
- package/src/bundle.js +4 -4
- package/src/bundle.js.map +7 -1
- package/src/constants.js +53 -40
- package/src/constants.js.map +7 -1
- package/src/create-worker.bundle.js +6 -8
- package/src/create-worker.bundle.js.map +7 -1
- package/src/create-worker.js +5 -2
- package/src/create-worker.js.map +7 -1
- package/src/elements/ShaeElement.js +57 -54
- package/src/elements/ShaeElement.js.map +7 -1
- package/src/elements/ShaeEntElement.d.ts.map +1 -1
- package/src/elements/ShaeEntElement.js +320 -341
- package/src/elements/ShaeEntElement.js.map +7 -1
- package/src/elements/ShaePropElement.js +312 -320
- package/src/elements/ShaePropElement.js.map +7 -1
- package/src/elements/ShaeWorkerElement.js +234 -229
- package/src/elements/ShaeWorkerElement.js.map +7 -1
- package/src/elements/constants.js +37 -22
- package/src/elements/constants.js.map +7 -1
- package/src/elements/events.d.ts +1 -1
- package/src/elements/events.d.ts.map +1 -1
- package/src/elements/events.js +1 -2
- package/src/elements/events.js.map +7 -1
- package/src/elements.js +4 -4
- package/src/elements.js.map +7 -1
- package/src/in-the-dark/Entity.d.ts +1 -1
- package/src/in-the-dark/Entity.d.ts.map +1 -1
- package/src/in-the-dark/Entity.js +299 -293
- package/src/in-the-dark/Entity.js.map +7 -1
- package/src/in-the-dark/Kernel.d.ts.map +1 -1
- package/src/in-the-dark/Kernel.js +556 -533
- package/src/in-the-dark/Kernel.js.map +7 -1
- package/src/in-the-dark/Registry.d.ts.map +1 -1
- package/src/in-the-dark/Registry.js +101 -104
- package/src/in-the-dark/Registry.js.map +7 -1
- package/src/in-the-dark/ShadowObject.d.ts.map +1 -1
- package/src/in-the-dark/ShadowObject.js +21 -23
- package/src/in-the-dark/ShadowObject.js.map +7 -1
- package/src/in-the-dark/SignalsPath.d.ts.map +1 -1
- package/src/in-the-dark/SignalsPath.js +139 -123
- package/src/in-the-dark/SignalsPath.js.map +7 -1
- package/src/in-the-dark/events.js +11 -9
- package/src/in-the-dark/events.js.map +7 -1
- package/src/in-the-dark/importModule.js +31 -29
- package/src/in-the-dark/importModule.js.map +7 -1
- package/src/index.d.ts +2 -2
- package/src/index.d.ts.map +1 -1
- package/src/index.js +14 -14
- package/src/index.js.map +7 -1
- package/src/shadow-objects.js +6 -6
- package/src/shadow-objects.js.map +7 -1
- package/src/shadow-objects.worker.js +3 -3
- package/src/shadow-objects.worker.js.map +7 -1
- package/src/shae-ent.js +3 -3
- package/src/shae-ent.js.map +7 -1
- package/src/shae-prop.js +3 -3
- package/src/shae-prop.js.map +7 -1
- package/src/shae-worker.js +3 -3
- package/src/shae-worker.js.map +7 -1
- package/src/types.d.ts +3 -2
- package/src/types.d.ts.map +1 -1
- package/src/types.js +1 -2
- package/src/types.js.map +7 -1
- package/src/utils/ConsoleLogger.js +179 -185
- package/src/utils/ConsoleLogger.js.map +7 -1
- package/src/utils/FrameLoop.js +41 -40
- package/src/utils/FrameLoop.js.map +7 -1
- package/src/utils/array-utils.js +22 -24
- package/src/utils/array-utils.js.map +7 -1
- package/src/utils/attr-utils.js +15 -11
- package/src/utils/attr-utils.js.map +7 -1
- package/src/utils/constants.js +5 -2
- package/src/utils/constants.js.map +7 -1
- package/src/utils/generateUUID.d.ts.map +1 -1
- package/src/utils/generateUUID.js +269 -32
- package/src/utils/generateUUID.js.map +7 -1
- package/src/utils/props-utils.js +34 -43
- package/src/utils/props-utils.js.map +7 -1
- package/src/utils/toMaybe.js +5 -2
- package/src/utils/toMaybe.js.map +7 -1
- package/src/utils/toNamespace.js +6 -3
- package/src/utils/toNamespace.js.map +7 -1
- package/src/utils/toUrlString.js +9 -6
- package/src/utils/toUrlString.js.map +7 -1
- package/src/utils/waitForMessageOfType.js +30 -32
- package/src/utils/waitForMessageOfType.js.map +7 -1
- package/src/view/ComponentChanges.d.ts +1 -1
- package/src/view/ComponentChanges.d.ts.map +1 -1
- package/src/view/ComponentChanges.js +249 -251
- package/src/view/ComponentChanges.js.map +7 -1
- package/src/view/ComponentContext.d.ts.map +1 -1
- package/src/view/ComponentContext.js +303 -331
- package/src/view/ComponentContext.js.map +7 -1
- package/src/view/ComponentMemory.d.ts +1 -0
- package/src/view/ComponentMemory.d.ts.map +1 -1
- package/src/view/ComponentMemory.js +73 -76
- package/src/view/ComponentMemory.js.map +7 -1
- package/src/view/IShadowObjectEnvProxy.js +1 -2
- package/src/view/IShadowObjectEnvProxy.js.map +7 -1
- package/src/view/LocalShadowObjectEnv.d.ts.map +1 -1
- package/src/view/LocalShadowObjectEnv.js +57 -52
- package/src/view/LocalShadowObjectEnv.js.map +7 -1
- package/src/view/RemoteWorkerEnv.js +134 -123
- package/src/view/RemoteWorkerEnv.js.map +7 -1
- package/src/view/ShadowEnv.d.ts.map +1 -1
- package/src/view/ShadowEnv.js +232 -228
- package/src/view/ShadowEnv.js.map +7 -1
- package/src/view/ViewComponent.d.ts +9 -0
- package/src/view/ViewComponent.d.ts.map +1 -1
- package/src/view/ViewComponent.js +142 -130
- package/src/view/ViewComponent.js.map +7 -1
- package/src/view/cloneChangeTrail.js +13 -11
- package/src/view/cloneChangeTrail.js.map +7 -1
- package/src/worker/MessageRouter.d.ts.map +1 -1
- package/src/worker/MessageRouter.js +78 -67
- package/src/worker/MessageRouter.js.map +7 -1
- package/src/worker/WorkerRuntime.js +22 -21
- package/src/worker/WorkerRuntime.js.map +7 -1
- package/tsconfig.lib.tsbuildinfo +0 -1
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/elements/ShaePropElement.ts"],
|
|
4
|
+
"sourcesContent": ["import {batch, createEffect, createSignal, link} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {TRUTHY_VALUES} from '../utils/constants.js';\nimport type {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_NAME, ATTR_NO_TRIM, ATTR_TYPE, ATTR_VALUE} from './constants.js';\nimport type {ShaeEntElement} from './ShaeEntElement.js';\n\nconst findEntNode = (start: HTMLElement): ShaeEntElement | undefined => {\n let el: HTMLElement | null = start.parentElement;\n while (el) {\n if ((el as ShaeEntElement).isShaeEntElement) {\n return el as ShaeEntElement;\n }\n el = el.parentElement;\n }\n return undefined;\n};\n\nconst TYPES = new Set([\n 'string',\n 'text',\n 'number',\n 'bigint',\n 'float',\n 'int',\n 'integer',\n 'hex',\n 'hexadecimal',\n 'oct',\n 'octal',\n 'bin',\n 'binary',\n 'bool',\n 'boolean',\n '[]',\n 'text[]',\n 'string[]',\n 'number[]',\n 'float[]',\n 'int[]',\n 'integer[]',\n 'hex[]',\n 'hexadecimal[]',\n 'oct[]',\n 'octal[]',\n 'bin[]',\n 'binary[]',\n 'bool[]',\n 'boolean[]',\n 'int8array',\n 'uint8array',\n 'uint8clampedarray',\n 'int16array',\n 'uint16array',\n 'int32array',\n 'uint32array',\n 'float32array',\n 'float64array',\n 'bigint64array',\n 'biguint64array',\n 'json',\n]);\n\nexport class ShaePropElement extends HTMLElement {\n static observedAttributes = [ATTR_NAME, ATTR_VALUE, ATTR_TYPE, ATTR_NO_TRIM];\n\n readonly isShaeEntElement = true;\n\n protected readonly entNode$ = createSignal<ShaeEntElement | undefined>();\n protected readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n\n protected readonly name$ = createSignal<string | undefined>();\n protected readonly valueIn$ = createSignal();\n protected readonly valueOut$ = createSignal();\n protected readonly type$ = createSignal<string | undefined>();\n protected readonly shouldTrim$ = createSignal(true);\n\n protected readonly logger = new ConsoleLogger('ShaePropElement');\n\n get name(): string | undefined {\n return this.name$.value;\n }\n\n get value(): unknown {\n return this.valueOut$.value;\n }\n\n set value(val: unknown) {\n this.valueIn$.set(val);\n }\n\n get shouldTrim(): boolean {\n return this.shouldTrim$.value;\n }\n\n get entNode(): ShaeEntElement | undefined {\n return this.entNode$.value;\n }\n\n set entNode(el: ShaeEntElement | undefined) {\n this.entNode$.set(el);\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n constructor() {\n super();\n\n this.entNode$.onChange((entNode) => {\n if (entNode) {\n const con = link(entNode.viewComponent$, this.viewComponent$);\n return () => {\n con.destroy();\n };\n } else {\n this.viewComponent$.set(undefined);\n }\n });\n\n // this.viewComponent$.onChange((vc) => {\n // if (vc) {\n // console.log(`[shae-prop:\"${this.name}\"] view-component changed to`, vc?.uuid, {\n // viewComponent: vc,\n // shaeProp: this,\n // });\n // } else {\n // console.log(`[shae-prop:\"${this.name}\"] lost connection to view-component :/`, {\n // shaeProp: this,\n // });\n // }\n // });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const name = this.name$.get();\n if (name) {\n const value = this.valueOut$.get();\n\n if (this.logger.isDebug) {\n this.logger.debug(`[${this.name}] view-component set-property`, name, value, vc.uuid, {\n viewComponent: vc,\n shaeProp: this,\n });\n }\n\n vc.setProperty(name, value);\n\n if (this.isConnected) {\n this.entNode?.syncShadowObjects();\n }\n }\n }\n });\n\n createEffect(() => {\n const type = this.type$.get();\n const shouldTrim = this.shouldTrim$.get();\n let value = this.valueIn$.get();\n\n if (shouldTrim && typeof value === 'string') {\n value = value.trim();\n }\n\n value = value || undefined;\n\n if (value != null && typeof value === 'string' && type) {\n switch (type) {\n case 'string':\n case 'text':\n break;\n\n case 'number':\n value = Number(value);\n break;\n\n case 'bigint':\n value = BigInt(value);\n break;\n\n case 'float':\n value = parseFloat(value);\n break;\n\n case 'int':\n case 'integer':\n value = parseInt(value, 10);\n break;\n\n case 'hex':\n case 'hexadecimal':\n value = parseInt(value, 16);\n break;\n\n case 'oct':\n case 'octal':\n value = parseInt(value, 8);\n break;\n\n case 'bin':\n case 'binary':\n value = parseInt(value, 2);\n break;\n\n case 'bool':\n case 'boolean':\n value = TRUTHY_VALUES.has(value.toLowerCase());\n break;\n\n case '[]':\n case 'text[]':\n case 'string[]':\n value = value.split(/\\W+/);\n break;\n\n case 'number[]':\n value = value.split(/\\s+/).map((v) => Number(v));\n break;\n\n case 'float[]':\n value = value.split(/\\s+/).map((v) => parseFloat(v));\n break;\n\n case 'int[]':\n case 'integer[]':\n value = value.split(/\\s+/).map((v) => parseInt(v));\n break;\n\n case 'hex[]':\n case 'hexadecimal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 16));\n break;\n\n case 'oct[]':\n case 'octal[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 8));\n break;\n\n case 'bin[]':\n case 'binary[]':\n value = value.split(/\\W+/).map((v) => parseInt(v, 2));\n break;\n\n case 'bool[]':\n case 'boolean[]':\n value = value.split(/\\W+/).map((v) => TRUTHY_VALUES.has(v.toLowerCase()));\n break;\n\n case 'int8array':\n value = new Int8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8array':\n value = new Uint8Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint8clampedarray':\n value = new Uint8ClampedArray(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int16array':\n value = new Int16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint16array':\n value = new Uint16Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'int32array':\n value = new Int32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'uint32array':\n value = new Uint32Array(value.split(/\\W+/).map((v) => Number(v)));\n break;\n\n case 'float32array':\n value = new Float32Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'float64array':\n value = new Float64Array(value.split(/\\s+/).map((v) => Number(v)));\n break;\n\n case 'bigint64array':\n value = new BigInt64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'biguint64array':\n value = new BigUint64Array(value.split(/\\W+/).map((v) => BigInt(v)));\n break;\n\n case 'json':\n value = JSON.parse(value);\n break;\n\n default:\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n value,\n shaeProp: this,\n });\n }\n }\n }\n\n this.valueOut$.set(value);\n });\n\n batch(() => {\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n\n this.style.display = 'contents';\n }\n\n connectedCallback() {\n batch(() => {\n this.#findEntNode();\n this.#readNameAttribute();\n this.#readValueAttribute();\n this.#readTypeAttribute();\n this.#readNoTrimAttribute();\n });\n }\n\n attributeChangedCallback(name: string) {\n switch (name) {\n case ATTR_NAME:\n this.#readNameAttribute();\n break;\n\n case ATTR_VALUE:\n this.#readValueAttribute();\n break;\n\n case ATTR_TYPE:\n this.#readTypeAttribute();\n break;\n\n case ATTR_NO_TRIM:\n this.#readNoTrimAttribute();\n break;\n }\n }\n\n disconnectedCallback() {\n this.#disconnectFromEntNode();\n }\n\n #findEntNode = () => {\n this.entNode$.set(findEntNode(this));\n };\n\n #disconnectFromEntNode = () => {\n queueMicrotask(() => {\n if (!this.isConnected) {\n this.entNode$.set(undefined);\n }\n });\n };\n\n #readNameAttribute = () => {\n this.name$.set(this.getAttribute(ATTR_NAME)?.trim() ?? undefined);\n };\n\n #readValueAttribute = () => {\n this.valueIn$.set(this.getAttribute(ATTR_VALUE));\n };\n\n #readTypeAttribute = () => {\n let type = this.getAttribute(ATTR_TYPE)?.trim().toLowerCase();\n if (type && !TYPES.has(type)) {\n if (this.logger.isWarn) {\n this.logger.warn(`[${this.name}] unknown type \"${type}\"`, {\n shaeProp: this,\n });\n }\n type = undefined;\n }\n this.type$.set(type);\n };\n\n #readNoTrimAttribute = () => {\n this.shouldTrim$.set(!readBooleanAttribute(this, ATTR_NO_TRIM));\n };\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,236 +1,241 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
bubbles: false,
|
|
51
|
-
detail: { shadowEnv: this.shadowEnv },
|
|
52
|
-
}));
|
|
53
|
-
});
|
|
54
|
-
this.autoSync$.onChange((sVal) => {
|
|
55
|
-
const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);
|
|
56
|
-
const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : undefined;
|
|
57
|
-
if (sVal === _a.DefaultAutoSync) {
|
|
58
|
-
if (hasAttr && attrVal !== sVal) {
|
|
59
|
-
this.setAttribute(ATTR_AUTO_SYNC, sVal);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else if (attrVal !== sVal) {
|
|
63
|
-
this.setAttribute(ATTR_AUTO_SYNC, sVal);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
this.#createAutoSyncEffect();
|
|
67
|
-
this.#createImportScriptEffect();
|
|
68
|
-
this.style.display = 'contents';
|
|
69
|
-
}
|
|
70
|
-
#createImportScriptEffect() {
|
|
71
|
-
this.#importScript = createEffect(() => {
|
|
72
|
-
const src = this.src$.get();
|
|
73
|
-
if (src) {
|
|
74
|
-
this.importScript(src);
|
|
75
|
-
}
|
|
76
|
-
}, { autorun: false });
|
|
77
|
-
}
|
|
78
|
-
get shouldAutostart() {
|
|
79
|
-
return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);
|
|
80
|
-
}
|
|
81
|
-
get autoSync() {
|
|
82
|
-
return this.autoSync$.value;
|
|
83
|
-
}
|
|
84
|
-
set autoSync(val) {
|
|
85
|
-
if (typeof val !== 'string') {
|
|
86
|
-
val = val ? _a.DefaultAutoSync : 'no';
|
|
1
|
+
import { on } from "@spearwolf/eventize";
|
|
2
|
+
import { batch, createEffect, createSignal, destroySignal, Effect } from "@spearwolf/signalize";
|
|
3
|
+
import { readBooleanAttribute } from "../utils/attr-utils.js";
|
|
4
|
+
import { ConsoleLogger } from "../utils/ConsoleLogger.js";
|
|
5
|
+
import { FrameLoop } from "../utils/FrameLoop.js";
|
|
6
|
+
import { ComponentContext } from "../view/ComponentContext.js";
|
|
7
|
+
import { LocalShadowObjectEnv } from "../view/LocalShadowObjectEnv.js";
|
|
8
|
+
import { RemoteWorkerEnv } from "../view/RemoteWorkerEnv.js";
|
|
9
|
+
import { ShadowEnv } from "../view/ShadowEnv.js";
|
|
10
|
+
import { ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC } from "./constants.js";
|
|
11
|
+
import { ShaeElement } from "./ShaeElement.js";
|
|
12
|
+
class ShaeWorkerElement extends ShaeElement {
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
this.isShaeWorkerElement = true;
|
|
16
|
+
this.shadowEnv = new ShadowEnv();
|
|
17
|
+
this.logger = new ConsoleLogger("ShaeWorkerElement");
|
|
18
|
+
this.autostart = true;
|
|
19
|
+
this.isConnected$ = createSignal(false);
|
|
20
|
+
this.autoSync$ = createSignal(ShaeWorkerElement.DefaultAutoSync);
|
|
21
|
+
this.src$ = createSignal("");
|
|
22
|
+
this.#shouldDestroy = false;
|
|
23
|
+
this.#started = false;
|
|
24
|
+
this.ns$.onChange((ns) => {
|
|
25
|
+
this.shadowEnv.view = ComponentContext.get(ns);
|
|
26
|
+
});
|
|
27
|
+
on(this.shadowEnv, ShadowEnv.ContextCreated, () => {
|
|
28
|
+
this.#importScript?.run();
|
|
29
|
+
this.dispatchEvent(
|
|
30
|
+
new CustomEvent(ShadowEnv.ContextCreated.toLowerCase(), {
|
|
31
|
+
bubbles: false,
|
|
32
|
+
detail: { shadowEnv: this.shadowEnv }
|
|
33
|
+
})
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
on(this.shadowEnv, ShadowEnv.ContextLost, () => {
|
|
37
|
+
this.dispatchEvent(
|
|
38
|
+
new CustomEvent(ShadowEnv.ContextLost.toLowerCase(), {
|
|
39
|
+
bubbles: false,
|
|
40
|
+
detail: { shadowEnv: this.shadowEnv }
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
this.autoSync$.onChange((sVal) => {
|
|
45
|
+
const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);
|
|
46
|
+
const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : void 0;
|
|
47
|
+
if (sVal === ShaeWorkerElement.DefaultAutoSync) {
|
|
48
|
+
if (hasAttr && attrVal !== sVal) {
|
|
49
|
+
this.setAttribute(ATTR_AUTO_SYNC, sVal);
|
|
87
50
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
51
|
+
} else if (attrVal !== sVal) {
|
|
52
|
+
this.setAttribute(ATTR_AUTO_SYNC, sVal);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
this.#createAutoSyncEffect();
|
|
56
|
+
this.#createImportScriptEffect();
|
|
57
|
+
this.style.display = "contents";
|
|
58
|
+
}
|
|
59
|
+
static {
|
|
60
|
+
this.observedAttributes = [
|
|
61
|
+
...ShaeElement.observedAttributes,
|
|
62
|
+
ATTR_LOCAL,
|
|
63
|
+
ATTR_SRC,
|
|
64
|
+
ATTR_NO_STRUCTURED_CLONE,
|
|
65
|
+
ATTR_AUTO_SYNC
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
static {
|
|
69
|
+
this.DefaultAutoSync = "frame";
|
|
70
|
+
}
|
|
71
|
+
#shouldDestroy;
|
|
72
|
+
#started;
|
|
73
|
+
#frameLoop;
|
|
74
|
+
#autoSync;
|
|
75
|
+
#importScript;
|
|
76
|
+
#createImportScriptEffect() {
|
|
77
|
+
this.#importScript = createEffect(
|
|
78
|
+
() => {
|
|
79
|
+
const src = this.src$.get();
|
|
80
|
+
if (src) {
|
|
81
|
+
this.importScript(src);
|
|
103
82
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
83
|
+
},
|
|
84
|
+
{ autorun: false }
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
get shouldAutostart() {
|
|
88
|
+
return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);
|
|
89
|
+
}
|
|
90
|
+
get autoSync() {
|
|
91
|
+
return this.autoSync$.value;
|
|
92
|
+
}
|
|
93
|
+
set autoSync(val) {
|
|
94
|
+
if (typeof val !== "string") {
|
|
95
|
+
val = val ? ShaeWorkerElement.DefaultAutoSync : "no";
|
|
96
|
+
}
|
|
97
|
+
this.autoSync$.set(`${val}`.trim().toLowerCase());
|
|
98
|
+
}
|
|
99
|
+
get frameLoop() {
|
|
100
|
+
this.#frameLoop ??= new FrameLoop();
|
|
101
|
+
return this.#frameLoop;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The frameLoop (if activated) calls this method on every frame
|
|
105
|
+
*/
|
|
106
|
+
[FrameLoop.OnFrame]() {
|
|
107
|
+
this.syncShadowObjects();
|
|
108
|
+
}
|
|
109
|
+
async importScript(src) {
|
|
110
|
+
if (!src) {
|
|
111
|
+
throw new Error("src is blank");
|
|
112
|
+
}
|
|
113
|
+
const shadowEnv = await this.shadowEnv.ready();
|
|
114
|
+
if (this.logger.isInfo) {
|
|
115
|
+
this.logger.info("shadowEnv importScript:", src, { shadowEnv });
|
|
116
|
+
}
|
|
117
|
+
await shadowEnv.envProxy.importScript(src);
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
connectedCallback() {
|
|
121
|
+
batch(() => {
|
|
122
|
+
if (this.hasAttribute(ATTR_AUTO_SYNC)) {
|
|
123
|
+
this.autoSync$.set(this.getAttribute(ATTR_AUTO_SYNC));
|
|
124
|
+
}
|
|
125
|
+
this.isConnected$.set(true);
|
|
126
|
+
});
|
|
127
|
+
if (this.shouldAutostart) {
|
|
128
|
+
this.start();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
disconnectedCallback() {
|
|
132
|
+
this.isConnected$.set(false);
|
|
133
|
+
this.#deferDestroy();
|
|
134
|
+
}
|
|
135
|
+
attributeChangedCallback(name) {
|
|
136
|
+
super.attributeChangedCallback(name);
|
|
137
|
+
if (name === ATTR_LOCAL) {
|
|
138
|
+
if (this.shadowEnv.envProxy != null) {
|
|
139
|
+
throw new Error('Changing the "local" attribute after the shadowEnv has been created is not supported.');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (name === ATTR_NO_STRUCTURED_CLONE) {
|
|
143
|
+
this.#disableStructuredClone();
|
|
144
|
+
}
|
|
145
|
+
if (name === ATTR_AUTO_SYNC) {
|
|
146
|
+
this.autoSync = this.hasAttribute(ATTR_AUTO_SYNC) ? this.getAttribute(ATTR_AUTO_SYNC) : true;
|
|
147
|
+
}
|
|
148
|
+
if (name === ATTR_SRC) {
|
|
149
|
+
const src = (this.getAttribute(ATTR_SRC) || "").trim();
|
|
150
|
+
this.src$.set(src);
|
|
151
|
+
if (this.shadowEnv.isReady) {
|
|
152
|
+
this.#importScript?.run();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
start() {
|
|
157
|
+
if (!this.#started) {
|
|
158
|
+
this.#shouldDestroy = false;
|
|
159
|
+
this.shadowEnv.view ??= ComponentContext.get(this.ns);
|
|
160
|
+
if (this.shadowEnv.envProxy == null) {
|
|
161
|
+
const envProxy = readBooleanAttribute(this, ATTR_LOCAL) ? new LocalShadowObjectEnv() : new RemoteWorkerEnv();
|
|
162
|
+
this.shadowEnv.envProxy = envProxy;
|
|
163
|
+
this.#disableStructuredClone();
|
|
164
|
+
}
|
|
165
|
+
this.#started = true;
|
|
166
|
+
}
|
|
167
|
+
return this.shadowEnv.ready();
|
|
168
|
+
}
|
|
169
|
+
destroy() {
|
|
170
|
+
this.#autoSync?.destroy();
|
|
171
|
+
this.#importScript?.destroy();
|
|
172
|
+
destroySignal(this.isConnected$, this.autoSync$, this.src$);
|
|
173
|
+
this.shadowEnv.envProxy = void 0;
|
|
174
|
+
this.shadowEnv.destroy();
|
|
175
|
+
}
|
|
176
|
+
#deferDestroy() {
|
|
177
|
+
if (!this.#shouldDestroy) {
|
|
178
|
+
this.#shouldDestroy = true;
|
|
179
|
+
queueMicrotask(() => {
|
|
180
|
+
if (this.#shouldDestroy) {
|
|
181
|
+
this.destroy();
|
|
107
182
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
#createAutoSyncEffect() {
|
|
187
|
+
this.#autoSync = createEffect(() => {
|
|
188
|
+
if (this.isConnected$.get()) {
|
|
189
|
+
const autoSync = (this.autoSync$.get() || ShaeWorkerElement.DefaultAutoSync).trim().toLowerCase();
|
|
190
|
+
let delay;
|
|
191
|
+
if (["true", "yes", "on", "frame", "auto-sync"].includes(autoSync)) {
|
|
192
|
+
if (this.logger.isDebug) {
|
|
193
|
+
this.logger.debug("auto-sync", autoSync, this);
|
|
194
|
+
}
|
|
195
|
+
this.frameLoop.start(this);
|
|
196
|
+
return () => {
|
|
197
|
+
this.frameLoop.stop(this);
|
|
198
|
+
};
|
|
199
|
+
} else if (autoSync.toLowerCase().endsWith("fps")) {
|
|
200
|
+
const fps = parseInt(autoSync, 10);
|
|
201
|
+
if (fps > 0) {
|
|
202
|
+
delay = Math.floor(1e3 / fps);
|
|
203
|
+
} else if (this.logger.isWarn) {
|
|
204
|
+
this.logger.warn(`invalid auto-sync value: ${autoSync}`);
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
delay = parseInt(autoSync, 10);
|
|
208
|
+
if (isNaN(delay)) {
|
|
209
|
+
delay = void 0;
|
|
210
|
+
if (!["false", "no", "off"].includes(autoSync)) {
|
|
211
|
+
this.logger.error(`invalid auto-sync value: ${autoSync}`);
|
|
131
212
|
}
|
|
213
|
+
}
|
|
132
214
|
}
|
|
133
|
-
if (
|
|
134
|
-
|
|
215
|
+
if (delay !== void 0 && delay > 0) {
|
|
216
|
+
if (this.logger.isDebug) {
|
|
217
|
+
this.logger.debug("auto-sync interval (ms)", delay, this);
|
|
218
|
+
}
|
|
219
|
+
const id = setInterval(() => {
|
|
220
|
+
this.syncShadowObjects();
|
|
221
|
+
}, delay);
|
|
222
|
+
return () => {
|
|
223
|
+
clearInterval(id);
|
|
224
|
+
};
|
|
225
|
+
} else if (this.logger.isDebug) {
|
|
226
|
+
this.logger.debug("auto-sync off", this);
|
|
135
227
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
start() {
|
|
148
|
-
if (!this.#started) {
|
|
149
|
-
this.#shouldDestroy = false;
|
|
150
|
-
this.shadowEnv.view ??= ComponentContext.get(this.ns);
|
|
151
|
-
if (this.shadowEnv.envProxy == null) {
|
|
152
|
-
const envProxy = readBooleanAttribute(this, ATTR_LOCAL) ? new LocalShadowObjectEnv() : new RemoteWorkerEnv();
|
|
153
|
-
this.shadowEnv.envProxy = envProxy;
|
|
154
|
-
this.#disableStructuredClone();
|
|
155
|
-
}
|
|
156
|
-
this.#started = true;
|
|
157
|
-
}
|
|
158
|
-
return this.shadowEnv.ready();
|
|
159
|
-
}
|
|
160
|
-
destroy() {
|
|
161
|
-
this.#autoSync?.destroy();
|
|
162
|
-
this.#importScript?.destroy();
|
|
163
|
-
destroySignal(this.isConnected$, this.autoSync$, this.src$);
|
|
164
|
-
this.shadowEnv.envProxy = undefined;
|
|
165
|
-
this.shadowEnv.destroy();
|
|
166
|
-
}
|
|
167
|
-
#deferDestroy() {
|
|
168
|
-
// NOTE The destruction is halted until the next microtask—but a reconnect (adding the element back to the DOM before the next microtask)
|
|
169
|
-
// cannot stop this process, and that's okay. Once destroyed, it's destroyed forever.
|
|
170
|
-
if (!this.#shouldDestroy) {
|
|
171
|
-
this.#shouldDestroy = true;
|
|
172
|
-
queueMicrotask(() => {
|
|
173
|
-
if (this.#shouldDestroy) {
|
|
174
|
-
this.destroy();
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
#createAutoSyncEffect() {
|
|
180
|
-
this.#autoSync = createEffect(() => {
|
|
181
|
-
if (this.isConnected$.get()) {
|
|
182
|
-
const autoSync = (this.autoSync$.get() || _a.DefaultAutoSync).trim().toLowerCase();
|
|
183
|
-
let delay = undefined;
|
|
184
|
-
if (['true', 'yes', 'on', 'frame', 'auto-sync'].includes(autoSync)) {
|
|
185
|
-
if (this.logger.isDebug) {
|
|
186
|
-
this.logger.debug('auto-sync', autoSync, this);
|
|
187
|
-
}
|
|
188
|
-
this.frameLoop.start(this);
|
|
189
|
-
return () => {
|
|
190
|
-
this.frameLoop.stop(this);
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
else if (autoSync.toLowerCase().endsWith('fps')) {
|
|
194
|
-
const fps = parseInt(autoSync, 10);
|
|
195
|
-
if (fps > 0) {
|
|
196
|
-
delay = Math.floor(1000 / fps);
|
|
197
|
-
}
|
|
198
|
-
else if (this.logger.isWarn) {
|
|
199
|
-
this.logger.warn(`invalid auto-sync value: ${autoSync}`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
delay = parseInt(autoSync, 10);
|
|
204
|
-
if (isNaN(delay)) {
|
|
205
|
-
delay = undefined;
|
|
206
|
-
if (!['false', 'no', 'off'].includes(autoSync)) {
|
|
207
|
-
this.logger.error(`invalid auto-sync value: ${autoSync}`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
if (delay !== undefined && delay > 0) {
|
|
212
|
-
if (this.logger.isDebug) {
|
|
213
|
-
this.logger.debug('auto-sync interval (ms)', delay, this);
|
|
214
|
-
}
|
|
215
|
-
const id = setInterval(() => {
|
|
216
|
-
this.syncShadowObjects();
|
|
217
|
-
}, delay);
|
|
218
|
-
return () => {
|
|
219
|
-
clearInterval(id);
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
else if (this.logger.isDebug) {
|
|
223
|
-
this.logger.debug('auto-sync off', this);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}, [this.autoSync$, this.isConnected$]);
|
|
227
|
-
}
|
|
228
|
-
#disableStructuredClone() {
|
|
229
|
-
const env = this.shadowEnv.envProxy;
|
|
230
|
-
if (env?.isLocalEnv) {
|
|
231
|
-
env.disableStructuredClone = this.hasAttribute(ATTR_NO_STRUCTURED_CLONE);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
228
|
+
}
|
|
229
|
+
}, [this.autoSync$, this.isConnected$]);
|
|
230
|
+
}
|
|
231
|
+
#disableStructuredClone() {
|
|
232
|
+
const env = this.shadowEnv.envProxy;
|
|
233
|
+
if (env?.isLocalEnv) {
|
|
234
|
+
env.disableStructuredClone = this.hasAttribute(ATTR_NO_STRUCTURED_CLONE);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
234
237
|
}
|
|
235
|
-
|
|
236
|
-
|
|
238
|
+
export {
|
|
239
|
+
ShaeWorkerElement
|
|
240
|
+
};
|
|
241
|
+
//# sourceMappingURL=ShaeWorkerElement.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/elements/ShaeWorkerElement.ts"],
|
|
4
|
+
"sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {batch, createEffect, createSignal, destroySignal, Effect} from '@spearwolf/signalize';\nimport {readBooleanAttribute} from '../utils/attr-utils.js';\nimport {ConsoleLogger} from '../utils/ConsoleLogger.js';\nimport {FrameLoop} from '../utils/FrameLoop.js';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {LocalShadowObjectEnv} from '../view/LocalShadowObjectEnv.js';\nimport {RemoteWorkerEnv} from '../view/RemoteWorkerEnv.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeWorkerElement extends ShaeElement {\n static override observedAttributes = [\n ...ShaeElement.observedAttributes,\n ATTR_LOCAL,\n ATTR_SRC,\n ATTR_NO_STRUCTURED_CLONE,\n ATTR_AUTO_SYNC,\n ];\n\n static DefaultAutoSync = 'frame';\n\n readonly isShaeWorkerElement = true;\n\n readonly shadowEnv = new ShadowEnv();\n\n readonly logger = new ConsoleLogger('ShaeWorkerElement');\n\n autostart = true;\n\n isConnected$ = createSignal(false);\n autoSync$ = createSignal(ShaeWorkerElement.DefaultAutoSync);\n src$ = createSignal('');\n\n #shouldDestroy = false;\n #started = false;\n\n #frameLoop?: FrameLoop;\n #autoSync?: Effect;\n #importScript?: Effect;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.shadowEnv.view = ComponentContext.get(ns);\n });\n\n on(this.shadowEnv, ShadowEnv.ContextCreated, () => {\n this.#importScript?.run();\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextCreated.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n on(this.shadowEnv, ShadowEnv.ContextLost, () => {\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ContextLost.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv},\n }),\n );\n });\n\n this.autoSync$.onChange((sVal) => {\n const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);\n const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : undefined;\n\n if (sVal === ShaeWorkerElement.DefaultAutoSync) {\n if (hasAttr && attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n } else if (attrVal !== sVal) {\n this.setAttribute(ATTR_AUTO_SYNC, sVal);\n }\n });\n\n this.#createAutoSyncEffect();\n this.#createImportScriptEffect();\n\n this.style.display = 'contents';\n }\n\n #createImportScriptEffect() {\n this.#importScript = createEffect(\n () => {\n const src = this.src$.get();\n if (src) {\n this.importScript(src);\n }\n },\n {autorun: false},\n );\n }\n\n get shouldAutostart(): boolean {\n return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);\n }\n\n get autoSync() {\n return this.autoSync$.value;\n }\n\n set autoSync(val: any) {\n if (typeof val !== 'string') {\n val = val ? ShaeWorkerElement.DefaultAutoSync : 'no';\n }\n this.autoSync$.set(`${val}`.trim().toLowerCase());\n }\n\n get frameLoop(): FrameLoop {\n this.#frameLoop ??= new FrameLoop();\n return this.#frameLoop;\n }\n\n /**\n * The frameLoop (if activated) calls this method on every frame\n */\n [FrameLoop.OnFrame]() {\n this.syncShadowObjects();\n }\n\n async importScript(src: URL | string): Promise<ShaeWorkerElement> {\n if (!src) {\n throw new Error('src is blank');\n }\n const shadowEnv = await this.shadowEnv.ready();\n if (this.logger.isInfo) {\n this.logger.info('shadowEnv importScript:', src, {shadowEnv});\n }\n await shadowEnv.envProxy.importScript(src);\n return this;\n }\n\n connectedCallback() {\n batch(() => {\n if (this.hasAttribute(ATTR_AUTO_SYNC)) {\n this.autoSync$.set(this.getAttribute(ATTR_AUTO_SYNC));\n }\n this.isConnected$.set(true);\n });\n if (this.shouldAutostart) {\n this.start();\n }\n }\n\n disconnectedCallback() {\n this.isConnected$.set(false);\n this.#deferDestroy();\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n\n if (name === ATTR_LOCAL) {\n if (this.shadowEnv.envProxy != null) {\n throw new Error('Changing the \"local\" attribute after the shadowEnv has been created is not supported.');\n }\n }\n\n if (name === ATTR_NO_STRUCTURED_CLONE) {\n this.#disableStructuredClone();\n }\n\n if (name === ATTR_AUTO_SYNC) {\n this.autoSync = this.hasAttribute(ATTR_AUTO_SYNC) ? this.getAttribute(ATTR_AUTO_SYNC) : true;\n }\n\n if (name === ATTR_SRC) {\n const src = (this.getAttribute(ATTR_SRC) || '').trim();\n this.src$.set(src);\n if (this.shadowEnv.isReady) {\n this.#importScript?.run();\n }\n }\n }\n\n start(): Promise<ShadowEnv> {\n if (!this.#started) {\n this.#shouldDestroy = false;\n\n this.shadowEnv.view ??= ComponentContext.get(this.ns);\n\n if (this.shadowEnv.envProxy == null) {\n const envProxy = readBooleanAttribute(this, ATTR_LOCAL) ? new LocalShadowObjectEnv() : new RemoteWorkerEnv();\n this.shadowEnv.envProxy = envProxy;\n this.#disableStructuredClone();\n }\n\n this.#started = true;\n }\n\n return this.shadowEnv.ready();\n }\n\n destroy() {\n this.#autoSync?.destroy();\n this.#importScript?.destroy();\n destroySignal(this.isConnected$, this.autoSync$, this.src$);\n this.shadowEnv.envProxy = undefined;\n this.shadowEnv.destroy();\n }\n\n #deferDestroy() {\n // NOTE The destruction is halted until the next microtask\u2014but a reconnect (adding the element back to the DOM before the next microtask)\n // cannot stop this process, and that's okay. Once destroyed, it's destroyed forever.\n if (!this.#shouldDestroy) {\n this.#shouldDestroy = true;\n queueMicrotask(() => {\n if (this.#shouldDestroy) {\n this.destroy();\n }\n });\n }\n }\n\n #createAutoSyncEffect() {\n this.#autoSync = createEffect(() => {\n if (this.isConnected$.get()) {\n const autoSync = (this.autoSync$.get() || ShaeWorkerElement.DefaultAutoSync).trim().toLowerCase();\n let delay;\n\n if (['true', 'yes', 'on', 'frame', 'auto-sync'].includes(autoSync)) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync', autoSync, this);\n }\n this.frameLoop.start(this);\n return () => {\n this.frameLoop.stop(this);\n };\n } else if (autoSync.toLowerCase().endsWith('fps')) {\n const fps = parseInt(autoSync, 10);\n if (fps > 0) {\n delay = Math.floor(1000 / fps);\n } else if (this.logger.isWarn) {\n this.logger.warn(`invalid auto-sync value: ${autoSync}`);\n }\n } else {\n delay = parseInt(autoSync, 10);\n if (isNaN(delay)) {\n delay = undefined;\n if (!['false', 'no', 'off'].includes(autoSync)) {\n this.logger.error(`invalid auto-sync value: ${autoSync}`);\n }\n }\n }\n\n if (delay !== undefined && delay > 0) {\n if (this.logger.isDebug) {\n this.logger.debug('auto-sync interval (ms)', delay, this);\n }\n const id = setInterval(() => {\n this.syncShadowObjects();\n }, delay);\n return () => {\n clearInterval(id);\n };\n } else if (this.logger.isDebug) {\n this.logger.debug('auto-sync off', this);\n }\n }\n }, [this.autoSync$, this.isConnected$]);\n }\n\n #disableStructuredClone() {\n const env = this.shadowEnv.envProxy as LocalShadowObjectEnv;\n if (env?.isLocalEnv) {\n env.disableStructuredClone = this.hasAttribute(ATTR_NO_STRUCTURED_CLONE);\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|