@spearwolf/shadow-objects 0.32.0 → 0.33.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 +64 -0
- package/README.md +49 -13
- package/bundle.js +7 -7
- package/package.json +2 -2
- package/src/elements/ShaeEntElement.d.ts +4 -4
- package/src/elements/ShaeEntElement.d.ts.map +1 -1
- package/src/elements/ShaeEntElement.js +4 -5
- package/src/elements/ShaeEntElement.js.map +2 -2
- package/src/elements/ShaePropElement.d.ts +5 -5
- package/src/elements/ShaePropElement.d.ts.map +1 -1
- package/src/elements/ShaePropElement.js +2 -2
- package/src/elements/ShaePropElement.js.map +2 -2
- package/src/elements/ShaeWorkerElement.d.ts.map +1 -1
- package/src/elements/ShaeWorkerElement.js +31 -6
- package/src/elements/ShaeWorkerElement.js.map +2 -2
- package/src/in-the-dark/Kernel.d.ts +5 -0
- package/src/in-the-dark/Kernel.d.ts.map +1 -1
- package/src/in-the-dark/Kernel.js +49 -24
- package/src/in-the-dark/Kernel.js.map +2 -2
- package/src/in-the-dark/Registry.d.ts +1 -1
- package/src/in-the-dark/Registry.d.ts.map +1 -1
- package/src/in-the-dark/Registry.js +24 -20
- package/src/in-the-dark/Registry.js.map +2 -2
- package/src/in-the-dark/ShadowObject.d.ts +1 -1
- package/src/in-the-dark/ShadowObject.d.ts.map +1 -1
- package/src/in-the-dark/ShadowObject.js +2 -2
- package/src/in-the-dark/ShadowObject.js.map +2 -2
- package/src/in-the-dark/SignalsPath.d.ts.map +1 -1
- package/src/in-the-dark/SignalsPath.js.map +2 -2
- package/src/in-the-dark/importModule.js +3 -3
- package/src/in-the-dark/importModule.js.map +2 -2
- package/src/types.d.ts +4 -4
- package/src/types.d.ts.map +1 -1
- package/src/utils/ConsoleLogger.d.ts.map +1 -1
- package/src/utils/ConsoleLogger.js +3 -2
- package/src/utils/ConsoleLogger.js.map +2 -2
- package/src/utils/FrameLoop.d.ts +1 -1
- package/src/utils/FrameLoop.d.ts.map +1 -1
- package/src/utils/FrameLoop.js +0 -2
- package/src/utils/FrameLoop.js.map +2 -2
- package/src/utils/attr-utils.d.ts.map +1 -1
- package/src/utils/attr-utils.js +1 -1
- package/src/utils/attr-utils.js.map +2 -2
- package/src/utils/generateUUID.d.ts +1 -1
- package/src/utils/generateUUID.d.ts.map +1 -1
- package/src/utils/props-utils.d.ts +1 -1
- package/src/utils/props-utils.d.ts.map +1 -1
- package/src/utils/waitForMessageOfType.d.ts +5 -1
- package/src/utils/waitForMessageOfType.d.ts.map +1 -1
- package/src/utils/waitForMessageOfType.js +12 -2
- package/src/utils/waitForMessageOfType.js.map +2 -2
- package/src/view/ComponentChanges.d.ts +4 -1
- package/src/view/ComponentChanges.d.ts.map +1 -1
- package/src/view/ComponentChanges.js +20 -6
- package/src/view/ComponentChanges.js.map +2 -2
- package/src/view/ComponentContext.d.ts +43 -1
- package/src/view/ComponentContext.d.ts.map +1 -1
- package/src/view/ComponentContext.js +123 -47
- package/src/view/ComponentContext.js.map +2 -2
- package/src/view/ComponentMemory.js +3 -1
- package/src/view/ComponentMemory.js.map +2 -2
- package/src/view/IShadowObjectEnvProxy.d.ts +6 -0
- package/src/view/IShadowObjectEnvProxy.d.ts.map +1 -1
- package/src/view/LocalShadowObjectEnv.d.ts +1 -1
- package/src/view/LocalShadowObjectEnv.d.ts.map +1 -1
- package/src/view/LocalShadowObjectEnv.js +11 -6
- package/src/view/LocalShadowObjectEnv.js.map +2 -2
- package/src/view/RemoteWorkerEnv.d.ts +42 -0
- package/src/view/RemoteWorkerEnv.d.ts.map +1 -1
- package/src/view/RemoteWorkerEnv.js +130 -18
- package/src/view/RemoteWorkerEnv.js.map +2 -2
- package/src/view/ShadowEnv.d.ts +25 -1
- package/src/view/ShadowEnv.d.ts.map +1 -1
- package/src/view/ShadowEnv.js +103 -29
- package/src/view/ShadowEnv.js.map +2 -2
- package/src/view/ViewComponent.d.ts +22 -1
- package/src/view/ViewComponent.d.ts.map +1 -1
- package/src/view/ViewComponent.js +66 -22
- package/src/view/ViewComponent.js.map +2 -2
- package/src/worker/MessageRouter.d.ts.map +1 -1
- package/src/worker/MessageRouter.js +7 -5
- package/src/worker/MessageRouter.js.map +2 -2
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@spearwolf/shadow-objects",
|
|
3
3
|
"description": "a reactive entity-component framework that feels at home in the shadows",
|
|
4
4
|
"homepage": "https://github.com/spearwolf/shadow-objects/",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.33.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Wolfger Schramm",
|
|
8
8
|
"email": "wolfger@spearwolf.de",
|
|
@@ -70,6 +70,6 @@
|
|
|
70
70
|
],
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"@spearwolf/eventize": "^5.0.0",
|
|
73
|
-
"@spearwolf/signalize": "^0.
|
|
73
|
+
"@spearwolf/signalize": "^0.30.0"
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -5,9 +5,9 @@ export declare class ShaeEntElement extends ShaeElement {
|
|
|
5
5
|
#private;
|
|
6
6
|
static observedAttributes: string[];
|
|
7
7
|
readonly isShaeEntElement = true;
|
|
8
|
-
readonly componentContext$: import("@spearwolf/signalize").Signal<ComponentContext>;
|
|
9
|
-
readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent>;
|
|
10
|
-
readonly token$: import("@spearwolf/signalize").Signal<string>;
|
|
8
|
+
readonly componentContext$: import("@spearwolf/signalize").Signal<ComponentContext | undefined>;
|
|
9
|
+
readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent | undefined>;
|
|
10
|
+
readonly token$: import("@spearwolf/signalize").Signal<string | undefined>;
|
|
11
11
|
readonly forwardCustomEvents$: import("@spearwolf/signalize").Signal<boolean | Set<string>>;
|
|
12
12
|
get componentContext(): ComponentContext | undefined;
|
|
13
13
|
get viewComponent(): ViewComponent | undefined;
|
|
@@ -17,7 +17,7 @@ export declare class ShaeEntElement extends ShaeElement {
|
|
|
17
17
|
entParentNode?: ShaeEntElement;
|
|
18
18
|
constructor();
|
|
19
19
|
findShadowRootHost(): HTMLElement | undefined;
|
|
20
|
-
protected getParentNodeForObserver():
|
|
20
|
+
protected getParentNodeForObserver(): Node | undefined;
|
|
21
21
|
connectedCallback(): void;
|
|
22
22
|
onParentChanged(_newParent: Node | undefined, _oldParent: Node): void;
|
|
23
23
|
attributeChangedCallback(name: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaeEntElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeEntElement.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShaeEntElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeEntElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,cAAe,SAAQ,WAAW;;IAC7C,OAAgB,kBAAkB,WAA+E;IAEjH,QAAQ,CAAC,gBAAgB,QAAQ;IAEjC,QAAQ,CAAC,iBAAiB,sEAAgD;IAC1E,QAAQ,CAAC,cAAc,mEAA6C;IACpE,QAAQ,CAAC,MAAM,4DAAsC;IACrD,QAAQ,CAAC,oBAAoB,+DAA8C;IAE3E,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,SAAS,CAEnD;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAElC;IAED,aAAa,CAAC,EAAE,cAAc,CAAC;;IAoJ/B,kBAAkB,IAAI,WAAW,GAAG,SAAS;IAmB7C,SAAS,CAAC,wBAAwB,IAAI,IAAI,GAAG,SAAS;IAOtD,iBAAiB;IAmDjB,eAAe,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,IAAI;IAUrD,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAS9C,oBAAoB;CAgJrB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { on } from "@spearwolf/eventize";
|
|
2
2
|
import { beQuiet, createEffect, createSignal } from "@spearwolf/signalize";
|
|
3
|
+
import { VoidToken } from "../constants.js";
|
|
3
4
|
import { ComponentContext } from "../view/ComponentContext.js";
|
|
4
5
|
import { ShadowEnv } from "../view/ShadowEnv.js";
|
|
5
6
|
import { ViewComponent } from "../view/ViewComponent.js";
|
|
@@ -155,7 +156,7 @@ class ShaeEntElement extends ShaeElement {
|
|
|
155
156
|
if (vc) {
|
|
156
157
|
vc.context = context;
|
|
157
158
|
} else if (context) {
|
|
158
|
-
vc = new ViewComponent(token, { context });
|
|
159
|
+
vc = new ViewComponent(token ?? VoidToken, { context });
|
|
159
160
|
this.viewComponent$.set(vc);
|
|
160
161
|
}
|
|
161
162
|
this.syncShadowObjects();
|
|
@@ -188,9 +189,7 @@ class ShaeEntElement extends ShaeElement {
|
|
|
188
189
|
return this.#shadowRootHost;
|
|
189
190
|
}
|
|
190
191
|
getParentNodeForObserver() {
|
|
191
|
-
|
|
192
|
-
if (parent) return parent;
|
|
193
|
-
return parent.host ?? parent;
|
|
192
|
+
return this.parentNode ?? this.getRootNode()?.host ?? void 0;
|
|
194
193
|
}
|
|
195
194
|
connectedCallback() {
|
|
196
195
|
this.#shadowRootHostNeedsUpdate = true;
|
|
@@ -300,7 +299,7 @@ class ShaeEntElement extends ShaeElement {
|
|
|
300
299
|
this.#unsubscribeFromParent = () => e.destroy();
|
|
301
300
|
} else {
|
|
302
301
|
const vc = this.viewComponent;
|
|
303
|
-
if (vc
|
|
302
|
+
if (vc?.parent) {
|
|
304
303
|
vc.parent = void 0;
|
|
305
304
|
this.syncShadowObjects();
|
|
306
305
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/elements/ShaeEntElement.ts"],
|
|
4
|
-
"sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {beQuiet, createEffect, createSignal} from '@spearwolf/signalize';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_FORWARD_CUSTOM_EVENTS, ATTR_TOKEN, RequestEntParentEventName, ReRequestEntParentEventName} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeEntElement extends ShaeElement {\n static override observedAttributes = [...ShaeElement.observedAttributes, ATTR_TOKEN, ATTR_FORWARD_CUSTOM_EVENTS];\n\n readonly isShaeEntElement = true;\n\n readonly componentContext$ = createSignal<ComponentContext | undefined>();\n readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n readonly token$ = createSignal<string | undefined>();\n readonly forwardCustomEvents$ = createSignal<Set<string> | boolean>(false);\n\n get componentContext(): ComponentContext | undefined {\n return this.componentContext$.value;\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n get uuid(): string | undefined {\n return this.viewComponent?.uuid;\n }\n\n get token(): string | undefined {\n return this.token$.value;\n }\n\n set token(token: string | undefined) {\n this.token$.set(token);\n }\n\n entParentNode?: ShaeEntElement;\n\n #parentObserver?: MutationObserver;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.componentContext$.set(ComponentContext.get(ns));\n if (this.isConnected) {\n this.#dispatchRequestParent();\n }\n });\n\n this.#updateTokenValue();\n\n this.token$.onChange((token) => {\n if (token == null) {\n this.removeAttribute(ATTR_TOKEN);\n } else if (this.getAttribute(ATTR_TOKEN) !== token) {\n this.setAttribute(ATTR_TOKEN, token);\n }\n });\n\n this.#updateForwardCustomEventsValue();\n\n this.forwardCustomEvents$.onChange((val) => {\n if (!val) {\n this.removeAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n } else if (val === true) {\n if (!this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, '');\n }\n } else {\n const str = Array.from(val).join(',');\n if (this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS) !== str) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, str);\n }\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const unsubcribe = on(vc, ComponentContext.ReRequestParentRoots, () => this.#reReuestParentRoot());\n const oldNs = vc.context?.ns;\n return () => {\n unsubcribe();\n vc.destroy();\n if (oldNs && oldNs !== this.ns) {\n ShadowEnv.get(oldNs)?.sync();\n } else {\n this.syncShadowObjects();\n }\n };\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (!vc) return;\n\n // Make sure we are patching the instance method, not the prototype\n const originalDispatchEvent = Object.hasOwn(vc, 'dispatchEvent')\n ? Object.getPrototypeOf(vc).dispatchEvent\n : vc.dispatchEvent;\n\n const filter = this.forwardCustomEvents$.get();\n if (!filter) return;\n\n const allowedTypes = filter instanceof Set ? filter : undefined;\n\n const newDispatch = (type: string, data: unknown, traverseChildren: boolean) => {\n originalDispatchEvent.call(vc, type, data, traverseChildren);\n\n if (type === ComponentContext.ReRequestParentRoots) return;\n\n if (allowedTypes && !allowedTypes.has(type)) return;\n\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n composed: true,\n detail: data,\n }),\n );\n };\n\n // We use defineProperty to ensure it is writable and configurable\n Object.defineProperty(vc, 'dispatchEvent', {\n value: newDispatch,\n writable: true,\n configurable: true,\n });\n\n return () => {\n if (Object.hasOwn(vc, 'dispatchEvent') && vc.dispatchEvent === newDispatch) {\n delete vc.dispatchEvent;\n }\n };\n });\n\n this.token$.onChange((token) => {\n const vc = this.viewComponent$.value;\n if (vc) {\n vc.token = token;\n this.syncShadowObjects();\n }\n });\n\n this.style.display = 'contents';\n }\n\n #unsubscribeViewComponentEffect?: () => void;\n\n #setupViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n\n const unsubscribeComponentContext = this.componentContext$.onChange((context) => {\n const token = this.token$.value;\n\n let vc = this.viewComponent$.value;\n\n if (vc) {\n vc.context = context;\n } else if (context) {\n vc = new ViewComponent(token, {context});\n this.viewComponent$.set(vc);\n }\n\n this.syncShadowObjects();\n });\n\n this.#unsubscribeViewComponentEffect = () => {\n unsubscribeComponentContext();\n };\n }\n\n #destroyViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n this.#unsubscribeViewComponentEffect = undefined;\n }\n\n #shadowRootHost?: HTMLElement;\n #shadowRootHostNeedsUpdate = true;\n\n findShadowRootHost(): HTMLElement | undefined {\n if (this.#shadowRootHostNeedsUpdate) {\n this.#shadowRootHostNeedsUpdate = false;\n\n let current: HTMLElement = this;\n while (current) {\n if (current.parentElement == null) {\n const root = current.parentNode as ShadowRoot;\n if (root) {\n this.#shadowRootHost = root.host as HTMLElement;\n }\n break;\n }\n current = current.parentElement;\n }\n }\n return this.#shadowRootHost;\n }\n\n protected getParentNodeForObserver() {\n const parent = this.parentNode;\n if (parent) return parent;\n return (parent as ShadowRoot).host ?? parent;\n }\n\n connectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.addEventListener('slotchange', this.#onSlotChange, {capture: false, passive: false});\n this.addEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false, passive: false});\n\n this.#setupViewComponentEffect();\n\n // --- token ---\n beQuiet(() => this.#updateTokenValue());\n\n // --- forward-custom-events ---\n beQuiet(() => this.#updateForwardCustomEventsValue());\n\n // --- componentContext | viewComponent ---\n if (this.componentContext == null) {\n this.componentContext$.set(ComponentContext.get(this.ns));\n }\n\n // --- viewComponent.parent ---\n this.#dispatchRequestParent();\n\n // --- parents ---\n this.componentContext?.dispatchReRequestParentRoots();\n this.#createParentObserver();\n\n // --- sync! ---\n this.syncShadowObjects();\n }\n\n #createParentObserver() {\n this.#destroyParentObserver();\n const parent = this.getParentNodeForObserver();\n if (parent) {\n this.#parentObserver = new MutationObserver((mutations, _observer) => {\n for (const {target, removedNodes} of mutations) {\n if (target === parent) {\n for (const node of removedNodes) {\n if (node === this) {\n this.#destroyParentObserver();\n this.onParentChanged(this.getParentNodeForObserver(), parent);\n break;\n }\n }\n }\n }\n });\n this.#parentObserver.observe(parent, {childList: true, subtree: false, attributes: false});\n }\n }\n\n onParentChanged(_newParent: Node | undefined, _oldParent: Node) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n\n #destroyParentObserver() {\n this.#parentObserver?.disconnect();\n this.#parentObserver = undefined;\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n if (name === ATTR_TOKEN) {\n this.#updateTokenValue();\n } else if (name === ATTR_FORWARD_CUSTOM_EVENTS) {\n this.#updateForwardCustomEventsValue();\n }\n }\n\n disconnectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.#destroyParentObserver();\n\n this.removeEventListener('slotchange', this.#onSlotChange, {capture: false});\n this.removeEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false});\n\n this.#setParent(undefined);\n\n this.componentContext$.set(undefined);\n\n this.syncShadowObjects();\n\n this.#destroyViewComponentEffect();\n }\n\n #reReuestParentRoot() {\n if (this.isConnected) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n }\n\n #dispatchRequestParent() {\n // https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/\n this.dispatchEvent(\n new CustomEvent(RequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this},\n }),\n );\n }\n\n #unsubscribeFromParent?: () => void;\n\n #setParent(parent?: ShaeEntElement) {\n if (this.entParentNode === parent) return;\n\n if (this.entParentNode) {\n this.entParentNode.removeEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {capture: false});\n }\n\n this.entParentNode = parent;\n\n if (this.entParentNode) {\n this.entParentNode.addEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {\n capture: false,\n passive: false,\n });\n }\n\n this.#unsubscribeFromParent?.();\n this.#unsubscribeFromParent = undefined;\n\n if (parent) {\n const e = createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const parentVC = parent.viewComponent$.get();\n vc.parent = parentVC && parentVC.context === vc.context ? parentVC : undefined;\n if (vc.parent == null) {\n queueMicrotask(() => {\n this.#dispatchRequestParent();\n });\n }\n this.syncShadowObjects();\n }\n });\n this.#unsubscribeFromParent = () => e.destroy();\n } else {\n const vc = this.viewComponent;\n if (vc.parent) {\n vc.parent = undefined;\n this.syncShadowObjects();\n }\n }\n }\n\n #onSlotChange = () => {\n const shadowRootHost = this.findShadowRootHost();\n if (shadowRootHost == null) return;\n this.dispatchEvent(\n new CustomEvent(ReRequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this, shadowRootHost},\n }),\n );\n };\n\n #onReRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n const shadowRootHost = event.detail?.shadowRootHost as HTMLElement | undefined;\n\n if (shadowRootHost) {\n this.#dispatchRequestParent();\n }\n };\n\n #onRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n event.stopPropagation();\n\n requester.#setParent(this);\n };\n\n #updateTokenValue() {\n if (this.hasAttribute(ATTR_TOKEN)) {\n const token = this.getAttribute(ATTR_TOKEN)?.trim() || undefined;\n this.token$.set(token);\n }\n }\n\n #updateForwardCustomEventsValue() {\n if (this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n const val = this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n if (!val || val.trim().length === 0) {\n this.forwardCustomEvents$.set(true);\n } else {\n this.forwardCustomEvents$.set(\n new Set(\n val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n ),\n );\n }\n } else {\n this.forwardCustomEvents$.set(false);\n }\n }\n}"],
|
|
5
|
-
"mappings": "AAAA,SAAQ,UAAS;AACjB,SAAQ,SAAS,cAAc,oBAAmB;AAClD,SAAQ,wBAAuB;AAC/B,SAAQ,iBAAgB;AACxB,SAAQ,qBAAoB;AAC5B,SAAQ,4BAA4B,YAAY,2BAA2B,mCAAkC;AAC7G,SAAQ,mBAAkB;AAEnB,MAAM,uBAAuB,YAAY;AAAA,EAkC9C,cAAc;AACZ,UAAM;AAhCR,SAAS,mBAAmB;AAE5B,SAAS,oBAAoB,aAA2C;AACxE,SAAS,iBAAiB,aAAwC;AAClE,SAAS,SAAS,aAAiC;AACnD,SAAS,uBAAuB,aAAoC,KAAK;
|
|
4
|
+
"sourcesContent": ["import {on} from '@spearwolf/eventize';\nimport {beQuiet, createEffect, createSignal} from '@spearwolf/signalize';\nimport {VoidToken} from '../constants.js';\nimport {ComponentContext} from '../view/ComponentContext.js';\nimport {ShadowEnv} from '../view/ShadowEnv.js';\nimport {ViewComponent} from '../view/ViewComponent.js';\nimport {ATTR_FORWARD_CUSTOM_EVENTS, ATTR_TOKEN, RequestEntParentEventName, ReRequestEntParentEventName} from './constants.js';\nimport {ShaeElement} from './ShaeElement.js';\n\nexport class ShaeEntElement extends ShaeElement {\n static override observedAttributes = [...ShaeElement.observedAttributes, ATTR_TOKEN, ATTR_FORWARD_CUSTOM_EVENTS];\n\n readonly isShaeEntElement = true;\n\n readonly componentContext$ = createSignal<ComponentContext | undefined>();\n readonly viewComponent$ = createSignal<ViewComponent | undefined>();\n readonly token$ = createSignal<string | undefined>();\n readonly forwardCustomEvents$ = createSignal<Set<string> | boolean>(false);\n\n get componentContext(): ComponentContext | undefined {\n return this.componentContext$.value;\n }\n\n get viewComponent(): ViewComponent | undefined {\n return this.viewComponent$.value;\n }\n\n get uuid(): string | undefined {\n return this.viewComponent?.uuid;\n }\n\n get token(): string | undefined {\n return this.token$.value;\n }\n\n set token(token: string | undefined) {\n this.token$.set(token);\n }\n\n entParentNode?: ShaeEntElement;\n\n #parentObserver?: MutationObserver;\n\n constructor() {\n super();\n\n this.ns$.onChange((ns) => {\n this.componentContext$.set(ComponentContext.get(ns));\n if (this.isConnected) {\n this.#dispatchRequestParent();\n }\n });\n\n this.#updateTokenValue();\n\n this.token$.onChange((token) => {\n if (token == null) {\n this.removeAttribute(ATTR_TOKEN);\n } else if (this.getAttribute(ATTR_TOKEN) !== token) {\n this.setAttribute(ATTR_TOKEN, token);\n }\n });\n\n this.#updateForwardCustomEventsValue();\n\n this.forwardCustomEvents$.onChange((val) => {\n if (!val) {\n this.removeAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n } else if (val === true) {\n if (!this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, '');\n }\n } else {\n const str = Array.from(val).join(',');\n if (this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS) !== str) {\n this.setAttribute(ATTR_FORWARD_CUSTOM_EVENTS, str);\n }\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const unsubcribe = on(vc, ComponentContext.ReRequestParentRoots, () => this.#reReuestParentRoot());\n const oldNs = vc.context?.ns;\n return () => {\n unsubcribe();\n vc.destroy();\n if (oldNs && oldNs !== this.ns) {\n ShadowEnv.get(oldNs)?.sync();\n } else {\n this.syncShadowObjects();\n }\n };\n }\n });\n\n createEffect(() => {\n const vc = this.viewComponent$.get();\n if (!vc) return;\n\n // Make sure we are patching the instance method, not the prototype\n const originalDispatchEvent = Object.hasOwn(vc, 'dispatchEvent')\n ? Object.getPrototypeOf(vc).dispatchEvent\n : vc.dispatchEvent;\n\n const filter = this.forwardCustomEvents$.get();\n if (!filter) return;\n\n const allowedTypes = filter instanceof Set ? filter : undefined;\n\n const newDispatch = (type: string, data: unknown, traverseChildren: boolean) => {\n originalDispatchEvent.call(vc, type, data, traverseChildren);\n\n if (type === ComponentContext.ReRequestParentRoots) return;\n\n if (allowedTypes && !allowedTypes.has(type)) return;\n\n this.dispatchEvent(\n new CustomEvent(type, {\n bubbles: true,\n composed: true,\n detail: data,\n }),\n );\n };\n\n // We use defineProperty to ensure it is writable and configurable\n Object.defineProperty(vc, 'dispatchEvent', {\n value: newDispatch,\n writable: true,\n configurable: true,\n });\n\n return () => {\n if (Object.hasOwn(vc, 'dispatchEvent') && vc.dispatchEvent === newDispatch) {\n // the property lives on the instance (defineProperty above), the method it shadows lives on\n // the prototype: deleting the own property restores the original, it does not remove the method\n delete (vc as {dispatchEvent?: ViewComponent['dispatchEvent']}).dispatchEvent;\n }\n };\n });\n\n this.token$.onChange((token) => {\n const vc = this.viewComponent$.value;\n if (vc) {\n vc.token = token;\n this.syncShadowObjects();\n }\n });\n\n this.style.display = 'contents';\n }\n\n #unsubscribeViewComponentEffect?: () => void;\n\n #setupViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n\n const unsubscribeComponentContext = this.componentContext$.onChange((context) => {\n const token = this.token$.value;\n\n let vc = this.viewComponent$.value;\n\n if (vc) {\n vc.context = context;\n } else if (context) {\n vc = new ViewComponent(token ?? VoidToken, {context});\n this.viewComponent$.set(vc);\n }\n\n this.syncShadowObjects();\n });\n\n this.#unsubscribeViewComponentEffect = () => {\n unsubscribeComponentContext();\n };\n }\n\n #destroyViewComponentEffect() {\n this.#unsubscribeViewComponentEffect?.();\n this.#unsubscribeViewComponentEffect = undefined;\n }\n\n #shadowRootHost?: HTMLElement;\n #shadowRootHostNeedsUpdate = true;\n\n findShadowRootHost(): HTMLElement | undefined {\n if (this.#shadowRootHostNeedsUpdate) {\n this.#shadowRootHostNeedsUpdate = false;\n\n let current: HTMLElement = this;\n while (current) {\n if (current.parentElement == null) {\n const root = current.parentNode as ShadowRoot;\n if (root) {\n this.#shadowRootHost = root.host as HTMLElement;\n }\n break;\n }\n current = current.parentElement;\n }\n }\n return this.#shadowRootHost;\n }\n\n protected getParentNodeForObserver(): Node | undefined {\n // a node still sitting in a tree answers from the first term, and for one placed directly\n // under a shadow root that term is the shadow root itself. Once it has no parent left it is\n // its own root, so the host lookup comes up empty too and the answer is: no parent\n return this.parentNode ?? (this.getRootNode() as ShadowRoot)?.host ?? undefined;\n }\n\n connectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.addEventListener('slotchange', this.#onSlotChange, {capture: false, passive: false});\n this.addEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false, passive: false});\n\n this.#setupViewComponentEffect();\n\n // --- token ---\n beQuiet(() => this.#updateTokenValue());\n\n // --- forward-custom-events ---\n beQuiet(() => this.#updateForwardCustomEventsValue());\n\n // --- componentContext | viewComponent ---\n if (this.componentContext == null) {\n this.componentContext$.set(ComponentContext.get(this.ns));\n }\n\n // --- viewComponent.parent ---\n this.#dispatchRequestParent();\n\n // --- parents ---\n this.componentContext?.dispatchReRequestParentRoots();\n this.#createParentObserver();\n\n // --- sync! ---\n this.syncShadowObjects();\n }\n\n #createParentObserver() {\n this.#destroyParentObserver();\n const parent = this.getParentNodeForObserver();\n if (parent) {\n this.#parentObserver = new MutationObserver((mutations, _observer) => {\n for (const {target, removedNodes} of mutations) {\n if (target === parent) {\n for (const node of removedNodes) {\n if (node === this) {\n this.#destroyParentObserver();\n this.onParentChanged(this.getParentNodeForObserver(), parent);\n break;\n }\n }\n }\n }\n });\n this.#parentObserver.observe(parent, {childList: true, subtree: false, attributes: false});\n }\n }\n\n onParentChanged(_newParent: Node | undefined, _oldParent: Node) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n\n #destroyParentObserver() {\n this.#parentObserver?.disconnect();\n this.#parentObserver = undefined;\n }\n\n override attributeChangedCallback(name: string) {\n super.attributeChangedCallback(name);\n if (name === ATTR_TOKEN) {\n this.#updateTokenValue();\n } else if (name === ATTR_FORWARD_CUSTOM_EVENTS) {\n this.#updateForwardCustomEventsValue();\n }\n }\n\n disconnectedCallback() {\n this.#shadowRootHostNeedsUpdate = true;\n\n this.#destroyParentObserver();\n\n this.removeEventListener('slotchange', this.#onSlotChange, {capture: false});\n this.removeEventListener(RequestEntParentEventName, this.#onRequestParent, {capture: false});\n\n this.#setParent(undefined);\n\n this.componentContext$.set(undefined);\n\n this.syncShadowObjects();\n\n this.#destroyViewComponentEffect();\n }\n\n #reReuestParentRoot() {\n if (this.isConnected) {\n this.#setParent(undefined);\n this.#dispatchRequestParent();\n }\n }\n\n #dispatchRequestParent() {\n // https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/\n this.dispatchEvent(\n new CustomEvent(RequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this},\n }),\n );\n }\n\n #unsubscribeFromParent?: () => void;\n\n #setParent(parent?: ShaeEntElement) {\n if (this.entParentNode === parent) return;\n\n if (this.entParentNode) {\n this.entParentNode.removeEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {capture: false});\n }\n\n this.entParentNode = parent;\n\n if (this.entParentNode) {\n this.entParentNode.addEventListener(ReRequestEntParentEventName, this.#onReRequestParent, {\n capture: false,\n passive: false,\n });\n }\n\n this.#unsubscribeFromParent?.();\n this.#unsubscribeFromParent = undefined;\n\n if (parent) {\n const e = createEffect(() => {\n const vc = this.viewComponent$.get();\n if (vc) {\n const parentVC = parent.viewComponent$.get();\n vc.parent = parentVC && parentVC.context === vc.context ? parentVC : undefined;\n if (vc.parent == null) {\n queueMicrotask(() => {\n this.#dispatchRequestParent();\n });\n }\n this.syncShadowObjects();\n }\n });\n this.#unsubscribeFromParent = () => e.destroy();\n } else {\n const vc = this.viewComponent;\n if (vc?.parent) {\n vc.parent = undefined;\n this.syncShadowObjects();\n }\n }\n }\n\n #onSlotChange = () => {\n const shadowRootHost = this.findShadowRootHost();\n if (shadowRootHost == null) return;\n this.dispatchEvent(\n new CustomEvent(ReRequestEntParentEventName, {\n bubbles: true,\n composed: true,\n detail: {requester: this, shadowRootHost},\n }),\n );\n };\n\n #onReRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n const shadowRootHost = event.detail?.shadowRootHost as HTMLElement | undefined;\n\n if (shadowRootHost) {\n this.#dispatchRequestParent();\n }\n };\n\n #onRequestParent = (event: CustomEvent) => {\n const requester = event.detail?.requester as ShaeEntElement | undefined;\n\n if (requester === this) return;\n if (!requester?.isShaeEntElement) return;\n if (requester.ns !== this.ns) return;\n\n event.stopPropagation();\n\n requester.#setParent(this);\n };\n\n #updateTokenValue() {\n if (this.hasAttribute(ATTR_TOKEN)) {\n const token = this.getAttribute(ATTR_TOKEN)?.trim() || undefined;\n this.token$.set(token);\n }\n }\n\n #updateForwardCustomEventsValue() {\n if (this.hasAttribute(ATTR_FORWARD_CUSTOM_EVENTS)) {\n const val = this.getAttribute(ATTR_FORWARD_CUSTOM_EVENTS);\n if (!val || val.trim().length === 0) {\n this.forwardCustomEvents$.set(true);\n } else {\n this.forwardCustomEvents$.set(\n new Set(\n val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n ),\n );\n }\n } else {\n this.forwardCustomEvents$.set(false);\n }\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,13 +4,13 @@ import type { ShaeEntElement } from './ShaeEntElement.js';
|
|
|
4
4
|
export declare class ShaePropElement extends HTMLElement {
|
|
5
5
|
#private;
|
|
6
6
|
static observedAttributes: string[];
|
|
7
|
-
readonly
|
|
8
|
-
protected readonly entNode$: import("@spearwolf/signalize").Signal<ShaeEntElement>;
|
|
9
|
-
protected readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent>;
|
|
10
|
-
protected readonly name$: import("@spearwolf/signalize").Signal<string>;
|
|
7
|
+
readonly isShaePropElement = true;
|
|
8
|
+
protected readonly entNode$: import("@spearwolf/signalize").Signal<ShaeEntElement | undefined>;
|
|
9
|
+
protected readonly viewComponent$: import("@spearwolf/signalize").Signal<ViewComponent | undefined>;
|
|
10
|
+
protected readonly name$: import("@spearwolf/signalize").Signal<string | undefined>;
|
|
11
11
|
protected readonly valueIn$: import("@spearwolf/signalize").Signal<unknown>;
|
|
12
12
|
protected readonly valueOut$: import("@spearwolf/signalize").Signal<unknown>;
|
|
13
|
-
protected readonly type$: import("@spearwolf/signalize").Signal<string>;
|
|
13
|
+
protected readonly type$: import("@spearwolf/signalize").Signal<string | undefined>;
|
|
14
14
|
protected readonly shouldTrim$: import("@spearwolf/signalize").Signal<boolean>;
|
|
15
15
|
protected readonly logger: ConsoleLogger;
|
|
16
16
|
get name(): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaePropElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaePropElement.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AA0DxD,qBAAa,eAAgB,SAAQ,WAAW;;IAC9C,MAAM,CAAC,kBAAkB,WAAoD;IAE7E,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"ShaePropElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaePropElement.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE5D,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AA0DxD,qBAAa,eAAgB,SAAQ,WAAW;;IAC9C,MAAM,CAAC,kBAAkB,WAAoD;IAE7E,QAAQ,CAAC,iBAAiB,QAAQ;IAElC,SAAS,CAAC,QAAQ,CAAC,QAAQ,oEAA8C;IACzE,SAAS,CAAC,QAAQ,CAAC,cAAc,mEAA6C;IAE9E,SAAS,CAAC,QAAQ,CAAC,KAAK,4DAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,iDAAkB;IAC7C,SAAS,CAAC,QAAQ,CAAC,SAAS,iDAAkB;IAC9C,SAAS,CAAC,QAAQ,CAAC,KAAK,4DAAsC;IAC9D,SAAS,CAAC,QAAQ,CAAC,WAAW,iDAAsB;IAEpD,SAAS,CAAC,QAAQ,CAAC,MAAM,gBAAwC;IAEjE,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,EAErB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,OAAO,IAAI,cAAc,GAAG,SAAS,CAExC;IAED,IAAI,OAAO,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,EAEzC;IAED,IAAI,aAAa,IAAI,aAAa,GAAG,SAAS,CAE7C;;IAwND,iBAAiB;IAUjB,wBAAwB,CAAC,IAAI,EAAE,MAAM;IAoBrC,oBAAoB;CAwCrB"}
|
|
@@ -60,7 +60,7 @@ const TYPES = /* @__PURE__ */ new Set([
|
|
|
60
60
|
class ShaePropElement extends HTMLElement {
|
|
61
61
|
constructor() {
|
|
62
62
|
super();
|
|
63
|
-
this.
|
|
63
|
+
this.isShaePropElement = true;
|
|
64
64
|
this.entNode$ = createSignal();
|
|
65
65
|
this.viewComponent$ = createSignal();
|
|
66
66
|
this.name$ = createSignal();
|
|
@@ -184,7 +184,7 @@ class ShaePropElement extends HTMLElement {
|
|
|
184
184
|
break;
|
|
185
185
|
case "int[]":
|
|
186
186
|
case "integer[]":
|
|
187
|
-
value = value.split(/\s+/).map((v) => parseInt(v));
|
|
187
|
+
value = value.split(/\s+/).map((v) => parseInt(v, 10));
|
|
188
188
|
break;
|
|
189
189
|
case "hex[]":
|
|
190
190
|
case "hexadecimal[]":
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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": "AAAA,SAAQ,OAAO,cAAc,cAAc,YAAW;AACtD,SAAQ,4BAA2B;AACnC,SAAQ,qBAAoB;AAC5B,SAAQ,qBAAoB;AAE5B,SAAQ,WAAW,cAAc,WAAW,kBAAiB;AAG7D,MAAM,cAAc,CAAC,UAAmD;AACtE,MAAI,KAAyB,MAAM;AACnC,SAAO,IAAI;AACT,QAAK,GAAsB,kBAAkB;AAC3C,aAAO;AAAA,IACT;AACA,SAAK,GAAG;AAAA,EACV;AACA,SAAO;AACT;AAEA,MAAM,QAAQ,oBAAI,IAAI;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,wBAAwB,YAAY;AAAA,EA4C/C,cAAc;AACZ,UAAM;AA1CR,SAAS,
|
|
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 isShaePropElement = 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, 10));\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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaeWorkerElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeWorkerElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAIhD,OAAO,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"ShaeWorkerElement.d.ts","sourceRoot":"","sources":["../../../src/elements/ShaeWorkerElement.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAIhD,OAAO,EAAC,SAAS,EAA0B,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,iBAAkB,SAAQ,WAAW;;IAgIhD;;OAEG;IACH,CAAC,SAAS,CAAC,OAAO,CAAC;IAlInB,OAAgB,kBAAkB,WAMhC;IAEF,MAAM,CAAC,eAAe,SAAW;IAEjC,QAAQ,CAAC,mBAAmB,QAAQ;IAEpC,QAAQ,CAAC,SAAS,YAAmB;IAErC,QAAQ,CAAC,MAAM,gBAA0C;IAEzD,SAAS,UAAQ;IAEjB,YAAY,iDAAuB;IACnC,SAAS,gDAAmD;IAC5D,IAAI,gDAAoB;;IAuFxB,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,QAAQ,IAIM,GAAG,CAFpB;IAED,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAKpB;IAED,IAAI,SAAS,IAAI,SAAS,CAGzB;IASK,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmBjE,iBAAiB;IAajB,oBAAoB;IAKX,wBAAwB,CAAC,IAAI,EAAE,MAAM;IA0B9C,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAkB3B,OAAO;CA2ER"}
|
|
@@ -6,7 +6,7 @@ import { FrameLoop } from "../utils/FrameLoop.js";
|
|
|
6
6
|
import { ComponentContext } from "../view/ComponentContext.js";
|
|
7
7
|
import { LocalShadowObjectEnv } from "../view/LocalShadowObjectEnv.js";
|
|
8
8
|
import { RemoteWorkerEnv } from "../view/RemoteWorkerEnv.js";
|
|
9
|
-
import { ShadowEnv } from "../view/ShadowEnv.js";
|
|
9
|
+
import { ShadowEnv, ShadowEnvDestroyedError } from "../view/ShadowEnv.js";
|
|
10
10
|
import { ATTR_AUTO_SYNC, ATTR_LOCAL, ATTR_NO_AUTOSTART, ATTR_NO_STRUCTURED_CLONE, ATTR_SRC } from "./constants.js";
|
|
11
11
|
import { ShaeElement } from "./ShaeElement.js";
|
|
12
12
|
class ShaeWorkerElement extends ShaeElement {
|
|
@@ -21,6 +21,17 @@ class ShaeWorkerElement extends ShaeElement {
|
|
|
21
21
|
this.src$ = createSignal("");
|
|
22
22
|
this.#shouldDestroy = false;
|
|
23
23
|
this.#started = false;
|
|
24
|
+
/**
|
|
25
|
+
* Both {@link ShaeWorkerElement.start} and {@link ShaeWorkerElement.importScript} await
|
|
26
|
+
* {@link ShadowEnv.ready}, which rejects once the environment is destroyed — the normal
|
|
27
|
+
* outcome for an element that connects and disconnects within the same task. Nothing in the
|
|
28
|
+
* element waits on those promises, so the rejection has to end here instead of surfacing as
|
|
29
|
+
* an unhandled rejection in the browser or as a hard failure in a test runner.
|
|
30
|
+
*/
|
|
31
|
+
this.#onUnobservedRejection = (error) => {
|
|
32
|
+
if (error instanceof ShadowEnvDestroyedError) return;
|
|
33
|
+
this.logger.error("shadowEnv failed", error);
|
|
34
|
+
};
|
|
24
35
|
this.ns$.onChange((ns) => {
|
|
25
36
|
this.shadowEnv.view = ComponentContext.get(ns);
|
|
26
37
|
});
|
|
@@ -41,6 +52,14 @@ class ShaeWorkerElement extends ShaeElement {
|
|
|
41
52
|
})
|
|
42
53
|
);
|
|
43
54
|
});
|
|
55
|
+
on(this.shadowEnv, ShadowEnv.ProxyFailed, (reason) => {
|
|
56
|
+
this.dispatchEvent(
|
|
57
|
+
new CustomEvent(ShadowEnv.ProxyFailed.toLowerCase(), {
|
|
58
|
+
bubbles: false,
|
|
59
|
+
detail: { shadowEnv: this.shadowEnv, reason }
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
});
|
|
44
63
|
this.autoSync$.onChange((sVal) => {
|
|
45
64
|
const hasAttr = this.hasAttribute(ATTR_AUTO_SYNC);
|
|
46
65
|
const attrVal = hasAttr ? this.getAttribute(ATTR_AUTO_SYNC) : void 0;
|
|
@@ -78,12 +97,13 @@ class ShaeWorkerElement extends ShaeElement {
|
|
|
78
97
|
() => {
|
|
79
98
|
const src = this.src$.get();
|
|
80
99
|
if (src) {
|
|
81
|
-
this.importScript(src);
|
|
100
|
+
this.importScript(src).catch(this.#onUnobservedRejection);
|
|
82
101
|
}
|
|
83
102
|
},
|
|
84
103
|
{ autorun: false }
|
|
85
104
|
);
|
|
86
105
|
}
|
|
106
|
+
#onUnobservedRejection;
|
|
87
107
|
get shouldAutostart() {
|
|
88
108
|
return this.autostart && !readBooleanAttribute(this, ATTR_NO_AUTOSTART);
|
|
89
109
|
}
|
|
@@ -114,18 +134,23 @@ class ShaeWorkerElement extends ShaeElement {
|
|
|
114
134
|
if (this.logger.isInfo) {
|
|
115
135
|
this.logger.info("shadowEnv importScript:", src, { shadowEnv });
|
|
116
136
|
}
|
|
117
|
-
|
|
137
|
+
const envProxy = shadowEnv.envProxy;
|
|
138
|
+
if (envProxy == null) {
|
|
139
|
+
throw new ShadowEnvDestroyedError();
|
|
140
|
+
}
|
|
141
|
+
await envProxy.importScript(src);
|
|
118
142
|
return this;
|
|
119
143
|
}
|
|
120
144
|
connectedCallback() {
|
|
121
145
|
batch(() => {
|
|
122
|
-
|
|
123
|
-
|
|
146
|
+
const autoSync = this.getAttribute(ATTR_AUTO_SYNC);
|
|
147
|
+
if (autoSync != null) {
|
|
148
|
+
this.autoSync$.set(autoSync);
|
|
124
149
|
}
|
|
125
150
|
this.isConnected$.set(true);
|
|
126
151
|
});
|
|
127
152
|
if (this.shouldAutostart) {
|
|
128
|
-
this.start();
|
|
153
|
+
this.start().catch(this.#onUnobservedRejection);
|
|
129
154
|
}
|
|
130
155
|
}
|
|
131
156
|
disconnectedCallback() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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
|
|
5
|
-
"mappings": "AAAA,SAAQ,UAAS;AACjB,SAAQ,OAAO,cAAc,cAAc,eAAe,cAAa;AACvE,SAAQ,4BAA2B;AACnC,SAAQ,qBAAoB;AAC5B,SAAQ,iBAAgB;AACxB,SAAQ,wBAAuB;AAC/B,SAAQ,4BAA2B;AACnC,SAAQ,uBAAsB;AAC9B,SAAQ,
|
|
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, ShadowEnvDestroyedError} 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 on(this.shadowEnv, ShadowEnv.ProxyFailed, (reason: unknown) => {\n this.dispatchEvent(\n new CustomEvent(ShadowEnv.ProxyFailed.toLowerCase(), {\n bubbles: false,\n detail: {shadowEnv: this.shadowEnv, reason},\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).catch(this.#onUnobservedRejection);\n }\n },\n {autorun: false},\n );\n }\n\n /**\n * Both {@link ShaeWorkerElement.start} and {@link ShaeWorkerElement.importScript} await\n * {@link ShadowEnv.ready}, which rejects once the environment is destroyed \u2014 the normal\n * outcome for an element that connects and disconnects within the same task. Nothing in the\n * element waits on those promises, so the rejection has to end here instead of surfacing as\n * an unhandled rejection in the browser or as a hard failure in a test runner.\n */\n #onUnobservedRejection = (error: unknown) => {\n if (error instanceof ShadowEnvDestroyedError) return;\n this.logger.error('shadowEnv failed', error);\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 // ready() only vouches for the proxy at the moment it resolves; a teardown can slip in\n // between that microtask and this line\n const envProxy = shadowEnv.envProxy;\n if (envProxy == null) {\n throw new ShadowEnvDestroyedError();\n }\n\n await envProxy.importScript(src);\n return this;\n }\n\n connectedCallback() {\n batch(() => {\n const autoSync = this.getAttribute(ATTR_AUTO_SYNC);\n if (autoSync != null) {\n this.autoSync$.set(autoSync);\n }\n this.isConnected$.set(true);\n });\n if (this.shouldAutostart) {\n this.start().catch(this.#onUnobservedRejection);\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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -41,6 +41,11 @@ export declare class Kernel {
|
|
|
41
41
|
private parse;
|
|
42
42
|
createEntity(uuid: string, token: string, parentUuid?: string, order?: number, properties?: [string, unknown][], autoDestructionOnParentRemoval?: boolean): void;
|
|
43
43
|
destroyEntity(uuid: string): void;
|
|
44
|
+
/**
|
|
45
|
+
* @param order the new order, or `undefined` to keep the current one. A set-parent change
|
|
46
|
+
* only carries an order when it actually changed, so an absent order must not be read as
|
|
47
|
+
* a reset to `0` — that would silently drop the order the view side still holds.
|
|
48
|
+
*/
|
|
44
49
|
setParent(uuid: string, parentUuid?: string, order?: number): void;
|
|
45
50
|
updateOrder(uuid: string, order: number): void;
|
|
46
51
|
dispatchEventsToEntity(uuid: string, events: IComponentEvent[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kernel.d.ts","sourceRoot":"","sources":["../../../src/in-the-dark/Kernel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,eAAe,EAIf,gBAAgB,EAEhB,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAQD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgBD;;;;;;GAMG;AACH,qBAAa,MAAM;;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,CAAC,MAAM,gBAA+B;gBAWlC,QAAQ,CAAC,EAAE,QAAQ;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"Kernel.d.ts","sourceRoot":"","sources":["../../../src/in-the-dark/Kernel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,eAAe,EAIf,gBAAgB,EAEhB,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAQD,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgBD;;;;;;GAMG;AACH,qBAAa,MAAM;;IACjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,CAAC,MAAM,gBAA+B;gBAWlC,QAAQ,CAAC,EAAE,QAAQ;IAK/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmB/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,qBAAqB,CAAC,OAAO,UAAQ,GAAG,MAAM,EAAE;IAkChD,cAAc,IAAI,eAAe,EAAE;IAMnC,OAAO,CAAC,kBAAkB;IAc1B,eAAe,IAAI,IAAI;IAmBvB,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAW3B,OAAO,CAAC,KAAK;IA2Cb,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,SAAI,EACT,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAChC,8BAA8B,UAAQ,GACrC,IAAI;IA0BP,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA6BjC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAkClE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9C,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAIrE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;IAKrE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW9C,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAMxD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,qBAAqB;IAmY7B,OAAO,CAAC,mBAAmB;IAM3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IASnD,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,mBAAmB;IAU3B,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAS3D,OAAO,IAAI,IAAI;CAUhB"}
|