@wcstack/worker 2.1.0 → 2.2.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/README.ja.md +1 -0
- package/README.md +1 -0
- package/dist/auto.min.js +1 -1
- package/dist/auto.min.js.map +1 -1
- package/dist/index.d.ts +29 -2
- package/dist/index.esm.js +99 -2
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -222,6 +222,7 @@ form:has(wcs-worker:state(error)) .banner { display: block; }
|
|
|
222
222
|
- **無言のエラー処理(ゼロログ)。** wcstack のゼロ依存主義に従い、`<wcs-worker>` は実行時の失敗に対して一切ログ出力も throw もしません。不正なスクリプト URL、CSP `worker-src` ブロック、クローン不可能な post、デシリアライズ失敗、worker 内の未捕捉エラーは `error` プロパティ / `wcs-worker:error` イベントを通じてのみ表面化します — `post()` は return し、決して reject しません。観測・対処するには `error` をバインドしてください。
|
|
223
223
|
- **`errorInfo` タクソノミ。** `error` に現れるのと同じ失敗を、シリアライズ可能な `WcsIoErrorInfo`(安定した `code` / `phase` / `recoverable`)に分類する**追加的な**バインド可能出力(`wcs-worker:error-info-changed`)です。`error` の形状は変えません。`Worker` コンストラクタの欠如(SSR / 非対応で `new Worker()` が `TypeError` / `ReferenceError` を投げる)は `capability-missing`(phase `probe`)、`src` を指定しない `start()` は `invalid-argument`(phase `start`)、その他の失敗——worker の未捕捉 `Error`、`DataError`(デシリアライズ失敗)、`DataCloneError` / `InvalidStateError`(post 失敗)、spawn 失敗——は `worker-error`(phase `execute`)です。worker の失敗はいずれも `recoverable: false`(自動リトライでは回復しません)。`errorInfo` は `error` と同期して遷移し(同じタイミングで、`error` と共にクリアされる)ます。共有の `WcsIoErrorInfo` 型と `WCS_WORKER_ERROR_CODE` 定数は export 済みです。
|
|
224
224
|
- **`src` はコードとして実行される — 信頼すること。** `src` の値は `new Worker(src)` にそのまま渡され、ページの権限でスクリプトを実行します。タグはオリジンの検証もサンドボックス化もしません。信頼するスクリプトにのみ `src` を向け(`<script src>` と同様に扱う)、worker をどこから読み込めるか制約するために明示的な `worker-src` 許可リストを持つ `Content-Security-Policy` を優先してください — 特に `src` がデータバインディングの影響を受け得る場合は。
|
|
225
|
+
- **Trusted Types。** `new Worker(src)` は `TrustedScriptURL` の sink です。`require-trusted-types-for 'script'` 下では、ページの作者が書いた属性値である `src` を `wcstack` という名前の policy で署名するため、CSP に `trusted-types wcstack;` が必要です(または自前の policy を注入する。詳細は [docs/csp.ja.md](../../docs/csp.ja.md) の §7)。
|
|
225
226
|
- **Dedicated Worker のみ。** SharedWorker と Worklet はこのタグの対象外です。
|
|
226
227
|
|
|
227
228
|
## ヘッドレス利用(`WorkerCore`)
|
package/README.md
CHANGED
|
@@ -224,6 +224,7 @@ DevTools open; they are not a supported styling hook.
|
|
|
224
224
|
- **Silent failure handling (zero-log).** Consistent with wcstack's zero-dependency philosophy, `<wcs-worker>` never logs or throws for runtime failures. A bad script URL, a CSP `worker-src` block, a non-cloneable post, a deserialization failure, and an uncaught worker error are surfaced only through the `error` property / `wcs-worker:error` event — `post()` returns and never rejects. Bind `error` to observe and react.
|
|
225
225
|
- **`errorInfo` taxonomy.** An **additive** bindable output (`wcs-worker:error-info-changed`) that classifies the same failure surfaced on `error` into a serializable `WcsIoErrorInfo` with a stable `code` / `phase` / `recoverable`, without changing the `error` shape. A missing `Worker` constructor (SSR / unsupported, where `new Worker()` throws a `TypeError` / `ReferenceError`) is `capability-missing` (phase `probe`); calling `start()` with no `src` is `invalid-argument` (phase `start`); any other failure — an uncaught worker `Error`, a `DataError` deserialization failure, a `DataCloneError` / `InvalidStateError` post failure, or a spawn failure — is `worker-error` (phase `execute`). Every worker failure is `recoverable: false` (no automatic retry recovers it). `errorInfo` stays in lockstep with `error` (same transitions, cleared alongside it). The shared `WcsIoErrorInfo` type and the `WCS_WORKER_ERROR_CODE` constants are exported.
|
|
226
226
|
- **`src` runs as code — trust it.** The `src` value is passed straight to `new Worker(src)`, which executes the script with the page's privileges; the tag does not validate or sandbox the origin. Only point `src` at scripts you trust (treat it like a `<script src>`), and prefer a `Content-Security-Policy` with an explicit `worker-src` allowlist to constrain where workers may load from — especially if `src` can be influenced by data binding.
|
|
227
|
+
- **Trusted Types.** `new Worker(src)` is a `TrustedScriptURL` sink. Under `require-trusted-types-for 'script'` the `src` — an attribute the page author wrote — is signed by a policy named `wcstack`, so the CSP needs `trusted-types wcstack;` (or your own policy, injected as described in [docs/csp.md](../../docs/csp.md) section 7).
|
|
227
228
|
- **Dedicated Worker only.** SharedWorker and Worklets are out of scope for this tag.
|
|
228
229
|
|
|
229
230
|
## Headless usage (`WorkerCore`)
|
package/dist/auto.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const t={triggerAttribute:"data-worker-target",tagNames:{worker:"wcs-worker"}},e="capability-missing",r="invalid-argument",s="worker-error";
|
|
1
|
+
const t={triggerAttribute:"data-worker-target",tagNames:{worker:"wcs-worker"}},e="capability-missing",r="invalid-argument",s="worker-error";const n=Symbol.for("wcstack.trustedTypes.policy"),i=Symbol.for("wcstack.trustedTypes.internal"),a="wcstack";function o(){const t=globalThis[n];return null===t||"object"!=typeof t?null:t}let c=!1;function l(t){const e=function(){const t=globalThis,e=t[i];if(void 0!==e)return e;const r=globalThis.trustedTypes;let s=null;if(r&&"function"==typeof r.createPolicy)try{s=r.createPolicy(a,{createHTML:t=>t,createScriptURL:t=>t})}catch(t){"function"!=typeof o()?.createScriptURL&&console.error(`[@wcstack/worker] Could not create the Trusted Types policy "${a}". Allow it in the CSP (\`trusted-types ${a};\`), or inject your own policy at globalThis[Symbol.for("wcstack.trustedTypes.policy")]. See docs/csp.md section 7.`,t)}return t[i]=s,s}(),r=e?.createScriptURL;if("function"==typeof r)return r.call(e,t);if(!("trustedTypes"in globalThis))return t;const s=o(),n=s?.createScriptURL;return"function"==typeof n?(c||(c=!0,console.warn(`[@wcstack/worker] Falling back to the injected Trusted Types policy to sign the worker URL, because the "${a}" policy could not be created. Allow \`trusted-types ${a};\` in the CSP to avoid this. See docs/csp.md section 7.`)),n.call(s,t)):t}class u extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-worker:message",semantics:"event"},{name:"error",event:"wcs-worker:error",semantics:"state"},{name:"errorInfo",event:"wcs-worker:error-info-changed",semantics:"state"},{name:"running",event:"wcs-worker:running-changed",semantics:"state"}],commands:[{name:"start"},{name:"post"},{name:"terminate"}]};_target;_worker=null;_message=null;_error=null;_errorInfo=null;_running=!1;_src="";_type="module";_name="";_restartOnError=!1;_maxRestarts=1/0;_restartInterval=0;_restartCount=0;_restartTimer=null;_gen=0;_ready=Promise.resolve();constructor(t){super(),this._target=t??this}get ready(){return this._ready}observe(){return this._ready}get message(){return this._message}get error(){return this._error}get errorInfo(){return this._errorInfo}get running(){return this._running}_setMessage(t){this._message=t,this._target.dispatchEvent(new CustomEvent("wcs-worker:message",{detail:t,bubbles:!0}))}_setError(t){this._error!==t&&(this._error=t,this._commitErrorInfo(null===t?null:function(t){const{name:n,message:i}=t;return"TypeError"===n&&"src is required."===i?{code:r,phase:"start",recoverable:!1,message:i}:"TypeError"===n||"ReferenceError"===n?{code:e,phase:"probe",recoverable:!1,message:i}:{code:s,phase:"execute",recoverable:!1,message:i}}(t)),this._target.dispatchEvent(new CustomEvent("wcs-worker:error",{detail:t,bubbles:!0})))}_commitErrorInfo(t){this._errorInfo=t,this._target.dispatchEvent(new CustomEvent("wcs-worker:error-info-changed",{detail:t,bubbles:!0}))}_setRunning(t){this._running=t,this._target.dispatchEvent(new CustomEvent("wcs-worker:running-changed",{detail:t,bubbles:!0}))}start(t,e={}){t?this._worker&&this._src===t||(this._clearRestartTimer(),this._terminateWorker(),this._src=t,this._type=e.type??"module",this._name=e.name??"",this._restartOnError=e.restartOnError??!1,this._maxRestarts=e.maxRestarts??1/0,this._restartInterval=e.restartInterval??0,this._restartCount=0,this._setError(null),this._spawn()):this._setError({name:"TypeError",message:"src is required."})}post(t,e){if(this._worker)try{e&&e.length>0?this._worker.postMessage(t,e):this._worker.postMessage(t)}catch(t){this._setError(this._normalizeError(t))}else this._setError({name:"InvalidStateError",message:"Worker is not running. Call start(src) before post()."})}terminate(){this._clearRestartTimer(),this._terminateWorker()}dispose(){this._gen++,this._clearRestartTimer(),this._terminateWorker(),this._error=null,this._errorInfo=null}_spawn(){try{this._worker=new Worker(l(this._src),{type:this._type,name:this._name||void 0})}catch(t){return void this._setError(this._normalizeError(t))}this._worker.addEventListener("message",this._onMessage),this._worker.addEventListener("messageerror",this._onMessageError),this._worker.addEventListener("error",this._onError),this._setRunning(!0)}_onMessage=t=>{this._setMessage(t.data)};_onMessageError=()=>{this._setError({name:"DataError",message:"Failed to deserialize a message received from the worker."})};_onError=t=>{this._setError({name:"Error",message:t.message||"Worker script error.",filename:t.filename,lineno:t.lineno,colno:t.colno}),this._restartOnError&&this._restartCount<this._maxRestarts&&this._scheduleRestart()};_scheduleRestart(){this._clearRestartTimer();const t=this._gen;this._restartTimer=setTimeout(()=>{t===this._gen&&(this._restartTimer=null,this._restartCount++,this._terminateWorker(),this._setError(null),this._spawn())},this._restartInterval)}_clearRestartTimer(){null!==this._restartTimer&&(clearTimeout(this._restartTimer),this._restartTimer=null)}_terminateWorker(){this._worker&&(this._worker.removeEventListener("message",this._onMessage),this._worker.removeEventListener("messageerror",this._onMessageError),this._worker.removeEventListener("error",this._onError),this._worker.terminate(),this._worker=null,this._setRunning(!1))}_normalizeError(t){return t instanceof Error?{name:t.name,message:t.message}:{name:"Error",message:String(t)}}}let h=!1;const m="data-worker-text";function _(e){const r=e.target;if(!(r instanceof Element))return;const s=r.closest(`[${t.triggerAttribute}]`);if(!s)return;const n=s.getAttribute(t.triggerAttribute);if(!n)return;const i=customElements.get(t.tagNames.worker),a=document.getElementById(n);if(!(i&&a instanceof i))return;const o=function(t){if(t.hasAttribute(m))return t.getAttribute(m)??"";const e=t.getAttribute("data-worker-from");if(!e)return null;let r;try{r=document.querySelector(e)}catch{return null}return r?r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement?r.value:r.textContent??"":null}(s);null!==o&&(e.preventDefault(),a.post(o))}function g(t,e){let r=Object.getPrototypeOf(t);for(;null!==r;){const t=Object.getOwnPropertyDescriptor(r,e);if(void 0!==t)return"function"==typeof t.get||"function"==typeof t.set;r=Object.getPrototypeOf(r)}return!1}class d extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...u.wcBindable,inputs:[{name:"src",attribute:"src"},{name:"type",attribute:"type"},{name:"name",attribute:"name"},{name:"manual",attribute:"manual"},{name:"keepAlive",attribute:"keep-alive"},{name:"restartOnError",attribute:"restart-on-error"},{name:"maxRestarts",attribute:"max-restarts"},{name:"restartInterval",attribute:"restart-interval"}],commands:u.wcBindable.commands};static get observedAttributes(){return["src"]}_core;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new u(this),this._internals=this._initInternals(),this._wireStates({"wcs-worker:running-changed":t=>({running:!0===t}),"wcs-worker:error":t=>({error:null!=t})})}get connectedCallbackPromise(){return this._connectedCallbackPromise}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const t=this.attachInternals();return t.states.add("wcs-probe"),t.states.delete("wcs-probe"),t}catch{return null}}_wireStates(t){if(null===this._internals)return;const e=this._internals.states;for(const[r,s]of Object.entries(t))this.addEventListener(r,t=>{const r=this.hasAttribute("debug-states");for(const[n,i]of Object.entries(s(t.detail))){try{i?e.add(n):e.delete(n)}catch{}r&&this.toggleAttribute(`data-wcs-state-${n}`,i)}})}get src(){return this.getAttribute("src")||""}set src(t){this.setAttribute("src",t)}get type(){return"classic"===this.getAttribute("type")?"classic":"module"}set type(t){this.setAttribute("type",t)}get name(){return this.getAttribute("name")||""}set name(t){this.setAttribute("name",t)}get manual(){return this.hasAttribute("manual")}set manual(t){t?this.setAttribute("manual",""):this.removeAttribute("manual")}get keepAlive(){return this.hasAttribute("keep-alive")}set keepAlive(t){t?this.setAttribute("keep-alive",""):this.removeAttribute("keep-alive")}get restartOnError(){return this.hasAttribute("restart-on-error")}set restartOnError(t){t?this.setAttribute("restart-on-error",""):this.removeAttribute("restart-on-error")}get maxRestarts(){const t=this.getAttribute("max-restarts");if("Infinity"===t)return 1/0;const e=t?parseInt(t,10):1/0;return Number.isNaN(e)?1/0:e}set maxRestarts(t){this.setAttribute("max-restarts",String(t))}get restartInterval(){const t=this.getAttribute("restart-interval"),e=t?parseInt(t,10):0;return Number.isNaN(e)?0:e}set restartInterval(t){this.setAttribute("restart-interval",String(t))}get message(){return this._core.message}get error(){return this._core.error}get errorInfo(){return this._core.errorInfo}get running(){return this._core.running}start(){this._core.start(this.src,{type:this.type,name:this.name,restartOnError:this.restartOnError,maxRestarts:this.maxRestarts,restartInterval:this.restartInterval})}post(t,e){this._core.post(t,e)}terminate(){this._core.terminate()}attributeChangedCallback(t,e,r){"src"===t&&this.isConnected&&!this.manual&&r&&this.start()}connectedCallback(){!function(t){const e=t.constructor?.wcBindable,r=e?.inputs;if(void 0!==r)for(const e of r){const r=e.name;if(!Object.prototype.hasOwnProperty.call(t,r))continue;if(!g(t,r))continue;const s=t,n=s[r];delete s[r],s[r]=n}}(this),this.style.display="none",h||(h=!0,document.addEventListener("click",_)),this._connectedCallbackPromise=this._core.observe(),!this.manual&&this.src&&this.start()}disconnectedCallback(){this.keepAlive||this._core.dispose()}}var b;!function(e=customElements){e.get(t.tagNames.worker)||e.define(t.tagNames.worker,d)}(b);
|
|
2
2
|
//# sourceMappingURL=auto.min.js.map
|
package/dist/auto.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto.min.js","sources":["../src/config.ts","../src/core/workerCapabilities.ts","../src/core/WorkerCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/components/Worker.ts","../src/bootstrapWorker.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n worker: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-worker-target\",\n tagNames: {\n worker: \"wcs-worker\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\n// Live reference to the mutable internal config: reads always reflect the latest\n// setConfig() call. The readonly IConfig type only blocks callers from writing\n// through it — the underlying object still changes. If you need a stable,\n// frozen snapshot that won't move under you, use getConfig() instead.\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * workerCapabilities.ts\n *\n * Worker node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。worker は所有する子スレッドに対する command 駆動(start / post / terminate)\n * であり、競合する複数 operation を lane 管理する必要が無い(post は fire-and-forget、\n * start は張り替えを冪等ガード)ため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport type { WcsWorkerErrorDetail } from \"../types.js\";\n\n/** 安定した worker error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WORKER_ERROR_CODE = {\n /** `Worker` コンストラクタ不在(SSR / 非対応環境で構築が投げる)。 */\n CapabilityMissing: \"capability-missing\",\n /** `start(src)` の `src` 未指定(TypeError \"src is required.\")。 */\n InvalidArgument: \"invalid-argument\",\n /** worker スクリプトの uncaught error / messageerror / post 失敗 / 構築失敗など。 */\n WorkerError: \"worker-error\",\n} as const;\n\n/**\n * 正規化済み worker error(`WcsWorkerErrorDetail`)を serializable な error taxonomy に\n * 写す。`.name` で分岐する:\n *\n * - `TypeError` かつ `message === \"src is required.\"` は `start()` 自身の引数検証。\n * WorkerCore.start がこの固定 message で立てる唯一の検証 TypeError なので、runtime の\n * worker error(name は \"Error\" / \"DataError\" 等)や構築失敗の TypeError とは message で\n * 一意に切り分かる → phase=\"start\" / invalid-argument。\n * - それ以外の `TypeError` / `ReferenceError` は `new Worker(...)` の構築失敗。global\n * `Worker` が `undefined` なら `new undefined()` が \"... is not a constructor\"(TypeError)、\n * 素の Node/SSR で `Worker` が未宣言なら \"Worker is not defined\"(ReferenceError)を投げる。\n * いずれも platform API 欠如の顕れ → phase=\"probe\" / capability-missing。runtime の worker\n * error はこの 2 name を名乗らない(_onError は \"Error\"、_onMessageError は \"DataError\")ので\n * 誤爆しない。\n * - それ以外(worker スクリプトの `Error` / messageerror の `DataError` / post の\n * `InvalidStateError` / `DataCloneError` / 構築時の `SecurityError` 等)は稼働中/構築時の\n * 失敗 → phase=\"execute\" / worker-error。\n *\n * いずれも retry で自動回復しない(recoverable=false)。公開 `error` shape は不変。\n */\nexport function deriveWorkerErrorInfo(error: WcsWorkerErrorDetail): WcsIoErrorInfo {\n const { name, message } = error;\n if (name === \"TypeError\" && message === \"src is required.\") {\n return { code: WCS_WORKER_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (name === \"TypeError\" || name === \"ReferenceError\") {\n return { code: WCS_WORKER_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n return { code: WCS_WORKER_ERROR_CODE.WorkerError, phase: \"execute\", recoverable: false, message };\n}\n","import { IWcBindable, WcsWorkerErrorDetail, WcsWorkerStartOptions } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWorkerErrorInfo } from \"./workerCapabilities.js\";\n\n/**\n * Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around\n * the `Worker` API exposed through the wc-bindable protocol.\n *\n * A Worker is a \"headless async message-passing resource that owns a child\n * thread\" — structurally identical to BroadcastCore (structured-clone payloads,\n * no wire encoding, `post` is a `state → element` command-token and an incoming\n * `message` is an `element → state` event-token) with one extra axis: this Core\n * *owns* the underlying resource, so `start()` / `terminate()` spawn and tear\n * down the thread, mirroring how WebSocketCore owns its socket.\n *\n * Message model is bus-style (fire-and-forget `post`, observe `message`), not\n * RPC: there is no request/response correlation. Payloads ride structured clone\n * with NO JSON round-trip (symmetrical with BroadcastCore, deliberately unlike\n * WebSocketCore). The Core never throws — a spawn failure (bad URL, CSP block,\n * absent `Worker`), a non-cloneable `post` (`DataCloneError`), a `post` with no\n * running worker (`InvalidStateError`), an uncaught worker error, and a\n * `messageerror` all flow through the `error` property.\n */\nexport class WorkerCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-worker:message\", semantics: \"event\" },\n { name: \"error\", event: \"wcs-worker:error\", semantics: \"state\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (name + message); the existing\n // `error` property/event are unchanged. Fires wcs-worker:error-info-changed. No\n // lane — the worker is a command-driven owner, not a concurrent-operation node.\n { name: \"errorInfo\", event: \"wcs-worker:error-info-changed\", semantics: \"state\" },\n { name: \"running\", event: \"wcs-worker:running-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"start\" },\n { name: \"post\" },\n { name: \"terminate\" },\n ],\n };\n\n private _target: EventTarget;\n private _worker: Worker | null = null;\n private _message: any = null;\n private _error: WcsWorkerErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _running: boolean = false;\n\n // Spawn configuration, retained so an automatic restart can re-spawn the same\n // script with the same options.\n private _src: string = \"\";\n private _type: WorkerType = \"module\";\n private _name: string = \"\";\n\n // Restart-on-error bookkeeping (opt-in; bounded like WebSocketCore reconnect).\n // `_restartCount` is CUMULATIVE over the worker's lifetime: it counts every\n // restart since the last start() and is NOT reset by a period of stable\n // operation, so `_maxRestarts` bounds total restarts, not consecutive crashes.\n // It is reset to 0 only by start() (a fresh spawn / src switch).\n private _restartOnError: boolean = false;\n private _maxRestarts: number = Infinity;\n private _restartInterval: number = 0;\n private _restartCount: number = 0;\n private _restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation guard (§3.4): bumped on dispose() and captured at restart-timer\n // schedule time. A restart deferred via setTimeout is the Core's only async\n // work; if dispose() runs while it is pending, the stale timer MUST NOT\n // re-spawn a worker on a torn-down element. _clearRestartTimer() already\n // cancels the pending timer from inside the Core, so this guard is\n // defense-in-depth for any path that fires the callback after invalidation.\n private _gen = 0;\n // SSR (§3.8): a worker is command-driven (spawned on start()), so there is no\n // asynchronous probe to await — readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). The worker is command-driven (start/post/terminate), so\n // there is no subscription to establish up front: observe() is an idempotent\n // no-op that resolves once ready. dispose() (below) tears down the worker,\n // cancels any pending restart and invalidates in-flight async via _gen.\n observe(): Promise<void> {\n return this._ready;\n }\n\n get message(): any {\n return this._message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-worker:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get running(): boolean {\n return this._running;\n }\n\n // --- State setters with event dispatch ---\n\n // Deliberately NO same-value guard. An incoming message is an event, not\n // idempotent state: the worker posting the same value twice is two distinct\n // occurrences and must re-fire wcs-worker:message each time so a `message:`\n // binding and any `eventToken.message:` subscriber see both.\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n // Same-value guard. `error` has no derived state, so suppressing redundant\n // null→null dispatches (e.g. a successful spawn clearing an already-null error)\n // avoids spurious events. Reference identity suffices: each failure builds a\n // fresh object and the clear path always passes null.\n private _setError(error: WcsWorkerErrorDetail | null): void {\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // normalized error (name + message), or null on clear. Fires before the `error`\n // event so an observer binding both sees the classification first, mirroring the\n // io-node family.\n this._commitErrorInfo(error === null ? null : deriveWorkerErrorInfo(error));\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n // No same-value guard needed: every spawn (`start`, restart) goes through\n // `_spawn` (false→true) only after `_terminateWorker` (true→false, guarded by\n // `_worker`), so `running` only ever moves on a real transition.\n private _setRunning(running: boolean): void {\n this._running = running;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:running-changed\", {\n detail: running,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Spawn the worker from `src`. Any previously-spawned worker is terminated\n * first, so calling `start()` again with a different `src` switches scripts.\n * Idempotent on the same `src` (re-spawning the script we are already running\n * is pure churn) — this also absorbs the custom-element upgrade path where a\n * connected element with a `src` attribute triggers both\n * attributeChangedCallback and connectedCallback, calling start() twice. A\n * consequence of this guard: changing only the options (`type`, `name`,\n * restart-*) while running the same `src` is ignored — call `terminate()`\n * then `start()` to re-spawn with new options. Never throws: a spawn failure\n * surfaces through `error`.\n */\n start(src: string, options: WcsWorkerStartOptions = {}): void {\n if (!src) {\n this._setError({ name: \"TypeError\", message: \"src is required.\" });\n return;\n }\n if (this._worker && this._src === src) return;\n\n this._clearRestartTimer();\n this._terminateWorker();\n\n this._src = src;\n this._type = options.type ?? \"module\";\n this._name = options.name ?? \"\";\n this._restartOnError = options.restartOnError ?? false;\n this._maxRestarts = options.maxRestarts ?? Infinity;\n this._restartInterval = options.restartInterval ?? 0;\n this._restartCount = 0;\n\n this._setError(null);\n this._spawn();\n }\n\n /**\n * Post a structured-cloneable value to the worker. The optional `transfer`\n * list moves ownership of `Transferable`s (ArrayBuffer, MessagePort, ...) — the\n * escape hatch the declarative layer cannot express. Never throws: a\n * non-cloneable value surfaces as `DataCloneError` and posting with no running\n * worker surfaces an `InvalidStateError`, both through `error`.\n */\n post(data: any, transfer?: Transferable[]): void {\n if (!this._worker) {\n this._setError({\n name: \"InvalidStateError\",\n message: \"Worker is not running. Call start(src) before post().\",\n });\n return;\n }\n try {\n if (transfer && transfer.length > 0) {\n this._worker.postMessage(data, transfer);\n } else {\n this._worker.postMessage(data);\n }\n } catch (err) {\n this._setError(this._normalizeError(err));\n }\n }\n\n /** Terminate the worker. Idempotent — a no-op when none is running. */\n terminate(): void {\n this._clearRestartTimer();\n this._terminateWorker();\n }\n\n /**\n * Tear the Core down for a disconnected Shell: terminate the worker and reset\n * the error shadow (both `error` and its derived `errorInfo`). Only that\n * error/errorInfo clear is silent — it mutates the shadows without dispatching.\n * Terminating a *running* worker still dispatches\n * `wcs-worker:running-changed` (true→false) via `_terminateWorker`, so a\n * dispose on a worker that was live does emit one event on the (now\n * disconnected) element; only a no-op dispose (no worker running) is fully\n * silent.\n *\n * Asymmetry by design: `_message` is deliberately NOT reset. `error` is\n * transient state — a stale error from a previous worker would mislead after a\n * reconnect, so it is cleared. `message` is the last value received (an event\n * payload); it is retained as the Core's last-known datum and is naturally\n * overwritten by the next incoming message.\n */\n dispose(): void {\n // §3.4: invalidate any in-flight async (a pending restart timer) before\n // tearing down, so a stale timer that somehow fires cannot re-spawn.\n this._gen++;\n this._clearRestartTimer();\n this._terminateWorker();\n // Silent shadow reset (no dispatch), mirroring `_error`: keep `errorInfo`'s\n // clear-to-null invariant so a reconnect does not read a stale classification.\n this._error = null;\n this._errorInfo = null;\n }\n\n // --- Internal ---\n\n private _spawn(): void {\n try {\n this._worker = new Worker(this._src, { type: this._type, name: this._name || undefined });\n } catch (err) {\n this._setError(this._normalizeError(err));\n return;\n }\n this._worker.addEventListener(\"message\", this._onMessage);\n this._worker.addEventListener(\"messageerror\", this._onMessageError);\n this._worker.addEventListener(\"error\", this._onError);\n this._setRunning(true);\n }\n\n private _onMessage = (event: MessageEvent): void => {\n this._setMessage(event.data);\n };\n\n // Fired when the worker posted a value this context cannot deserialize. The\n // event carries no usable payload, so report a synthetic DataError.\n private _onMessageError = (): void => {\n this._setError({\n name: \"DataError\",\n message: \"Failed to deserialize a message received from the worker.\",\n });\n };\n\n // An uncaught error inside the worker script. The worker itself stays alive\n // (the platform does not auto-terminate it), so restart-on-error explicitly\n // re-spawns a fresh worker when enabled and the bound is not exhausted.\n private _onError = (event: ErrorEvent): void => {\n this._setError({\n name: \"Error\",\n message: event.message || \"Worker script error.\",\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n if (this._restartOnError && this._restartCount < this._maxRestarts) {\n this._scheduleRestart();\n }\n };\n\n private _scheduleRestart(): void {\n this._clearRestartTimer();\n const gen = this._gen;\n this._restartTimer = setTimeout(() => {\n // §3.4: a dispose() between scheduling and firing bumps _gen; skip the\n // re-spawn so a torn-down Core does not resurrect a worker.\n if (gen !== this._gen) return;\n this._restartTimer = null;\n this._restartCount++;\n this._terminateWorker();\n // Clear the crash error BEFORE re-spawning so a successful restart leaves a\n // consistent running=true / error=null state (an `error` binding must not\n // keep showing the previous script's failure once the fresh worker is live).\n // Order matters: _spawn() re-sets `error` if the new spawn itself fails, so\n // a failed restart still surfaces its own error rather than null.\n this._setError(null);\n this._spawn();\n }, this._restartInterval);\n }\n\n private _clearRestartTimer(): void {\n if (this._restartTimer !== null) {\n clearTimeout(this._restartTimer);\n this._restartTimer = null;\n }\n }\n\n private _terminateWorker(): void {\n if (!this._worker) return;\n this._worker.removeEventListener(\"message\", this._onMessage);\n this._worker.removeEventListener(\"messageerror\", this._onMessageError);\n this._worker.removeEventListener(\"error\", this._onError);\n this._worker.terminate();\n this._worker = null;\n this._setRunning(false);\n }\n\n private _normalizeError(err: unknown): WcsWorkerErrorDetail {\n if (err instanceof Error) {\n // DOMException is an Error subclass; its `name` (DataCloneError, etc.) is\n // the meaningful discriminator for consumers switching on failure kind.\n return { name: err.name, message: err.message };\n }\n return { name: \"Error\", message: String(err) };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWorker } from \"./components/Worker.js\";\n\nlet registered = false;\n\n// Attribute names for the optional post-on-click DOM trigger (clipboard.js-style\n// DX). The element carrying `data-worker-target` points at a <wcs-worker> by id;\n// the payload to post comes from either a literal `data-worker-text` or a\n// `data-worker-from` CSS selector resolving to a source element.\nconst TEXT_ATTRIBUTE = \"data-worker-text\";\nconst FROM_ATTRIBUTE = \"data-worker-from\";\n\nfunction resolveText(triggerElement: Element): string | null {\n // Literal text wins when present (including an empty string — posting \"\" is a\n // legitimate request). The `?? \"\"` right-hand side is defensive and\n // unreachable: hasAttribute() just returned true, so getAttribute() cannot be\n // null here. It exists only to satisfy the `string | null` return type — do\n // not chase coverage on it (the DOM contract makes the null branch impossible).\n if (triggerElement.hasAttribute(TEXT_ATTRIBUTE)) {\n return triggerElement.getAttribute(TEXT_ATTRIBUTE) ?? \"\";\n }\n const selector = triggerElement.getAttribute(FROM_ATTRIBUTE);\n if (!selector) return null;\n // A user-authored selector can be syntactically invalid (e.g. `[data-*` or a\n // bare `:not()`), which makes querySelector throw a SyntaxError. Swallow it and\n // treat the source as unresolvable — the same \"nothing to post\" path as a\n // selector that matches no element — so one bad attribute never crashes the\n // document-level click handler and kills autoTrigger for the whole tab.\n let source: Element | null;\n try {\n source = document.querySelector(selector);\n } catch {\n return null;\n }\n if (!source) return null;\n // Read a form control's `value`; fall back to text content. A bare\n // `\"value\" in source` check is too broad — it also matches <button>,\n // <li value>, <progress>, etc. (which carry an unrelated `value`), posting the\n // wrong thing. Narrow to the text-bearing controls a user actually points\n // `data-worker-from` at; everything else falls through to textContent.\n if (\n source instanceof HTMLInputElement ||\n source instanceof HTMLTextAreaElement ||\n source instanceof HTMLSelectElement\n ) {\n return source.value;\n }\n // `?? \"\"` is defensive: per the DOM spec only Document / DocumentType /\n // Notation nodes have a null `textContent`, and querySelector only ever returns\n // an Element (whose textContent is always a string). The branch is therefore\n // unreachable in practice and kept solely for the `string | null` type — not\n // worth a contrived test.\n return source.textContent ?? \"\";\n}\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const workerId = triggerElement.getAttribute(config.triggerAttribute);\n if (!workerId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWorker as a value (avoids a components ⇄ autoTrigger import cycle:\n // Worker.connectedCallback() calls registerAutoTrigger()). instanceof against\n // the customElements registry keeps the same identity guarantee.\n const WorkerCtor = customElements.get(config.tagNames.worker);\n const workerElement = document.getElementById(workerId);\n if (!WorkerCtor || !(workerElement instanceof WorkerCtor)) return;\n\n const text = resolveText(triggerElement);\n // No resolvable source: leave the click alone (do not preventDefault) so the\n // element's default action is unaffected.\n if (text === null) return;\n\n // Suppress the default action so a post can run without navigating. Intentional:\n // do not attach data-worker-target to an element whose default action you also\n // want (a real <a href> link). See README \"Optional DOM Triggering\".\n event.preventDefault();\n (workerElement as WcsWorker).post(text);\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, WcsWorkerErrorDetail } from \"../types.js\";\nimport { WorkerCore } from \"../core/WorkerCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n// Named WcsWorker (not `Worker`) to avoid shadowing the global `Worker`\n// constructor and to match the <wcs-broadcast> WcsBroadcast / <wcs-ws>\n// WcsWebSocket convention.\nexport class WcsWorker extends HTMLElement {\n // SSR (§4.1/§4.4): expose connectedCallbackPromise backed by _core.observe()\n // so a shell renderer can await first-connect readiness uniformly across all\n // IO nodes. The worker still spawns synchronously in connectedCallback; the\n // Core's observe() resolves immediately (command-driven, no async probe), so\n // the promise is effectively already-resolved but the contract is honored.\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WorkerCore.wcBindable,\n // Shell-level settable surface. `src` selects the script; `manual` suppresses\n // auto-spawn; `keep-alive` keeps the worker past disconnect; the restart-*\n // inputs configure opt-in restart-on-error. There is no momentary `post`\n // property: posting needs an argument (the payload), so element actions run\n // via command-token (`command.post: $command.ping`) or the DOM autoTrigger,\n // keeping `post` a plain command and the `command.post:` wiring readable.\n inputs: [\n { name: \"src\", attribute: \"src\" },\n { name: \"type\", attribute: \"type\" },\n { name: \"name\", attribute: \"name\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"keepAlive\", attribute: \"keep-alive\" },\n { name: \"restartOnError\", attribute: \"restart-on-error\" },\n { name: \"maxRestarts\", attribute: \"max-restarts\" },\n { name: \"restartInterval\", attribute: \"restart-interval\" },\n ],\n // Commands are identical to the Core's — the attribute accessors (src, type,\n // name, ...) do not collide with start/post/terminate.\n commands: WorkerCore.wcBindable.commands,\n };\n static get observedAttributes(): string[] { return [\"src\"]; }\n\n private _core: WorkerCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WorkerCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-worker:running-changed\": (d) => ({ running: d === true }),\n \"wcs-worker:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get src(): string {\n return this.getAttribute(\"src\") || \"\";\n }\n\n set src(value: string) {\n this.setAttribute(\"src\", value);\n }\n\n get type(): WorkerType {\n return this.getAttribute(\"type\") === \"classic\" ? \"classic\" : \"module\";\n }\n\n set type(value: WorkerType) {\n this.setAttribute(\"type\", value);\n }\n\n get name(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n set name(value: string) {\n this.setAttribute(\"name\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get keepAlive(): boolean {\n return this.hasAttribute(\"keep-alive\");\n }\n\n set keepAlive(value: boolean) {\n if (value) {\n this.setAttribute(\"keep-alive\", \"\");\n } else {\n this.removeAttribute(\"keep-alive\");\n }\n }\n\n get restartOnError(): boolean {\n return this.hasAttribute(\"restart-on-error\");\n }\n\n set restartOnError(value: boolean) {\n if (value) {\n this.setAttribute(\"restart-on-error\", \"\");\n } else {\n this.removeAttribute(\"restart-on-error\");\n }\n }\n\n get maxRestarts(): number {\n const attr = this.getAttribute(\"max-restarts\");\n // `max-restarts=\"Infinity\"` is the documented default-equivalent for an\n // unbounded restart budget. parseInt(\"Infinity\", 10) is NaN, so match it\n // explicitly rather than leaning on the NaN fallback (which would silently\n // break if that fallback ever changed). Any other non-numeric value still\n // falls back to Infinity via the NaN guard.\n if (attr === \"Infinity\") return Infinity;\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxRestarts(value: number) {\n this.setAttribute(\"max-restarts\", String(value));\n }\n\n get restartInterval(): number {\n const attr = this.getAttribute(\"restart-interval\");\n const parsed = attr ? parseInt(attr, 10) : 0;\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n set restartInterval(value: number) {\n this.setAttribute(\"restart-interval\", String(value));\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get running(): boolean {\n return this._core.running;\n }\n\n // --- Commands ---\n\n start(): void {\n // Delegate unconditionally — including the empty-`src` case — so the Core's\n // never-throw contract holds at the Shell boundary too: start(\"\") raises a\n // TypeError through `error` rather than failing silently. The auto-spawn\n // paths (connectedCallback / attributeChangedCallback) already gate on a\n // non-empty `src`, so this only affects an explicit `el.start()` call.\n this._core.start(this.src, {\n type: this.type,\n name: this.name,\n restartOnError: this.restartOnError,\n maxRestarts: this.maxRestarts,\n restartInterval: this.restartInterval,\n });\n }\n\n post(data: any, transfer?: Transferable[]): void {\n this._core.post(data, transfer);\n }\n\n terminate(): void {\n this._core.terminate();\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"src\" && this.isConnected && !this.manual && newValue) {\n this.start();\n }\n }\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // SSR (§4.4): back connectedCallbackPromise with the Core's observe(). It\n // resolves immediately for this command-driven node, but wiring it keeps the\n // readiness contract uniform with the async-init IO nodes.\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.src) {\n this.start();\n }\n }\n\n disconnectedCallback(): void {\n // Deliberately does NOT call unregisterAutoTrigger(). The autoTrigger click\n // listener is a single process-wide document listener (registerAutoTrigger\n // is idempotent), shared by every <wcs-worker> on the page — not owned by\n // this element. Tearing it down when the last element disconnects would\n // break a later-inserted trigger, so it is intentionally left installed for\n // the document's lifetime (one passive listener, negligible cost). This\n // mirrors <wcs-broadcast> / <wcs-clipboard>, which register but never\n // unregister either; unregisterAutoTrigger stays exported purely as a\n // symmetric teardown hook for tests / advanced manual control.\n //\n // keep-alive intentionally leaves the worker running past disconnect: the\n // worker outlives the element and ownership transfers to the caller, who must\n // call terminate() to free the thread. Without keep-alive the worker is torn\n // down like <wcs-ws> / <wcs-broadcast> close on disconnect.\n if (!this.keepAlive) {\n this._core.dispose();\n }\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWorker(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsWorker } from \"./components/Worker.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.worker)) {\n registry.define(config.tagNames.worker, WcsWorker);\n }\n}\n"],"names":["config","triggerAttribute","tagNames","worker","WCS_WORKER_ERROR_CODE","WorkerCore","EventTarget","static","protocol","version","properties","name","event","semantics","commands","_target","_worker","_message","_error","_errorInfo","_running","_src","_type","_name","_restartOnError","_maxRestarts","Infinity","_restartInterval","_restartCount","_restartTimer","_gen","_ready","Promise","resolve","constructor","target","super","this","ready","observe","message","error","errorInfo","running","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setError","_commitErrorInfo","code","phase","recoverable","deriveWorkerErrorInfo","info","_setRunning","start","src","options","_clearRestartTimer","_terminateWorker","type","restartOnError","maxRestarts","restartInterval","_spawn","post","data","transfer","length","postMessage","err","_normalizeError","terminate","dispose","Worker","undefined","addEventListener","_onMessage","_onMessageError","_onError","filename","lineno","colno","_scheduleRestart","gen","setTimeout","clearTimeout","removeEventListener","Error","String","registered","TEXT_ATTRIBUTE","handleClick","Element","triggerElement","closest","workerId","getAttribute","WorkerCtor","customElements","get","workerElement","document","getElementById","text","hasAttribute","selector","source","querySelector","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","value","textContent","resolveText","preventDefault","hasAccessorOnPrototype","proto","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","set","WcsWorker","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","connectedCallbackPromise","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","e","debug","on","toggleAttribute","setAttribute","manual","removeAttribute","keepAlive","attr","parsed","parseInt","Number","isNaN","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","element","declaration","input","prototype","hasOwnProperty","call","record","upgradeProperties","style","display","disconnectedCallback","registry","define","registerComponents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auto.min.js","sources":["../src/config.ts","../src/core/workerCapabilities.ts","../src/trustedTypes.ts","../src/core/WorkerCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/components/Worker.ts","../src/bootstrapWorker.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n worker: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-worker-target\",\n tagNames: {\n worker: \"wcs-worker\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\n// Live reference to the mutable internal config: reads always reflect the latest\n// setConfig() call. The readonly IConfig type only blocks callers from writing\n// through it — the underlying object still changes. If you need a stable,\n// frozen snapshot that won't move under you, use getConfig() instead.\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * workerCapabilities.ts\n *\n * Worker node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。worker は所有する子スレッドに対する command 駆動(start / post / terminate)\n * であり、競合する複数 operation を lane 管理する必要が無い(post は fire-and-forget、\n * start は張り替えを冪等ガード)ため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport type { WcsWorkerErrorDetail } from \"../types.js\";\n\n/** 安定した worker error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WORKER_ERROR_CODE = {\n /** `Worker` コンストラクタ不在(SSR / 非対応環境で構築が投げる)。 */\n CapabilityMissing: \"capability-missing\",\n /** `start(src)` の `src` 未指定(TypeError \"src is required.\")。 */\n InvalidArgument: \"invalid-argument\",\n /** worker スクリプトの uncaught error / messageerror / post 失敗 / 構築失敗など。 */\n WorkerError: \"worker-error\",\n} as const;\n\n/**\n * 正規化済み worker error(`WcsWorkerErrorDetail`)を serializable な error taxonomy に\n * 写す。`.name` で分岐する:\n *\n * - `TypeError` かつ `message === \"src is required.\"` は `start()` 自身の引数検証。\n * WorkerCore.start がこの固定 message で立てる唯一の検証 TypeError なので、runtime の\n * worker error(name は \"Error\" / \"DataError\" 等)や構築失敗の TypeError とは message で\n * 一意に切り分かる → phase=\"start\" / invalid-argument。\n * - それ以外の `TypeError` / `ReferenceError` は `new Worker(...)` の構築失敗。global\n * `Worker` が `undefined` なら `new undefined()` が \"... is not a constructor\"(TypeError)、\n * 素の Node/SSR で `Worker` が未宣言なら \"Worker is not defined\"(ReferenceError)を投げる。\n * いずれも platform API 欠如の顕れ → phase=\"probe\" / capability-missing。runtime の worker\n * error はこの 2 name を名乗らない(_onError は \"Error\"、_onMessageError は \"DataError\")ので\n * 誤爆しない。\n * - それ以外(worker スクリプトの `Error` / messageerror の `DataError` / post の\n * `InvalidStateError` / `DataCloneError` / 構築時の `SecurityError` 等)は稼働中/構築時の\n * 失敗 → phase=\"execute\" / worker-error。\n *\n * いずれも retry で自動回復しない(recoverable=false)。公開 `error` shape は不変。\n */\nexport function deriveWorkerErrorInfo(error: WcsWorkerErrorDetail): WcsIoErrorInfo {\n const { name, message } = error;\n if (name === \"TypeError\" && message === \"src is required.\") {\n return { code: WCS_WORKER_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (name === \"TypeError\" || name === \"ReferenceError\") {\n return { code: WCS_WORKER_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n return { code: WCS_WORKER_ERROR_CODE.WorkerError, phase: \"execute\", recoverable: false, message };\n}\n","/**\n * Trusted Types (`require-trusted-types-for 'script'`) 対応。正本は docs/csp.md §7。\n *\n * `new Worker(url)` は TrustedScriptURL sink なので、TT 強制下では素の文字列を渡すと\n * 落ちる。ただしここに来る URL は `<wcs-worker src=\"...\">`=**作者が書いた属性値**で\n * あって、ユーザー入力でもレスポンスでもない。加えて worker のスクリプト取得元は\n * `worker-src` で別途縛られている。よってここは identity policy で署名してよい層。\n *\n * policy 名は全 @wcstack パッケージで単一の `wcstack` に固定し、生成結果をグローバル\n * スロットで共有する(`trusted-types` ディレクティブがある場合、`'allow-duplicates'`\n * 無しの重複生成は例外になるため)。\n *\n * **利用側が注入した policy はここでは優先しない。** 注入口は「信頼できない値に対する\n * sanitizer」として使われる想定なので、作者が書いた `src` をそこに通す理由が無い。\n * identity policy を作れなかったときだけフォールバックし、その場合は 1 度警告する。\n */\n\nexport interface IWcsTrustedTypesPolicy {\n createHTML?(input: string): unknown;\n createScriptURL?(input: string): unknown;\n}\n\n/** 利用側が policy を差し込むグローバルスロット(全 @wcstack パッケージ共通)。 */\nexport const TRUSTED_TYPES_POLICY_SLOT = Symbol.for(\"wcstack.trustedTypes.policy\");\n\n/** wcstack が生成した identity policy を共有するスロット(内部用)。 */\nconst INTERNAL_POLICY_SLOT = Symbol.for(\"wcstack.trustedTypes.internal\");\n\nconst POLICY_NAME = \"wcstack\";\n\ntype SymbolSlotHolder = { [key: symbol]: unknown };\n\ninterface ITrustedTypesFactory {\n createPolicy(name: string, rules: {\n createHTML(input: string): string;\n createScriptURL(input: string): string;\n }): IWcsTrustedTypesPolicy;\n}\n\n/** 利用側が注入した policy。 */\nexport function getTrustedTypesPolicy(): IWcsTrustedTypesPolicy | null {\n const value = (globalThis as SymbolSlotHolder)[TRUSTED_TYPES_POLICY_SLOT];\n if (value === null || typeof value !== \"object\") return null;\n return value as IWcsTrustedTypesPolicy;\n}\n\n/** 利用側 policy を設定する(`null` で解除)。 */\nexport function setTrustedTypesPolicy(policy: IWcsTrustedTypesPolicy | null): void {\n (globalThis as SymbolSlotHolder)[TRUSTED_TYPES_POLICY_SLOT] = policy;\n}\n\n/** テスト用: 共有 identity policy のキャッシュを捨てる。 */\nexport function _resetInternalTrustedTypesPolicy(): void {\n delete (globalThis as SymbolSlotHolder)[INTERNAL_POLICY_SLOT];\n}\n\n/**\n * 作者制御の文字列に署名するための共有 identity policy。TT 非対応ブラウザでは\n * null(呼び出し側は生文字列のまま進む)。生成失敗も null をキャッシュして、\n * 診断は 1 度だけ出す。\n */\nfunction getInternalPolicy(): IWcsTrustedTypesPolicy | null {\n const holder = globalThis as SymbolSlotHolder;\n const cached = holder[INTERNAL_POLICY_SLOT];\n if (cached !== undefined) return cached as IWcsTrustedTypesPolicy | null;\n\n const factory = (globalThis as { trustedTypes?: ITrustedTypesFactory }).trustedTypes;\n let policy: IWcsTrustedTypesPolicy | null = null;\n if (factory && typeof factory.createPolicy === \"function\") {\n try {\n policy = factory.createPolicy(POLICY_NAME, {\n createHTML: (input: string) => input,\n createScriptURL: (input: string) => input,\n });\n } catch (error) {\n // 利用側 policy に落ちられるなら、報告は初回使用時の 1 回の warn(trustAuthoredScriptURL)\n // に任せる — docs/csp.md §7。落ちる先が無いときだけ、直し方付きで error にする\n if (typeof getTrustedTypesPolicy()?.createScriptURL !== \"function\") {\n console.error(\n `[@wcstack/worker] Could not create the Trusted Types policy \"${POLICY_NAME}\". `\n + `Allow it in the CSP (\\`trusted-types ${POLICY_NAME};\\`), or inject your own policy `\n + `at globalThis[Symbol.for(\"wcstack.trustedTypes.policy\")]. See docs/csp.md section 7.`,\n error,\n );\n }\n }\n }\n holder[INTERNAL_POLICY_SLOT] = policy;\n return policy;\n}\n\nlet _fallbackWarned = false;\n\n/** テスト用: フォールバック警告の一度きりフラグを戻す。 */\nexport function _resetAuthoredFallbackWarning(): void {\n _fallbackWarned = false;\n}\n\n/**\n * 作者が書いたスクリプト URL を TrustedScriptURL に変換する。\n *\n * 解決順は 共有 identity policy > (TT はあるが identity policy を作れなかった場合のみ)\n * 利用側 policy > 生文字列。TT 非対応ブラウザでは署名自体が不要なので素通しする。\n */\nexport function trustAuthoredScriptURL(url: string): string {\n const internal = getInternalPolicy();\n const internalCreate = internal?.createScriptURL;\n if (typeof internalCreate === \"function\") {\n return internalCreate.call(internal, url) as string;\n }\n if (!(\"trustedTypes\" in globalThis)) return url;\n\n const adopted = getTrustedTypesPolicy();\n const adoptedCreate = adopted?.createScriptURL;\n if (typeof adoptedCreate === \"function\") {\n if (!_fallbackWarned) {\n _fallbackWarned = true;\n console.warn(\n `[@wcstack/worker] Falling back to the injected Trusted Types policy to sign the worker `\n + `URL, because the \"${POLICY_NAME}\" policy could not be created. `\n + `Allow \\`trusted-types ${POLICY_NAME};\\` in the CSP to avoid this. See docs/csp.md section 7.`,\n );\n }\n return adoptedCreate.call(adopted, url) as string;\n }\n return url;\n}\n","import { IWcBindable, WcsWorkerErrorDetail, WcsWorkerStartOptions } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWorkerErrorInfo } from \"./workerCapabilities.js\";\nimport { trustAuthoredScriptURL } from \"../trustedTypes.js\";\n\n/**\n * Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around\n * the `Worker` API exposed through the wc-bindable protocol.\n *\n * A Worker is a \"headless async message-passing resource that owns a child\n * thread\" — structurally identical to BroadcastCore (structured-clone payloads,\n * no wire encoding, `post` is a `state → element` command-token and an incoming\n * `message` is an `element → state` event-token) with one extra axis: this Core\n * *owns* the underlying resource, so `start()` / `terminate()` spawn and tear\n * down the thread, mirroring how WebSocketCore owns its socket.\n *\n * Message model is bus-style (fire-and-forget `post`, observe `message`), not\n * RPC: there is no request/response correlation. Payloads ride structured clone\n * with NO JSON round-trip (symmetrical with BroadcastCore, deliberately unlike\n * WebSocketCore). The Core never throws — a spawn failure (bad URL, CSP block,\n * absent `Worker`), a non-cloneable `post` (`DataCloneError`), a `post` with no\n * running worker (`InvalidStateError`), an uncaught worker error, and a\n * `messageerror` all flow through the `error` property.\n */\nexport class WorkerCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-worker:message\", semantics: \"event\" },\n { name: \"error\", event: \"wcs-worker:error\", semantics: \"state\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (name + message); the existing\n // `error` property/event are unchanged. Fires wcs-worker:error-info-changed. No\n // lane — the worker is a command-driven owner, not a concurrent-operation node.\n { name: \"errorInfo\", event: \"wcs-worker:error-info-changed\", semantics: \"state\" },\n { name: \"running\", event: \"wcs-worker:running-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"start\" },\n { name: \"post\" },\n { name: \"terminate\" },\n ],\n };\n\n private _target: EventTarget;\n private _worker: Worker | null = null;\n private _message: any = null;\n private _error: WcsWorkerErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _running: boolean = false;\n\n // Spawn configuration, retained so an automatic restart can re-spawn the same\n // script with the same options.\n private _src: string = \"\";\n private _type: WorkerType = \"module\";\n private _name: string = \"\";\n\n // Restart-on-error bookkeeping (opt-in; bounded like WebSocketCore reconnect).\n // `_restartCount` is CUMULATIVE over the worker's lifetime: it counts every\n // restart since the last start() and is NOT reset by a period of stable\n // operation, so `_maxRestarts` bounds total restarts, not consecutive crashes.\n // It is reset to 0 only by start() (a fresh spawn / src switch).\n private _restartOnError: boolean = false;\n private _maxRestarts: number = Infinity;\n private _restartInterval: number = 0;\n private _restartCount: number = 0;\n private _restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation guard (§3.4): bumped on dispose() and captured at restart-timer\n // schedule time. A restart deferred via setTimeout is the Core's only async\n // work; if dispose() runs while it is pending, the stale timer MUST NOT\n // re-spawn a worker on a torn-down element. _clearRestartTimer() already\n // cancels the pending timer from inside the Core, so this guard is\n // defense-in-depth for any path that fires the callback after invalidation.\n private _gen = 0;\n // SSR (§3.8): a worker is command-driven (spawned on start()), so there is no\n // asynchronous probe to await — readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). The worker is command-driven (start/post/terminate), so\n // there is no subscription to establish up front: observe() is an idempotent\n // no-op that resolves once ready. dispose() (below) tears down the worker,\n // cancels any pending restart and invalidates in-flight async via _gen.\n observe(): Promise<void> {\n return this._ready;\n }\n\n get message(): any {\n return this._message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-worker:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get running(): boolean {\n return this._running;\n }\n\n // --- State setters with event dispatch ---\n\n // Deliberately NO same-value guard. An incoming message is an event, not\n // idempotent state: the worker posting the same value twice is two distinct\n // occurrences and must re-fire wcs-worker:message each time so a `message:`\n // binding and any `eventToken.message:` subscriber see both.\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n // Same-value guard. `error` has no derived state, so suppressing redundant\n // null→null dispatches (e.g. a successful spawn clearing an already-null error)\n // avoids spurious events. Reference identity suffices: each failure builds a\n // fresh object and the clear path always passes null.\n private _setError(error: WcsWorkerErrorDetail | null): void {\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // normalized error (name + message), or null on clear. Fires before the `error`\n // event so an observer binding both sees the classification first, mirroring the\n // io-node family.\n this._commitErrorInfo(error === null ? null : deriveWorkerErrorInfo(error));\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n // No same-value guard needed: every spawn (`start`, restart) goes through\n // `_spawn` (false→true) only after `_terminateWorker` (true→false, guarded by\n // `_worker`), so `running` only ever moves on a real transition.\n private _setRunning(running: boolean): void {\n this._running = running;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:running-changed\", {\n detail: running,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Spawn the worker from `src`. Any previously-spawned worker is terminated\n * first, so calling `start()` again with a different `src` switches scripts.\n * Idempotent on the same `src` (re-spawning the script we are already running\n * is pure churn) — this also absorbs the custom-element upgrade path where a\n * connected element with a `src` attribute triggers both\n * attributeChangedCallback and connectedCallback, calling start() twice. A\n * consequence of this guard: changing only the options (`type`, `name`,\n * restart-*) while running the same `src` is ignored — call `terminate()`\n * then `start()` to re-spawn with new options. Never throws: a spawn failure\n * surfaces through `error`.\n */\n start(src: string, options: WcsWorkerStartOptions = {}): void {\n if (!src) {\n this._setError({ name: \"TypeError\", message: \"src is required.\" });\n return;\n }\n if (this._worker && this._src === src) return;\n\n this._clearRestartTimer();\n this._terminateWorker();\n\n this._src = src;\n this._type = options.type ?? \"module\";\n this._name = options.name ?? \"\";\n this._restartOnError = options.restartOnError ?? false;\n this._maxRestarts = options.maxRestarts ?? Infinity;\n this._restartInterval = options.restartInterval ?? 0;\n this._restartCount = 0;\n\n this._setError(null);\n this._spawn();\n }\n\n /**\n * Post a structured-cloneable value to the worker. The optional `transfer`\n * list moves ownership of `Transferable`s (ArrayBuffer, MessagePort, ...) — the\n * escape hatch the declarative layer cannot express. Never throws: a\n * non-cloneable value surfaces as `DataCloneError` and posting with no running\n * worker surfaces an `InvalidStateError`, both through `error`.\n */\n post(data: any, transfer?: Transferable[]): void {\n if (!this._worker) {\n this._setError({\n name: \"InvalidStateError\",\n message: \"Worker is not running. Call start(src) before post().\",\n });\n return;\n }\n try {\n if (transfer && transfer.length > 0) {\n this._worker.postMessage(data, transfer);\n } else {\n this._worker.postMessage(data);\n }\n } catch (err) {\n this._setError(this._normalizeError(err));\n }\n }\n\n /** Terminate the worker. Idempotent — a no-op when none is running. */\n terminate(): void {\n this._clearRestartTimer();\n this._terminateWorker();\n }\n\n /**\n * Tear the Core down for a disconnected Shell: terminate the worker and reset\n * the error shadow (both `error` and its derived `errorInfo`). Only that\n * error/errorInfo clear is silent — it mutates the shadows without dispatching.\n * Terminating a *running* worker still dispatches\n * `wcs-worker:running-changed` (true→false) via `_terminateWorker`, so a\n * dispose on a worker that was live does emit one event on the (now\n * disconnected) element; only a no-op dispose (no worker running) is fully\n * silent.\n *\n * Asymmetry by design: `_message` is deliberately NOT reset. `error` is\n * transient state — a stale error from a previous worker would mislead after a\n * reconnect, so it is cleared. `message` is the last value received (an event\n * payload); it is retained as the Core's last-known datum and is naturally\n * overwritten by the next incoming message.\n */\n dispose(): void {\n // §3.4: invalidate any in-flight async (a pending restart timer) before\n // tearing down, so a stale timer that somehow fires cannot re-spawn.\n this._gen++;\n this._clearRestartTimer();\n this._terminateWorker();\n // Silent shadow reset (no dispatch), mirroring `_error`: keep `errorInfo`'s\n // clear-to-null invariant so a reconnect does not read a stale classification.\n this._error = null;\n this._errorInfo = null;\n }\n\n // --- Internal ---\n\n private _spawn(): void {\n try {\n // `new Worker(url)` は TrustedScriptURL sink。src は作者が書いた属性値なので\n // 共有 identity policy で署名してよい層(docs/csp.md §7)。TT 非対応ブラウザでは\n // 生文字列がそのまま返る。policy 生成に失敗した場合もここは従来どおり進み、\n // 実際の失敗は既存の catch が error / errorInfo に落とす。\n this._worker = new Worker(trustAuthoredScriptURL(this._src), { type: this._type, name: this._name || undefined });\n } catch (err) {\n this._setError(this._normalizeError(err));\n return;\n }\n this._worker.addEventListener(\"message\", this._onMessage);\n this._worker.addEventListener(\"messageerror\", this._onMessageError);\n this._worker.addEventListener(\"error\", this._onError);\n this._setRunning(true);\n }\n\n private _onMessage = (event: MessageEvent): void => {\n this._setMessage(event.data);\n };\n\n // Fired when the worker posted a value this context cannot deserialize. The\n // event carries no usable payload, so report a synthetic DataError.\n private _onMessageError = (): void => {\n this._setError({\n name: \"DataError\",\n message: \"Failed to deserialize a message received from the worker.\",\n });\n };\n\n // An uncaught error inside the worker script. The worker itself stays alive\n // (the platform does not auto-terminate it), so restart-on-error explicitly\n // re-spawns a fresh worker when enabled and the bound is not exhausted.\n private _onError = (event: ErrorEvent): void => {\n this._setError({\n name: \"Error\",\n message: event.message || \"Worker script error.\",\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n if (this._restartOnError && this._restartCount < this._maxRestarts) {\n this._scheduleRestart();\n }\n };\n\n private _scheduleRestart(): void {\n this._clearRestartTimer();\n const gen = this._gen;\n this._restartTimer = setTimeout(() => {\n // §3.4: a dispose() between scheduling and firing bumps _gen; skip the\n // re-spawn so a torn-down Core does not resurrect a worker.\n if (gen !== this._gen) return;\n this._restartTimer = null;\n this._restartCount++;\n this._terminateWorker();\n // Clear the crash error BEFORE re-spawning so a successful restart leaves a\n // consistent running=true / error=null state (an `error` binding must not\n // keep showing the previous script's failure once the fresh worker is live).\n // Order matters: _spawn() re-sets `error` if the new spawn itself fails, so\n // a failed restart still surfaces its own error rather than null.\n this._setError(null);\n this._spawn();\n }, this._restartInterval);\n }\n\n private _clearRestartTimer(): void {\n if (this._restartTimer !== null) {\n clearTimeout(this._restartTimer);\n this._restartTimer = null;\n }\n }\n\n private _terminateWorker(): void {\n if (!this._worker) return;\n this._worker.removeEventListener(\"message\", this._onMessage);\n this._worker.removeEventListener(\"messageerror\", this._onMessageError);\n this._worker.removeEventListener(\"error\", this._onError);\n this._worker.terminate();\n this._worker = null;\n this._setRunning(false);\n }\n\n private _normalizeError(err: unknown): WcsWorkerErrorDetail {\n if (err instanceof Error) {\n // DOMException is an Error subclass; its `name` (DataCloneError, etc.) is\n // the meaningful discriminator for consumers switching on failure kind.\n return { name: err.name, message: err.message };\n }\n return { name: \"Error\", message: String(err) };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWorker } from \"./components/Worker.js\";\n\nlet registered = false;\n\n// Attribute names for the optional post-on-click DOM trigger (clipboard.js-style\n// DX). The element carrying `data-worker-target` points at a <wcs-worker> by id;\n// the payload to post comes from either a literal `data-worker-text` or a\n// `data-worker-from` CSS selector resolving to a source element.\nconst TEXT_ATTRIBUTE = \"data-worker-text\";\nconst FROM_ATTRIBUTE = \"data-worker-from\";\n\nfunction resolveText(triggerElement: Element): string | null {\n // Literal text wins when present (including an empty string — posting \"\" is a\n // legitimate request). The `?? \"\"` right-hand side is defensive and\n // unreachable: hasAttribute() just returned true, so getAttribute() cannot be\n // null here. It exists only to satisfy the `string | null` return type — do\n // not chase coverage on it (the DOM contract makes the null branch impossible).\n if (triggerElement.hasAttribute(TEXT_ATTRIBUTE)) {\n return triggerElement.getAttribute(TEXT_ATTRIBUTE) ?? \"\";\n }\n const selector = triggerElement.getAttribute(FROM_ATTRIBUTE);\n if (!selector) return null;\n // A user-authored selector can be syntactically invalid (e.g. `[data-*` or a\n // bare `:not()`), which makes querySelector throw a SyntaxError. Swallow it and\n // treat the source as unresolvable — the same \"nothing to post\" path as a\n // selector that matches no element — so one bad attribute never crashes the\n // document-level click handler and kills autoTrigger for the whole tab.\n let source: Element | null;\n try {\n source = document.querySelector(selector);\n } catch {\n return null;\n }\n if (!source) return null;\n // Read a form control's `value`; fall back to text content. A bare\n // `\"value\" in source` check is too broad — it also matches <button>,\n // <li value>, <progress>, etc. (which carry an unrelated `value`), posting the\n // wrong thing. Narrow to the text-bearing controls a user actually points\n // `data-worker-from` at; everything else falls through to textContent.\n if (\n source instanceof HTMLInputElement ||\n source instanceof HTMLTextAreaElement ||\n source instanceof HTMLSelectElement\n ) {\n return source.value;\n }\n // `?? \"\"` is defensive: per the DOM spec only Document / DocumentType /\n // Notation nodes have a null `textContent`, and querySelector only ever returns\n // an Element (whose textContent is always a string). The branch is therefore\n // unreachable in practice and kept solely for the `string | null` type — not\n // worth a contrived test.\n return source.textContent ?? \"\";\n}\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const workerId = triggerElement.getAttribute(config.triggerAttribute);\n if (!workerId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWorker as a value (avoids a components ⇄ autoTrigger import cycle:\n // Worker.connectedCallback() calls registerAutoTrigger()). instanceof against\n // the customElements registry keeps the same identity guarantee.\n const WorkerCtor = customElements.get(config.tagNames.worker);\n const workerElement = document.getElementById(workerId);\n if (!WorkerCtor || !(workerElement instanceof WorkerCtor)) return;\n\n const text = resolveText(triggerElement);\n // No resolvable source: leave the click alone (do not preventDefault) so the\n // element's default action is unaffected.\n if (text === null) return;\n\n // Suppress the default action so a post can run without navigating. Intentional:\n // do not attach data-worker-target to an element whose default action you also\n // want (a real <a href> link). See README \"Optional DOM Triggering\".\n event.preventDefault();\n (workerElement as WcsWorker).post(text);\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, WcsWorkerErrorDetail } from \"../types.js\";\nimport { WorkerCore } from \"../core/WorkerCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n// Named WcsWorker (not `Worker`) to avoid shadowing the global `Worker`\n// constructor and to match the <wcs-broadcast> WcsBroadcast / <wcs-ws>\n// WcsWebSocket convention.\nexport class WcsWorker extends HTMLElement {\n // SSR (§4.1/§4.4): expose connectedCallbackPromise backed by _core.observe()\n // so a shell renderer can await first-connect readiness uniformly across all\n // IO nodes. The worker still spawns synchronously in connectedCallback; the\n // Core's observe() resolves immediately (command-driven, no async probe), so\n // the promise is effectively already-resolved but the contract is honored.\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WorkerCore.wcBindable,\n // Shell-level settable surface. `src` selects the script; `manual` suppresses\n // auto-spawn; `keep-alive` keeps the worker past disconnect; the restart-*\n // inputs configure opt-in restart-on-error. There is no momentary `post`\n // property: posting needs an argument (the payload), so element actions run\n // via command-token (`command.post: $command.ping`) or the DOM autoTrigger,\n // keeping `post` a plain command and the `command.post:` wiring readable.\n inputs: [\n { name: \"src\", attribute: \"src\" },\n { name: \"type\", attribute: \"type\" },\n { name: \"name\", attribute: \"name\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"keepAlive\", attribute: \"keep-alive\" },\n { name: \"restartOnError\", attribute: \"restart-on-error\" },\n { name: \"maxRestarts\", attribute: \"max-restarts\" },\n { name: \"restartInterval\", attribute: \"restart-interval\" },\n ],\n // Commands are identical to the Core's — the attribute accessors (src, type,\n // name, ...) do not collide with start/post/terminate.\n commands: WorkerCore.wcBindable.commands,\n };\n static get observedAttributes(): string[] { return [\"src\"]; }\n\n private _core: WorkerCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WorkerCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-worker:running-changed\": (d) => ({ running: d === true }),\n \"wcs-worker:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get src(): string {\n return this.getAttribute(\"src\") || \"\";\n }\n\n set src(value: string) {\n this.setAttribute(\"src\", value);\n }\n\n get type(): WorkerType {\n return this.getAttribute(\"type\") === \"classic\" ? \"classic\" : \"module\";\n }\n\n set type(value: WorkerType) {\n this.setAttribute(\"type\", value);\n }\n\n get name(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n set name(value: string) {\n this.setAttribute(\"name\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get keepAlive(): boolean {\n return this.hasAttribute(\"keep-alive\");\n }\n\n set keepAlive(value: boolean) {\n if (value) {\n this.setAttribute(\"keep-alive\", \"\");\n } else {\n this.removeAttribute(\"keep-alive\");\n }\n }\n\n get restartOnError(): boolean {\n return this.hasAttribute(\"restart-on-error\");\n }\n\n set restartOnError(value: boolean) {\n if (value) {\n this.setAttribute(\"restart-on-error\", \"\");\n } else {\n this.removeAttribute(\"restart-on-error\");\n }\n }\n\n get maxRestarts(): number {\n const attr = this.getAttribute(\"max-restarts\");\n // `max-restarts=\"Infinity\"` is the documented default-equivalent for an\n // unbounded restart budget. parseInt(\"Infinity\", 10) is NaN, so match it\n // explicitly rather than leaning on the NaN fallback (which would silently\n // break if that fallback ever changed). Any other non-numeric value still\n // falls back to Infinity via the NaN guard.\n if (attr === \"Infinity\") return Infinity;\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxRestarts(value: number) {\n this.setAttribute(\"max-restarts\", String(value));\n }\n\n get restartInterval(): number {\n const attr = this.getAttribute(\"restart-interval\");\n const parsed = attr ? parseInt(attr, 10) : 0;\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n set restartInterval(value: number) {\n this.setAttribute(\"restart-interval\", String(value));\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get running(): boolean {\n return this._core.running;\n }\n\n // --- Commands ---\n\n start(): void {\n // Delegate unconditionally — including the empty-`src` case — so the Core's\n // never-throw contract holds at the Shell boundary too: start(\"\") raises a\n // TypeError through `error` rather than failing silently. The auto-spawn\n // paths (connectedCallback / attributeChangedCallback) already gate on a\n // non-empty `src`, so this only affects an explicit `el.start()` call.\n this._core.start(this.src, {\n type: this.type,\n name: this.name,\n restartOnError: this.restartOnError,\n maxRestarts: this.maxRestarts,\n restartInterval: this.restartInterval,\n });\n }\n\n post(data: any, transfer?: Transferable[]): void {\n this._core.post(data, transfer);\n }\n\n terminate(): void {\n this._core.terminate();\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"src\" && this.isConnected && !this.manual && newValue) {\n this.start();\n }\n }\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // SSR (§4.4): back connectedCallbackPromise with the Core's observe(). It\n // resolves immediately for this command-driven node, but wiring it keeps the\n // readiness contract uniform with the async-init IO nodes.\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.src) {\n this.start();\n }\n }\n\n disconnectedCallback(): void {\n // Deliberately does NOT call unregisterAutoTrigger(). The autoTrigger click\n // listener is a single process-wide document listener (registerAutoTrigger\n // is idempotent), shared by every <wcs-worker> on the page — not owned by\n // this element. Tearing it down when the last element disconnects would\n // break a later-inserted trigger, so it is intentionally left installed for\n // the document's lifetime (one passive listener, negligible cost). This\n // mirrors <wcs-broadcast> / <wcs-clipboard>, which register but never\n // unregister either; unregisterAutoTrigger stays exported purely as a\n // symmetric teardown hook for tests / advanced manual control.\n //\n // keep-alive intentionally leaves the worker running past disconnect: the\n // worker outlives the element and ownership transfers to the caller, who must\n // call terminate() to free the thread. Without keep-alive the worker is torn\n // down like <wcs-ws> / <wcs-broadcast> close on disconnect.\n if (!this.keepAlive) {\n this._core.dispose();\n }\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWorker(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsWorker } from \"./components/Worker.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.worker)) {\n registry.define(config.tagNames.worker, WcsWorker);\n }\n}\n"],"names":["config","triggerAttribute","tagNames","worker","WCS_WORKER_ERROR_CODE","TRUSTED_TYPES_POLICY_SLOT","Symbol","for","INTERNAL_POLICY_SLOT","POLICY_NAME","getTrustedTypesPolicy","value","globalThis","_fallbackWarned","trustAuthoredScriptURL","url","internal","holder","cached","undefined","factory","trustedTypes","policy","createPolicy","createHTML","input","createScriptURL","error","console","getInternalPolicy","internalCreate","call","adopted","adoptedCreate","warn","WorkerCore","EventTarget","static","protocol","version","properties","name","event","semantics","commands","_target","_worker","_message","_error","_errorInfo","_running","_src","_type","_name","_restartOnError","_maxRestarts","Infinity","_restartInterval","_restartCount","_restartTimer","_gen","_ready","Promise","resolve","constructor","target","super","this","ready","observe","message","errorInfo","running","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setError","_commitErrorInfo","code","phase","recoverable","deriveWorkerErrorInfo","info","_setRunning","start","src","options","_clearRestartTimer","_terminateWorker","type","restartOnError","maxRestarts","restartInterval","_spawn","post","data","transfer","length","postMessage","err","_normalizeError","terminate","dispose","Worker","addEventListener","_onMessage","_onMessageError","_onError","filename","lineno","colno","_scheduleRestart","gen","setTimeout","clearTimeout","removeEventListener","Error","String","registered","TEXT_ATTRIBUTE","handleClick","Element","triggerElement","closest","workerId","getAttribute","WorkerCtor","customElements","get","workerElement","document","getElementById","text","hasAttribute","selector","source","querySelector","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","textContent","resolveText","preventDefault","hasAccessorOnPrototype","proto","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","set","WcsWorker","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","connectedCallbackPromise","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","e","debug","on","toggleAttribute","setAttribute","manual","removeAttribute","keepAlive","attr","parsed","parseInt","Number","isNaN","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","element","declaration","prototype","hasOwnProperty","record","upgradeProperties","style","display","disconnectedCallback","registry","define","registerComponents"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -158,6 +158,33 @@ declare function bootstrapWorker(userConfig?: IWritableConfig, registry?: Custom
|
|
|
158
158
|
|
|
159
159
|
declare function getConfig(): IConfig;
|
|
160
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Trusted Types (`require-trusted-types-for 'script'`) 対応。正本は docs/csp.md §7。
|
|
163
|
+
*
|
|
164
|
+
* `new Worker(url)` は TrustedScriptURL sink なので、TT 強制下では素の文字列を渡すと
|
|
165
|
+
* 落ちる。ただしここに来る URL は `<wcs-worker src="...">`=**作者が書いた属性値**で
|
|
166
|
+
* あって、ユーザー入力でもレスポンスでもない。加えて worker のスクリプト取得元は
|
|
167
|
+
* `worker-src` で別途縛られている。よってここは identity policy で署名してよい層。
|
|
168
|
+
*
|
|
169
|
+
* policy 名は全 @wcstack パッケージで単一の `wcstack` に固定し、生成結果をグローバル
|
|
170
|
+
* スロットで共有する(`trusted-types` ディレクティブがある場合、`'allow-duplicates'`
|
|
171
|
+
* 無しの重複生成は例外になるため)。
|
|
172
|
+
*
|
|
173
|
+
* **利用側が注入した policy はここでは優先しない。** 注入口は「信頼できない値に対する
|
|
174
|
+
* sanitizer」として使われる想定なので、作者が書いた `src` をそこに通す理由が無い。
|
|
175
|
+
* identity policy を作れなかったときだけフォールバックし、その場合は 1 度警告する。
|
|
176
|
+
*/
|
|
177
|
+
interface IWcsTrustedTypesPolicy {
|
|
178
|
+
createHTML?(input: string): unknown;
|
|
179
|
+
createScriptURL?(input: string): unknown;
|
|
180
|
+
}
|
|
181
|
+
/** 利用側が policy を差し込むグローバルスロット(全 @wcstack パッケージ共通)。 */
|
|
182
|
+
declare const TRUSTED_TYPES_POLICY_SLOT: unique symbol;
|
|
183
|
+
/** 利用側が注入した policy。 */
|
|
184
|
+
declare function getTrustedTypesPolicy(): IWcsTrustedTypesPolicy | null;
|
|
185
|
+
/** 利用側 policy を設定する(`null` で解除)。 */
|
|
186
|
+
declare function setTrustedTypesPolicy(policy: IWcsTrustedTypesPolicy | null): void;
|
|
187
|
+
|
|
161
188
|
/**
|
|
162
189
|
* Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around
|
|
163
190
|
* the `Worker` API exposed through the wc-bindable protocol.
|
|
@@ -328,5 +355,5 @@ declare global {
|
|
|
328
355
|
}
|
|
329
356
|
}
|
|
330
357
|
|
|
331
|
-
export { WCS_WORKER_ERROR_CODE, WcsWorker, WorkerCore, bootstrapWorker, getConfig };
|
|
332
|
-
export type { IWritableConfig, IWritableTagNames, WcsIoErrorInfo, WcsIoErrorPhase, WcsWorkerCommands, WcsWorkerCoreCommands, WcsWorkerCoreValues, WcsWorkerErrorDetail, WcsWorkerInputs, WcsWorkerStartOptions, WcsWorkerValues };
|
|
358
|
+
export { TRUSTED_TYPES_POLICY_SLOT, WCS_WORKER_ERROR_CODE, WcsWorker, WorkerCore, bootstrapWorker, getConfig, getTrustedTypesPolicy, setTrustedTypesPolicy };
|
|
359
|
+
export type { IWcsTrustedTypesPolicy, IWritableConfig, IWritableTagNames, WcsIoErrorInfo, WcsIoErrorPhase, WcsWorkerCommands, WcsWorkerCoreCommands, WcsWorkerCoreValues, WcsWorkerErrorDetail, WcsWorkerInputs, WcsWorkerStartOptions, WcsWorkerValues };
|
package/dist/index.esm.js
CHANGED
|
@@ -97,6 +97,99 @@ function deriveWorkerErrorInfo(error) {
|
|
|
97
97
|
return { code: WCS_WORKER_ERROR_CODE.WorkerError, phase: "execute", recoverable: false, message };
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Trusted Types (`require-trusted-types-for 'script'`) 対応。正本は docs/csp.md §7。
|
|
102
|
+
*
|
|
103
|
+
* `new Worker(url)` は TrustedScriptURL sink なので、TT 強制下では素の文字列を渡すと
|
|
104
|
+
* 落ちる。ただしここに来る URL は `<wcs-worker src="...">`=**作者が書いた属性値**で
|
|
105
|
+
* あって、ユーザー入力でもレスポンスでもない。加えて worker のスクリプト取得元は
|
|
106
|
+
* `worker-src` で別途縛られている。よってここは identity policy で署名してよい層。
|
|
107
|
+
*
|
|
108
|
+
* policy 名は全 @wcstack パッケージで単一の `wcstack` に固定し、生成結果をグローバル
|
|
109
|
+
* スロットで共有する(`trusted-types` ディレクティブがある場合、`'allow-duplicates'`
|
|
110
|
+
* 無しの重複生成は例外になるため)。
|
|
111
|
+
*
|
|
112
|
+
* **利用側が注入した policy はここでは優先しない。** 注入口は「信頼できない値に対する
|
|
113
|
+
* sanitizer」として使われる想定なので、作者が書いた `src` をそこに通す理由が無い。
|
|
114
|
+
* identity policy を作れなかったときだけフォールバックし、その場合は 1 度警告する。
|
|
115
|
+
*/
|
|
116
|
+
/** 利用側が policy を差し込むグローバルスロット(全 @wcstack パッケージ共通)。 */
|
|
117
|
+
const TRUSTED_TYPES_POLICY_SLOT = Symbol.for("wcstack.trustedTypes.policy");
|
|
118
|
+
/** wcstack が生成した identity policy を共有するスロット(内部用)。 */
|
|
119
|
+
const INTERNAL_POLICY_SLOT = Symbol.for("wcstack.trustedTypes.internal");
|
|
120
|
+
const POLICY_NAME = "wcstack";
|
|
121
|
+
/** 利用側が注入した policy。 */
|
|
122
|
+
function getTrustedTypesPolicy() {
|
|
123
|
+
const value = globalThis[TRUSTED_TYPES_POLICY_SLOT];
|
|
124
|
+
if (value === null || typeof value !== "object")
|
|
125
|
+
return null;
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
/** 利用側 policy を設定する(`null` で解除)。 */
|
|
129
|
+
function setTrustedTypesPolicy(policy) {
|
|
130
|
+
globalThis[TRUSTED_TYPES_POLICY_SLOT] = policy;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 作者制御の文字列に署名するための共有 identity policy。TT 非対応ブラウザでは
|
|
134
|
+
* null(呼び出し側は生文字列のまま進む)。生成失敗も null をキャッシュして、
|
|
135
|
+
* 診断は 1 度だけ出す。
|
|
136
|
+
*/
|
|
137
|
+
function getInternalPolicy() {
|
|
138
|
+
const holder = globalThis;
|
|
139
|
+
const cached = holder[INTERNAL_POLICY_SLOT];
|
|
140
|
+
if (cached !== undefined)
|
|
141
|
+
return cached;
|
|
142
|
+
const factory = globalThis.trustedTypes;
|
|
143
|
+
let policy = null;
|
|
144
|
+
if (factory && typeof factory.createPolicy === "function") {
|
|
145
|
+
try {
|
|
146
|
+
policy = factory.createPolicy(POLICY_NAME, {
|
|
147
|
+
createHTML: (input) => input,
|
|
148
|
+
createScriptURL: (input) => input,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
// 利用側 policy に落ちられるなら、報告は初回使用時の 1 回の warn(trustAuthoredScriptURL)
|
|
153
|
+
// に任せる — docs/csp.md §7。落ちる先が無いときだけ、直し方付きで error にする
|
|
154
|
+
if (typeof getTrustedTypesPolicy()?.createScriptURL !== "function") {
|
|
155
|
+
console.error(`[@wcstack/worker] Could not create the Trusted Types policy "${POLICY_NAME}". `
|
|
156
|
+
+ `Allow it in the CSP (\`trusted-types ${POLICY_NAME};\`), or inject your own policy `
|
|
157
|
+
+ `at globalThis[Symbol.for("wcstack.trustedTypes.policy")]. See docs/csp.md section 7.`, error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
holder[INTERNAL_POLICY_SLOT] = policy;
|
|
162
|
+
return policy;
|
|
163
|
+
}
|
|
164
|
+
let _fallbackWarned = false;
|
|
165
|
+
/**
|
|
166
|
+
* 作者が書いたスクリプト URL を TrustedScriptURL に変換する。
|
|
167
|
+
*
|
|
168
|
+
* 解決順は 共有 identity policy > (TT はあるが identity policy を作れなかった場合のみ)
|
|
169
|
+
* 利用側 policy > 生文字列。TT 非対応ブラウザでは署名自体が不要なので素通しする。
|
|
170
|
+
*/
|
|
171
|
+
function trustAuthoredScriptURL(url) {
|
|
172
|
+
const internal = getInternalPolicy();
|
|
173
|
+
const internalCreate = internal?.createScriptURL;
|
|
174
|
+
if (typeof internalCreate === "function") {
|
|
175
|
+
return internalCreate.call(internal, url);
|
|
176
|
+
}
|
|
177
|
+
if (!("trustedTypes" in globalThis))
|
|
178
|
+
return url;
|
|
179
|
+
const adopted = getTrustedTypesPolicy();
|
|
180
|
+
const adoptedCreate = adopted?.createScriptURL;
|
|
181
|
+
if (typeof adoptedCreate === "function") {
|
|
182
|
+
if (!_fallbackWarned) {
|
|
183
|
+
_fallbackWarned = true;
|
|
184
|
+
console.warn(`[@wcstack/worker] Falling back to the injected Trusted Types policy to sign the worker `
|
|
185
|
+
+ `URL, because the "${POLICY_NAME}" policy could not be created. `
|
|
186
|
+
+ `Allow \`trusted-types ${POLICY_NAME};\` in the CSP to avoid this. See docs/csp.md section 7.`);
|
|
187
|
+
}
|
|
188
|
+
return adoptedCreate.call(adopted, url);
|
|
189
|
+
}
|
|
190
|
+
return url;
|
|
191
|
+
}
|
|
192
|
+
|
|
100
193
|
/**
|
|
101
194
|
* Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around
|
|
102
195
|
* the `Worker` API exposed through the wc-bindable protocol.
|
|
@@ -343,7 +436,11 @@ class WorkerCore extends EventTarget {
|
|
|
343
436
|
// --- Internal ---
|
|
344
437
|
_spawn() {
|
|
345
438
|
try {
|
|
346
|
-
|
|
439
|
+
// `new Worker(url)` は TrustedScriptURL sink。src は作者が書いた属性値なので
|
|
440
|
+
// 共有 identity policy で署名してよい層(docs/csp.md §7)。TT 非対応ブラウザでは
|
|
441
|
+
// 生文字列がそのまま返る。policy 生成に失敗した場合もここは従来どおり進み、
|
|
442
|
+
// 実際の失敗は既存の catch が error / errorInfo に落とす。
|
|
443
|
+
this._worker = new Worker(trustAuthoredScriptURL(this._src), { type: this._type, name: this._name || undefined });
|
|
347
444
|
}
|
|
348
445
|
catch (err) {
|
|
349
446
|
this._setError(this._normalizeError(err));
|
|
@@ -819,5 +916,5 @@ function bootstrapWorker(userConfig, registry) {
|
|
|
819
916
|
registerComponents(registry);
|
|
820
917
|
}
|
|
821
918
|
|
|
822
|
-
export { WCS_WORKER_ERROR_CODE, WcsWorker, WorkerCore, bootstrapWorker, getConfig };
|
|
919
|
+
export { TRUSTED_TYPES_POLICY_SLOT, WCS_WORKER_ERROR_CODE, WcsWorker, WorkerCore, bootstrapWorker, getConfig, getTrustedTypesPolicy, setTrustedTypesPolicy };
|
|
823
920
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/workerCapabilities.ts","../src/core/WorkerCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/components/Worker.ts","../src/registerComponents.ts","../src/bootstrapWorker.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n worker: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-worker-target\",\n tagNames: {\n worker: \"wcs-worker\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\n// Live reference to the mutable internal config: reads always reflect the latest\n// setConfig() call. The readonly IConfig type only blocks callers from writing\n// through it — the underlying object still changes. If you need a stable,\n// frozen snapshot that won't move under you, use getConfig() instead.\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * workerCapabilities.ts\n *\n * Worker node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。worker は所有する子スレッドに対する command 駆動(start / post / terminate)\n * であり、競合する複数 operation を lane 管理する必要が無い(post は fire-and-forget、\n * start は張り替えを冪等ガード)ため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport type { WcsWorkerErrorDetail } from \"../types.js\";\n\n/** 安定した worker error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WORKER_ERROR_CODE = {\n /** `Worker` コンストラクタ不在(SSR / 非対応環境で構築が投げる)。 */\n CapabilityMissing: \"capability-missing\",\n /** `start(src)` の `src` 未指定(TypeError \"src is required.\")。 */\n InvalidArgument: \"invalid-argument\",\n /** worker スクリプトの uncaught error / messageerror / post 失敗 / 構築失敗など。 */\n WorkerError: \"worker-error\",\n} as const;\n\n/**\n * 正規化済み worker error(`WcsWorkerErrorDetail`)を serializable な error taxonomy に\n * 写す。`.name` で分岐する:\n *\n * - `TypeError` かつ `message === \"src is required.\"` は `start()` 自身の引数検証。\n * WorkerCore.start がこの固定 message で立てる唯一の検証 TypeError なので、runtime の\n * worker error(name は \"Error\" / \"DataError\" 等)や構築失敗の TypeError とは message で\n * 一意に切り分かる → phase=\"start\" / invalid-argument。\n * - それ以外の `TypeError` / `ReferenceError` は `new Worker(...)` の構築失敗。global\n * `Worker` が `undefined` なら `new undefined()` が \"... is not a constructor\"(TypeError)、\n * 素の Node/SSR で `Worker` が未宣言なら \"Worker is not defined\"(ReferenceError)を投げる。\n * いずれも platform API 欠如の顕れ → phase=\"probe\" / capability-missing。runtime の worker\n * error はこの 2 name を名乗らない(_onError は \"Error\"、_onMessageError は \"DataError\")ので\n * 誤爆しない。\n * - それ以外(worker スクリプトの `Error` / messageerror の `DataError` / post の\n * `InvalidStateError` / `DataCloneError` / 構築時の `SecurityError` 等)は稼働中/構築時の\n * 失敗 → phase=\"execute\" / worker-error。\n *\n * いずれも retry で自動回復しない(recoverable=false)。公開 `error` shape は不変。\n */\nexport function deriveWorkerErrorInfo(error: WcsWorkerErrorDetail): WcsIoErrorInfo {\n const { name, message } = error;\n if (name === \"TypeError\" && message === \"src is required.\") {\n return { code: WCS_WORKER_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (name === \"TypeError\" || name === \"ReferenceError\") {\n return { code: WCS_WORKER_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n return { code: WCS_WORKER_ERROR_CODE.WorkerError, phase: \"execute\", recoverable: false, message };\n}\n","import { IWcBindable, WcsWorkerErrorDetail, WcsWorkerStartOptions } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWorkerErrorInfo } from \"./workerCapabilities.js\";\n\n/**\n * Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around\n * the `Worker` API exposed through the wc-bindable protocol.\n *\n * A Worker is a \"headless async message-passing resource that owns a child\n * thread\" — structurally identical to BroadcastCore (structured-clone payloads,\n * no wire encoding, `post` is a `state → element` command-token and an incoming\n * `message` is an `element → state` event-token) with one extra axis: this Core\n * *owns* the underlying resource, so `start()` / `terminate()` spawn and tear\n * down the thread, mirroring how WebSocketCore owns its socket.\n *\n * Message model is bus-style (fire-and-forget `post`, observe `message`), not\n * RPC: there is no request/response correlation. Payloads ride structured clone\n * with NO JSON round-trip (symmetrical with BroadcastCore, deliberately unlike\n * WebSocketCore). The Core never throws — a spawn failure (bad URL, CSP block,\n * absent `Worker`), a non-cloneable `post` (`DataCloneError`), a `post` with no\n * running worker (`InvalidStateError`), an uncaught worker error, and a\n * `messageerror` all flow through the `error` property.\n */\nexport class WorkerCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-worker:message\", semantics: \"event\" },\n { name: \"error\", event: \"wcs-worker:error\", semantics: \"state\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (name + message); the existing\n // `error` property/event are unchanged. Fires wcs-worker:error-info-changed. No\n // lane — the worker is a command-driven owner, not a concurrent-operation node.\n { name: \"errorInfo\", event: \"wcs-worker:error-info-changed\", semantics: \"state\" },\n { name: \"running\", event: \"wcs-worker:running-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"start\" },\n { name: \"post\" },\n { name: \"terminate\" },\n ],\n };\n\n private _target: EventTarget;\n private _worker: Worker | null = null;\n private _message: any = null;\n private _error: WcsWorkerErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _running: boolean = false;\n\n // Spawn configuration, retained so an automatic restart can re-spawn the same\n // script with the same options.\n private _src: string = \"\";\n private _type: WorkerType = \"module\";\n private _name: string = \"\";\n\n // Restart-on-error bookkeeping (opt-in; bounded like WebSocketCore reconnect).\n // `_restartCount` is CUMULATIVE over the worker's lifetime: it counts every\n // restart since the last start() and is NOT reset by a period of stable\n // operation, so `_maxRestarts` bounds total restarts, not consecutive crashes.\n // It is reset to 0 only by start() (a fresh spawn / src switch).\n private _restartOnError: boolean = false;\n private _maxRestarts: number = Infinity;\n private _restartInterval: number = 0;\n private _restartCount: number = 0;\n private _restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation guard (§3.4): bumped on dispose() and captured at restart-timer\n // schedule time. A restart deferred via setTimeout is the Core's only async\n // work; if dispose() runs while it is pending, the stale timer MUST NOT\n // re-spawn a worker on a torn-down element. _clearRestartTimer() already\n // cancels the pending timer from inside the Core, so this guard is\n // defense-in-depth for any path that fires the callback after invalidation.\n private _gen = 0;\n // SSR (§3.8): a worker is command-driven (spawned on start()), so there is no\n // asynchronous probe to await — readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). The worker is command-driven (start/post/terminate), so\n // there is no subscription to establish up front: observe() is an idempotent\n // no-op that resolves once ready. dispose() (below) tears down the worker,\n // cancels any pending restart and invalidates in-flight async via _gen.\n observe(): Promise<void> {\n return this._ready;\n }\n\n get message(): any {\n return this._message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-worker:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get running(): boolean {\n return this._running;\n }\n\n // --- State setters with event dispatch ---\n\n // Deliberately NO same-value guard. An incoming message is an event, not\n // idempotent state: the worker posting the same value twice is two distinct\n // occurrences and must re-fire wcs-worker:message each time so a `message:`\n // binding and any `eventToken.message:` subscriber see both.\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n // Same-value guard. `error` has no derived state, so suppressing redundant\n // null→null dispatches (e.g. a successful spawn clearing an already-null error)\n // avoids spurious events. Reference identity suffices: each failure builds a\n // fresh object and the clear path always passes null.\n private _setError(error: WcsWorkerErrorDetail | null): void {\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // normalized error (name + message), or null on clear. Fires before the `error`\n // event so an observer binding both sees the classification first, mirroring the\n // io-node family.\n this._commitErrorInfo(error === null ? null : deriveWorkerErrorInfo(error));\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n // No same-value guard needed: every spawn (`start`, restart) goes through\n // `_spawn` (false→true) only after `_terminateWorker` (true→false, guarded by\n // `_worker`), so `running` only ever moves on a real transition.\n private _setRunning(running: boolean): void {\n this._running = running;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:running-changed\", {\n detail: running,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Spawn the worker from `src`. Any previously-spawned worker is terminated\n * first, so calling `start()` again with a different `src` switches scripts.\n * Idempotent on the same `src` (re-spawning the script we are already running\n * is pure churn) — this also absorbs the custom-element upgrade path where a\n * connected element with a `src` attribute triggers both\n * attributeChangedCallback and connectedCallback, calling start() twice. A\n * consequence of this guard: changing only the options (`type`, `name`,\n * restart-*) while running the same `src` is ignored — call `terminate()`\n * then `start()` to re-spawn with new options. Never throws: a spawn failure\n * surfaces through `error`.\n */\n start(src: string, options: WcsWorkerStartOptions = {}): void {\n if (!src) {\n this._setError({ name: \"TypeError\", message: \"src is required.\" });\n return;\n }\n if (this._worker && this._src === src) return;\n\n this._clearRestartTimer();\n this._terminateWorker();\n\n this._src = src;\n this._type = options.type ?? \"module\";\n this._name = options.name ?? \"\";\n this._restartOnError = options.restartOnError ?? false;\n this._maxRestarts = options.maxRestarts ?? Infinity;\n this._restartInterval = options.restartInterval ?? 0;\n this._restartCount = 0;\n\n this._setError(null);\n this._spawn();\n }\n\n /**\n * Post a structured-cloneable value to the worker. The optional `transfer`\n * list moves ownership of `Transferable`s (ArrayBuffer, MessagePort, ...) — the\n * escape hatch the declarative layer cannot express. Never throws: a\n * non-cloneable value surfaces as `DataCloneError` and posting with no running\n * worker surfaces an `InvalidStateError`, both through `error`.\n */\n post(data: any, transfer?: Transferable[]): void {\n if (!this._worker) {\n this._setError({\n name: \"InvalidStateError\",\n message: \"Worker is not running. Call start(src) before post().\",\n });\n return;\n }\n try {\n if (transfer && transfer.length > 0) {\n this._worker.postMessage(data, transfer);\n } else {\n this._worker.postMessage(data);\n }\n } catch (err) {\n this._setError(this._normalizeError(err));\n }\n }\n\n /** Terminate the worker. Idempotent — a no-op when none is running. */\n terminate(): void {\n this._clearRestartTimer();\n this._terminateWorker();\n }\n\n /**\n * Tear the Core down for a disconnected Shell: terminate the worker and reset\n * the error shadow (both `error` and its derived `errorInfo`). Only that\n * error/errorInfo clear is silent — it mutates the shadows without dispatching.\n * Terminating a *running* worker still dispatches\n * `wcs-worker:running-changed` (true→false) via `_terminateWorker`, so a\n * dispose on a worker that was live does emit one event on the (now\n * disconnected) element; only a no-op dispose (no worker running) is fully\n * silent.\n *\n * Asymmetry by design: `_message` is deliberately NOT reset. `error` is\n * transient state — a stale error from a previous worker would mislead after a\n * reconnect, so it is cleared. `message` is the last value received (an event\n * payload); it is retained as the Core's last-known datum and is naturally\n * overwritten by the next incoming message.\n */\n dispose(): void {\n // §3.4: invalidate any in-flight async (a pending restart timer) before\n // tearing down, so a stale timer that somehow fires cannot re-spawn.\n this._gen++;\n this._clearRestartTimer();\n this._terminateWorker();\n // Silent shadow reset (no dispatch), mirroring `_error`: keep `errorInfo`'s\n // clear-to-null invariant so a reconnect does not read a stale classification.\n this._error = null;\n this._errorInfo = null;\n }\n\n // --- Internal ---\n\n private _spawn(): void {\n try {\n this._worker = new Worker(this._src, { type: this._type, name: this._name || undefined });\n } catch (err) {\n this._setError(this._normalizeError(err));\n return;\n }\n this._worker.addEventListener(\"message\", this._onMessage);\n this._worker.addEventListener(\"messageerror\", this._onMessageError);\n this._worker.addEventListener(\"error\", this._onError);\n this._setRunning(true);\n }\n\n private _onMessage = (event: MessageEvent): void => {\n this._setMessage(event.data);\n };\n\n // Fired when the worker posted a value this context cannot deserialize. The\n // event carries no usable payload, so report a synthetic DataError.\n private _onMessageError = (): void => {\n this._setError({\n name: \"DataError\",\n message: \"Failed to deserialize a message received from the worker.\",\n });\n };\n\n // An uncaught error inside the worker script. The worker itself stays alive\n // (the platform does not auto-terminate it), so restart-on-error explicitly\n // re-spawns a fresh worker when enabled and the bound is not exhausted.\n private _onError = (event: ErrorEvent): void => {\n this._setError({\n name: \"Error\",\n message: event.message || \"Worker script error.\",\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n if (this._restartOnError && this._restartCount < this._maxRestarts) {\n this._scheduleRestart();\n }\n };\n\n private _scheduleRestart(): void {\n this._clearRestartTimer();\n const gen = this._gen;\n this._restartTimer = setTimeout(() => {\n // §3.4: a dispose() between scheduling and firing bumps _gen; skip the\n // re-spawn so a torn-down Core does not resurrect a worker.\n if (gen !== this._gen) return;\n this._restartTimer = null;\n this._restartCount++;\n this._terminateWorker();\n // Clear the crash error BEFORE re-spawning so a successful restart leaves a\n // consistent running=true / error=null state (an `error` binding must not\n // keep showing the previous script's failure once the fresh worker is live).\n // Order matters: _spawn() re-sets `error` if the new spawn itself fails, so\n // a failed restart still surfaces its own error rather than null.\n this._setError(null);\n this._spawn();\n }, this._restartInterval);\n }\n\n private _clearRestartTimer(): void {\n if (this._restartTimer !== null) {\n clearTimeout(this._restartTimer);\n this._restartTimer = null;\n }\n }\n\n private _terminateWorker(): void {\n if (!this._worker) return;\n this._worker.removeEventListener(\"message\", this._onMessage);\n this._worker.removeEventListener(\"messageerror\", this._onMessageError);\n this._worker.removeEventListener(\"error\", this._onError);\n this._worker.terminate();\n this._worker = null;\n this._setRunning(false);\n }\n\n private _normalizeError(err: unknown): WcsWorkerErrorDetail {\n if (err instanceof Error) {\n // DOMException is an Error subclass; its `name` (DataCloneError, etc.) is\n // the meaningful discriminator for consumers switching on failure kind.\n return { name: err.name, message: err.message };\n }\n return { name: \"Error\", message: String(err) };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWorker } from \"./components/Worker.js\";\n\nlet registered = false;\n\n// Attribute names for the optional post-on-click DOM trigger (clipboard.js-style\n// DX). The element carrying `data-worker-target` points at a <wcs-worker> by id;\n// the payload to post comes from either a literal `data-worker-text` or a\n// `data-worker-from` CSS selector resolving to a source element.\nconst TEXT_ATTRIBUTE = \"data-worker-text\";\nconst FROM_ATTRIBUTE = \"data-worker-from\";\n\nfunction resolveText(triggerElement: Element): string | null {\n // Literal text wins when present (including an empty string — posting \"\" is a\n // legitimate request). The `?? \"\"` right-hand side is defensive and\n // unreachable: hasAttribute() just returned true, so getAttribute() cannot be\n // null here. It exists only to satisfy the `string | null` return type — do\n // not chase coverage on it (the DOM contract makes the null branch impossible).\n if (triggerElement.hasAttribute(TEXT_ATTRIBUTE)) {\n return triggerElement.getAttribute(TEXT_ATTRIBUTE) ?? \"\";\n }\n const selector = triggerElement.getAttribute(FROM_ATTRIBUTE);\n if (!selector) return null;\n // A user-authored selector can be syntactically invalid (e.g. `[data-*` or a\n // bare `:not()`), which makes querySelector throw a SyntaxError. Swallow it and\n // treat the source as unresolvable — the same \"nothing to post\" path as a\n // selector that matches no element — so one bad attribute never crashes the\n // document-level click handler and kills autoTrigger for the whole tab.\n let source: Element | null;\n try {\n source = document.querySelector(selector);\n } catch {\n return null;\n }\n if (!source) return null;\n // Read a form control's `value`; fall back to text content. A bare\n // `\"value\" in source` check is too broad — it also matches <button>,\n // <li value>, <progress>, etc. (which carry an unrelated `value`), posting the\n // wrong thing. Narrow to the text-bearing controls a user actually points\n // `data-worker-from` at; everything else falls through to textContent.\n if (\n source instanceof HTMLInputElement ||\n source instanceof HTMLTextAreaElement ||\n source instanceof HTMLSelectElement\n ) {\n return source.value;\n }\n // `?? \"\"` is defensive: per the DOM spec only Document / DocumentType /\n // Notation nodes have a null `textContent`, and querySelector only ever returns\n // an Element (whose textContent is always a string). The branch is therefore\n // unreachable in practice and kept solely for the `string | null` type — not\n // worth a contrived test.\n return source.textContent ?? \"\";\n}\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const workerId = triggerElement.getAttribute(config.triggerAttribute);\n if (!workerId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWorker as a value (avoids a components ⇄ autoTrigger import cycle:\n // Worker.connectedCallback() calls registerAutoTrigger()). instanceof against\n // the customElements registry keeps the same identity guarantee.\n const WorkerCtor = customElements.get(config.tagNames.worker);\n const workerElement = document.getElementById(workerId);\n if (!WorkerCtor || !(workerElement instanceof WorkerCtor)) return;\n\n const text = resolveText(triggerElement);\n // No resolvable source: leave the click alone (do not preventDefault) so the\n // element's default action is unaffected.\n if (text === null) return;\n\n // Suppress the default action so a post can run without navigating. Intentional:\n // do not attach data-worker-target to an element whose default action you also\n // want (a real <a href> link). See README \"Optional DOM Triggering\".\n event.preventDefault();\n (workerElement as WcsWorker).post(text);\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, WcsWorkerErrorDetail } from \"../types.js\";\nimport { WorkerCore } from \"../core/WorkerCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n// Named WcsWorker (not `Worker`) to avoid shadowing the global `Worker`\n// constructor and to match the <wcs-broadcast> WcsBroadcast / <wcs-ws>\n// WcsWebSocket convention.\nexport class WcsWorker extends HTMLElement {\n // SSR (§4.1/§4.4): expose connectedCallbackPromise backed by _core.observe()\n // so a shell renderer can await first-connect readiness uniformly across all\n // IO nodes. The worker still spawns synchronously in connectedCallback; the\n // Core's observe() resolves immediately (command-driven, no async probe), so\n // the promise is effectively already-resolved but the contract is honored.\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WorkerCore.wcBindable,\n // Shell-level settable surface. `src` selects the script; `manual` suppresses\n // auto-spawn; `keep-alive` keeps the worker past disconnect; the restart-*\n // inputs configure opt-in restart-on-error. There is no momentary `post`\n // property: posting needs an argument (the payload), so element actions run\n // via command-token (`command.post: $command.ping`) or the DOM autoTrigger,\n // keeping `post` a plain command and the `command.post:` wiring readable.\n inputs: [\n { name: \"src\", attribute: \"src\" },\n { name: \"type\", attribute: \"type\" },\n { name: \"name\", attribute: \"name\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"keepAlive\", attribute: \"keep-alive\" },\n { name: \"restartOnError\", attribute: \"restart-on-error\" },\n { name: \"maxRestarts\", attribute: \"max-restarts\" },\n { name: \"restartInterval\", attribute: \"restart-interval\" },\n ],\n // Commands are identical to the Core's — the attribute accessors (src, type,\n // name, ...) do not collide with start/post/terminate.\n commands: WorkerCore.wcBindable.commands,\n };\n static get observedAttributes(): string[] { return [\"src\"]; }\n\n private _core: WorkerCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WorkerCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-worker:running-changed\": (d) => ({ running: d === true }),\n \"wcs-worker:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get src(): string {\n return this.getAttribute(\"src\") || \"\";\n }\n\n set src(value: string) {\n this.setAttribute(\"src\", value);\n }\n\n get type(): WorkerType {\n return this.getAttribute(\"type\") === \"classic\" ? \"classic\" : \"module\";\n }\n\n set type(value: WorkerType) {\n this.setAttribute(\"type\", value);\n }\n\n get name(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n set name(value: string) {\n this.setAttribute(\"name\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get keepAlive(): boolean {\n return this.hasAttribute(\"keep-alive\");\n }\n\n set keepAlive(value: boolean) {\n if (value) {\n this.setAttribute(\"keep-alive\", \"\");\n } else {\n this.removeAttribute(\"keep-alive\");\n }\n }\n\n get restartOnError(): boolean {\n return this.hasAttribute(\"restart-on-error\");\n }\n\n set restartOnError(value: boolean) {\n if (value) {\n this.setAttribute(\"restart-on-error\", \"\");\n } else {\n this.removeAttribute(\"restart-on-error\");\n }\n }\n\n get maxRestarts(): number {\n const attr = this.getAttribute(\"max-restarts\");\n // `max-restarts=\"Infinity\"` is the documented default-equivalent for an\n // unbounded restart budget. parseInt(\"Infinity\", 10) is NaN, so match it\n // explicitly rather than leaning on the NaN fallback (which would silently\n // break if that fallback ever changed). Any other non-numeric value still\n // falls back to Infinity via the NaN guard.\n if (attr === \"Infinity\") return Infinity;\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxRestarts(value: number) {\n this.setAttribute(\"max-restarts\", String(value));\n }\n\n get restartInterval(): number {\n const attr = this.getAttribute(\"restart-interval\");\n const parsed = attr ? parseInt(attr, 10) : 0;\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n set restartInterval(value: number) {\n this.setAttribute(\"restart-interval\", String(value));\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get running(): boolean {\n return this._core.running;\n }\n\n // --- Commands ---\n\n start(): void {\n // Delegate unconditionally — including the empty-`src` case — so the Core's\n // never-throw contract holds at the Shell boundary too: start(\"\") raises a\n // TypeError through `error` rather than failing silently. The auto-spawn\n // paths (connectedCallback / attributeChangedCallback) already gate on a\n // non-empty `src`, so this only affects an explicit `el.start()` call.\n this._core.start(this.src, {\n type: this.type,\n name: this.name,\n restartOnError: this.restartOnError,\n maxRestarts: this.maxRestarts,\n restartInterval: this.restartInterval,\n });\n }\n\n post(data: any, transfer?: Transferable[]): void {\n this._core.post(data, transfer);\n }\n\n terminate(): void {\n this._core.terminate();\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"src\" && this.isConnected && !this.manual && newValue) {\n this.start();\n }\n }\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // SSR (§4.4): back connectedCallbackPromise with the Core's observe(). It\n // resolves immediately for this command-driven node, but wiring it keeps the\n // readiness contract uniform with the async-init IO nodes.\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.src) {\n this.start();\n }\n }\n\n disconnectedCallback(): void {\n // Deliberately does NOT call unregisterAutoTrigger(). The autoTrigger click\n // listener is a single process-wide document listener (registerAutoTrigger\n // is idempotent), shared by every <wcs-worker> on the page — not owned by\n // this element. Tearing it down when the last element disconnects would\n // break a later-inserted trigger, so it is intentionally left installed for\n // the document's lifetime (one passive listener, negligible cost). This\n // mirrors <wcs-broadcast> / <wcs-clipboard>, which register but never\n // unregister either; unregisterAutoTrigger stays exported purely as a\n // symmetric teardown hook for tests / advanced manual control.\n //\n // keep-alive intentionally leaves the worker running past disconnect: the\n // worker outlives the element and ownership transfers to the caller, who must\n // call terminate() to free the thread. Without keep-alive the worker is torn\n // down like <wcs-ws> / <wcs-broadcast> close on disconnect.\n if (!this.keepAlive) {\n this._core.dispose();\n }\n }\n}\n","import { WcsWorker } from \"./components/Worker.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.worker)) {\n registry.define(config.tagNames.worker, WcsWorker);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWorker(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/workerCapabilities.ts","../src/trustedTypes.ts","../src/core/WorkerCore.ts","../src/autoTrigger.ts","../src/protocol/upgradeProperties.ts","../src/components/Worker.ts","../src/registerComponents.ts","../src/bootstrapWorker.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n worker: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-worker-target\",\n tagNames: {\n worker: \"wcs-worker\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\n// Live reference to the mutable internal config: reads always reflect the latest\n// setConfig() call. The readonly IConfig type only blocks callers from writing\n// through it — the underlying object still changes. If you need a stable,\n// frozen snapshot that won't move under you, use getConfig() instead.\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * workerCapabilities.ts\n *\n * Worker node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。worker は所有する子スレッドに対する command 駆動(start / post / terminate)\n * であり、競合する複数 operation を lane 管理する必要が無い(post は fire-and-forget、\n * start は張り替えを冪等ガード)ため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport type { WcsWorkerErrorDetail } from \"../types.js\";\n\n/** 安定した worker error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WORKER_ERROR_CODE = {\n /** `Worker` コンストラクタ不在(SSR / 非対応環境で構築が投げる)。 */\n CapabilityMissing: \"capability-missing\",\n /** `start(src)` の `src` 未指定(TypeError \"src is required.\")。 */\n InvalidArgument: \"invalid-argument\",\n /** worker スクリプトの uncaught error / messageerror / post 失敗 / 構築失敗など。 */\n WorkerError: \"worker-error\",\n} as const;\n\n/**\n * 正規化済み worker error(`WcsWorkerErrorDetail`)を serializable な error taxonomy に\n * 写す。`.name` で分岐する:\n *\n * - `TypeError` かつ `message === \"src is required.\"` は `start()` 自身の引数検証。\n * WorkerCore.start がこの固定 message で立てる唯一の検証 TypeError なので、runtime の\n * worker error(name は \"Error\" / \"DataError\" 等)や構築失敗の TypeError とは message で\n * 一意に切り分かる → phase=\"start\" / invalid-argument。\n * - それ以外の `TypeError` / `ReferenceError` は `new Worker(...)` の構築失敗。global\n * `Worker` が `undefined` なら `new undefined()` が \"... is not a constructor\"(TypeError)、\n * 素の Node/SSR で `Worker` が未宣言なら \"Worker is not defined\"(ReferenceError)を投げる。\n * いずれも platform API 欠如の顕れ → phase=\"probe\" / capability-missing。runtime の worker\n * error はこの 2 name を名乗らない(_onError は \"Error\"、_onMessageError は \"DataError\")ので\n * 誤爆しない。\n * - それ以外(worker スクリプトの `Error` / messageerror の `DataError` / post の\n * `InvalidStateError` / `DataCloneError` / 構築時の `SecurityError` 等)は稼働中/構築時の\n * 失敗 → phase=\"execute\" / worker-error。\n *\n * いずれも retry で自動回復しない(recoverable=false)。公開 `error` shape は不変。\n */\nexport function deriveWorkerErrorInfo(error: WcsWorkerErrorDetail): WcsIoErrorInfo {\n const { name, message } = error;\n if (name === \"TypeError\" && message === \"src is required.\") {\n return { code: WCS_WORKER_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (name === \"TypeError\" || name === \"ReferenceError\") {\n return { code: WCS_WORKER_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n return { code: WCS_WORKER_ERROR_CODE.WorkerError, phase: \"execute\", recoverable: false, message };\n}\n","/**\n * Trusted Types (`require-trusted-types-for 'script'`) 対応。正本は docs/csp.md §7。\n *\n * `new Worker(url)` は TrustedScriptURL sink なので、TT 強制下では素の文字列を渡すと\n * 落ちる。ただしここに来る URL は `<wcs-worker src=\"...\">`=**作者が書いた属性値**で\n * あって、ユーザー入力でもレスポンスでもない。加えて worker のスクリプト取得元は\n * `worker-src` で別途縛られている。よってここは identity policy で署名してよい層。\n *\n * policy 名は全 @wcstack パッケージで単一の `wcstack` に固定し、生成結果をグローバル\n * スロットで共有する(`trusted-types` ディレクティブがある場合、`'allow-duplicates'`\n * 無しの重複生成は例外になるため)。\n *\n * **利用側が注入した policy はここでは優先しない。** 注入口は「信頼できない値に対する\n * sanitizer」として使われる想定なので、作者が書いた `src` をそこに通す理由が無い。\n * identity policy を作れなかったときだけフォールバックし、その場合は 1 度警告する。\n */\n\nexport interface IWcsTrustedTypesPolicy {\n createHTML?(input: string): unknown;\n createScriptURL?(input: string): unknown;\n}\n\n/** 利用側が policy を差し込むグローバルスロット(全 @wcstack パッケージ共通)。 */\nexport const TRUSTED_TYPES_POLICY_SLOT = Symbol.for(\"wcstack.trustedTypes.policy\");\n\n/** wcstack が生成した identity policy を共有するスロット(内部用)。 */\nconst INTERNAL_POLICY_SLOT = Symbol.for(\"wcstack.trustedTypes.internal\");\n\nconst POLICY_NAME = \"wcstack\";\n\ntype SymbolSlotHolder = { [key: symbol]: unknown };\n\ninterface ITrustedTypesFactory {\n createPolicy(name: string, rules: {\n createHTML(input: string): string;\n createScriptURL(input: string): string;\n }): IWcsTrustedTypesPolicy;\n}\n\n/** 利用側が注入した policy。 */\nexport function getTrustedTypesPolicy(): IWcsTrustedTypesPolicy | null {\n const value = (globalThis as SymbolSlotHolder)[TRUSTED_TYPES_POLICY_SLOT];\n if (value === null || typeof value !== \"object\") return null;\n return value as IWcsTrustedTypesPolicy;\n}\n\n/** 利用側 policy を設定する(`null` で解除)。 */\nexport function setTrustedTypesPolicy(policy: IWcsTrustedTypesPolicy | null): void {\n (globalThis as SymbolSlotHolder)[TRUSTED_TYPES_POLICY_SLOT] = policy;\n}\n\n/** テスト用: 共有 identity policy のキャッシュを捨てる。 */\nexport function _resetInternalTrustedTypesPolicy(): void {\n delete (globalThis as SymbolSlotHolder)[INTERNAL_POLICY_SLOT];\n}\n\n/**\n * 作者制御の文字列に署名するための共有 identity policy。TT 非対応ブラウザでは\n * null(呼び出し側は生文字列のまま進む)。生成失敗も null をキャッシュして、\n * 診断は 1 度だけ出す。\n */\nfunction getInternalPolicy(): IWcsTrustedTypesPolicy | null {\n const holder = globalThis as SymbolSlotHolder;\n const cached = holder[INTERNAL_POLICY_SLOT];\n if (cached !== undefined) return cached as IWcsTrustedTypesPolicy | null;\n\n const factory = (globalThis as { trustedTypes?: ITrustedTypesFactory }).trustedTypes;\n let policy: IWcsTrustedTypesPolicy | null = null;\n if (factory && typeof factory.createPolicy === \"function\") {\n try {\n policy = factory.createPolicy(POLICY_NAME, {\n createHTML: (input: string) => input,\n createScriptURL: (input: string) => input,\n });\n } catch (error) {\n // 利用側 policy に落ちられるなら、報告は初回使用時の 1 回の warn(trustAuthoredScriptURL)\n // に任せる — docs/csp.md §7。落ちる先が無いときだけ、直し方付きで error にする\n if (typeof getTrustedTypesPolicy()?.createScriptURL !== \"function\") {\n console.error(\n `[@wcstack/worker] Could not create the Trusted Types policy \"${POLICY_NAME}\". `\n + `Allow it in the CSP (\\`trusted-types ${POLICY_NAME};\\`), or inject your own policy `\n + `at globalThis[Symbol.for(\"wcstack.trustedTypes.policy\")]. See docs/csp.md section 7.`,\n error,\n );\n }\n }\n }\n holder[INTERNAL_POLICY_SLOT] = policy;\n return policy;\n}\n\nlet _fallbackWarned = false;\n\n/** テスト用: フォールバック警告の一度きりフラグを戻す。 */\nexport function _resetAuthoredFallbackWarning(): void {\n _fallbackWarned = false;\n}\n\n/**\n * 作者が書いたスクリプト URL を TrustedScriptURL に変換する。\n *\n * 解決順は 共有 identity policy > (TT はあるが identity policy を作れなかった場合のみ)\n * 利用側 policy > 生文字列。TT 非対応ブラウザでは署名自体が不要なので素通しする。\n */\nexport function trustAuthoredScriptURL(url: string): string {\n const internal = getInternalPolicy();\n const internalCreate = internal?.createScriptURL;\n if (typeof internalCreate === \"function\") {\n return internalCreate.call(internal, url) as string;\n }\n if (!(\"trustedTypes\" in globalThis)) return url;\n\n const adopted = getTrustedTypesPolicy();\n const adoptedCreate = adopted?.createScriptURL;\n if (typeof adoptedCreate === \"function\") {\n if (!_fallbackWarned) {\n _fallbackWarned = true;\n console.warn(\n `[@wcstack/worker] Falling back to the injected Trusted Types policy to sign the worker `\n + `URL, because the \"${POLICY_NAME}\" policy could not be created. `\n + `Allow \\`trusted-types ${POLICY_NAME};\\` in the CSP to avoid this. See docs/csp.md section 7.`,\n );\n }\n return adoptedCreate.call(adopted, url) as string;\n }\n return url;\n}\n","import { IWcBindable, WcsWorkerErrorDetail, WcsWorkerStartOptions } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWorkerErrorInfo } from \"./workerCapabilities.js\";\nimport { trustAuthoredScriptURL } from \"../trustedTypes.js\";\n\n/**\n * Headless Dedicated Worker primitive. A thin, framework-agnostic wrapper around\n * the `Worker` API exposed through the wc-bindable protocol.\n *\n * A Worker is a \"headless async message-passing resource that owns a child\n * thread\" — structurally identical to BroadcastCore (structured-clone payloads,\n * no wire encoding, `post` is a `state → element` command-token and an incoming\n * `message` is an `element → state` event-token) with one extra axis: this Core\n * *owns* the underlying resource, so `start()` / `terminate()` spawn and tear\n * down the thread, mirroring how WebSocketCore owns its socket.\n *\n * Message model is bus-style (fire-and-forget `post`, observe `message`), not\n * RPC: there is no request/response correlation. Payloads ride structured clone\n * with NO JSON round-trip (symmetrical with BroadcastCore, deliberately unlike\n * WebSocketCore). The Core never throws — a spawn failure (bad URL, CSP block,\n * absent `Worker`), a non-cloneable `post` (`DataCloneError`), a `post` with no\n * running worker (`InvalidStateError`), an uncaught worker error, and a\n * `messageerror` all flow through the `error` property.\n */\nexport class WorkerCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-worker:message\", semantics: \"event\" },\n { name: \"error\", event: \"wcs-worker:error\", semantics: \"state\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (name + message); the existing\n // `error` property/event are unchanged. Fires wcs-worker:error-info-changed. No\n // lane — the worker is a command-driven owner, not a concurrent-operation node.\n { name: \"errorInfo\", event: \"wcs-worker:error-info-changed\", semantics: \"state\" },\n { name: \"running\", event: \"wcs-worker:running-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"start\" },\n { name: \"post\" },\n { name: \"terminate\" },\n ],\n };\n\n private _target: EventTarget;\n private _worker: Worker | null = null;\n private _message: any = null;\n private _error: WcsWorkerErrorDetail | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _running: boolean = false;\n\n // Spawn configuration, retained so an automatic restart can re-spawn the same\n // script with the same options.\n private _src: string = \"\";\n private _type: WorkerType = \"module\";\n private _name: string = \"\";\n\n // Restart-on-error bookkeeping (opt-in; bounded like WebSocketCore reconnect).\n // `_restartCount` is CUMULATIVE over the worker's lifetime: it counts every\n // restart since the last start() and is NOT reset by a period of stable\n // operation, so `_maxRestarts` bounds total restarts, not consecutive crashes.\n // It is reset to 0 only by start() (a fresh spawn / src switch).\n private _restartOnError: boolean = false;\n private _maxRestarts: number = Infinity;\n private _restartInterval: number = 0;\n private _restartCount: number = 0;\n private _restartTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation guard (§3.4): bumped on dispose() and captured at restart-timer\n // schedule time. A restart deferred via setTimeout is the Core's only async\n // work; if dispose() runs while it is pending, the stale timer MUST NOT\n // re-spawn a worker on a torn-down element. _clearRestartTimer() already\n // cancels the pending timer from inside the Core, so this guard is\n // defense-in-depth for any path that fires the callback after invalidation.\n private _gen = 0;\n // SSR (§3.8): a worker is command-driven (spawned on start()), so there is no\n // asynchronous probe to await — readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). The worker is command-driven (start/post/terminate), so\n // there is no subscription to establish up front: observe() is an idempotent\n // no-op that resolves once ready. dispose() (below) tears down the worker,\n // cancels any pending restart and invalidates in-flight async via _gen.\n observe(): Promise<void> {\n return this._ready;\n }\n\n get message(): any {\n return this._message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-worker:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get running(): boolean {\n return this._running;\n }\n\n // --- State setters with event dispatch ---\n\n // Deliberately NO same-value guard. An incoming message is an event, not\n // idempotent state: the worker posting the same value twice is two distinct\n // occurrences and must re-fire wcs-worker:message each time so a `message:`\n // binding and any `eventToken.message:` subscriber see both.\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n // Same-value guard. `error` has no derived state, so suppressing redundant\n // null→null dispatches (e.g. a successful spawn clearing an already-null error)\n // avoids spurious events. Reference identity suffices: each failure builds a\n // fresh object and the clear path always passes null.\n private _setError(error: WcsWorkerErrorDetail | null): void {\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // normalized error (name + message), or null on clear. Fires before the `error`\n // event so an observer binding both sees the classification first, mirroring the\n // io-node family.\n this._commitErrorInfo(error === null ? null : deriveWorkerErrorInfo(error));\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n // No same-value guard needed: every spawn (`start`, restart) goes through\n // `_spawn` (false→true) only after `_terminateWorker` (true→false, guarded by\n // `_worker`), so `running` only ever moves on a real transition.\n private _setRunning(running: boolean): void {\n this._running = running;\n this._target.dispatchEvent(new CustomEvent(\"wcs-worker:running-changed\", {\n detail: running,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n /**\n * Spawn the worker from `src`. Any previously-spawned worker is terminated\n * first, so calling `start()` again with a different `src` switches scripts.\n * Idempotent on the same `src` (re-spawning the script we are already running\n * is pure churn) — this also absorbs the custom-element upgrade path where a\n * connected element with a `src` attribute triggers both\n * attributeChangedCallback and connectedCallback, calling start() twice. A\n * consequence of this guard: changing only the options (`type`, `name`,\n * restart-*) while running the same `src` is ignored — call `terminate()`\n * then `start()` to re-spawn with new options. Never throws: a spawn failure\n * surfaces through `error`.\n */\n start(src: string, options: WcsWorkerStartOptions = {}): void {\n if (!src) {\n this._setError({ name: \"TypeError\", message: \"src is required.\" });\n return;\n }\n if (this._worker && this._src === src) return;\n\n this._clearRestartTimer();\n this._terminateWorker();\n\n this._src = src;\n this._type = options.type ?? \"module\";\n this._name = options.name ?? \"\";\n this._restartOnError = options.restartOnError ?? false;\n this._maxRestarts = options.maxRestarts ?? Infinity;\n this._restartInterval = options.restartInterval ?? 0;\n this._restartCount = 0;\n\n this._setError(null);\n this._spawn();\n }\n\n /**\n * Post a structured-cloneable value to the worker. The optional `transfer`\n * list moves ownership of `Transferable`s (ArrayBuffer, MessagePort, ...) — the\n * escape hatch the declarative layer cannot express. Never throws: a\n * non-cloneable value surfaces as `DataCloneError` and posting with no running\n * worker surfaces an `InvalidStateError`, both through `error`.\n */\n post(data: any, transfer?: Transferable[]): void {\n if (!this._worker) {\n this._setError({\n name: \"InvalidStateError\",\n message: \"Worker is not running. Call start(src) before post().\",\n });\n return;\n }\n try {\n if (transfer && transfer.length > 0) {\n this._worker.postMessage(data, transfer);\n } else {\n this._worker.postMessage(data);\n }\n } catch (err) {\n this._setError(this._normalizeError(err));\n }\n }\n\n /** Terminate the worker. Idempotent — a no-op when none is running. */\n terminate(): void {\n this._clearRestartTimer();\n this._terminateWorker();\n }\n\n /**\n * Tear the Core down for a disconnected Shell: terminate the worker and reset\n * the error shadow (both `error` and its derived `errorInfo`). Only that\n * error/errorInfo clear is silent — it mutates the shadows without dispatching.\n * Terminating a *running* worker still dispatches\n * `wcs-worker:running-changed` (true→false) via `_terminateWorker`, so a\n * dispose on a worker that was live does emit one event on the (now\n * disconnected) element; only a no-op dispose (no worker running) is fully\n * silent.\n *\n * Asymmetry by design: `_message` is deliberately NOT reset. `error` is\n * transient state — a stale error from a previous worker would mislead after a\n * reconnect, so it is cleared. `message` is the last value received (an event\n * payload); it is retained as the Core's last-known datum and is naturally\n * overwritten by the next incoming message.\n */\n dispose(): void {\n // §3.4: invalidate any in-flight async (a pending restart timer) before\n // tearing down, so a stale timer that somehow fires cannot re-spawn.\n this._gen++;\n this._clearRestartTimer();\n this._terminateWorker();\n // Silent shadow reset (no dispatch), mirroring `_error`: keep `errorInfo`'s\n // clear-to-null invariant so a reconnect does not read a stale classification.\n this._error = null;\n this._errorInfo = null;\n }\n\n // --- Internal ---\n\n private _spawn(): void {\n try {\n // `new Worker(url)` は TrustedScriptURL sink。src は作者が書いた属性値なので\n // 共有 identity policy で署名してよい層(docs/csp.md §7)。TT 非対応ブラウザでは\n // 生文字列がそのまま返る。policy 生成に失敗した場合もここは従来どおり進み、\n // 実際の失敗は既存の catch が error / errorInfo に落とす。\n this._worker = new Worker(trustAuthoredScriptURL(this._src), { type: this._type, name: this._name || undefined });\n } catch (err) {\n this._setError(this._normalizeError(err));\n return;\n }\n this._worker.addEventListener(\"message\", this._onMessage);\n this._worker.addEventListener(\"messageerror\", this._onMessageError);\n this._worker.addEventListener(\"error\", this._onError);\n this._setRunning(true);\n }\n\n private _onMessage = (event: MessageEvent): void => {\n this._setMessage(event.data);\n };\n\n // Fired when the worker posted a value this context cannot deserialize. The\n // event carries no usable payload, so report a synthetic DataError.\n private _onMessageError = (): void => {\n this._setError({\n name: \"DataError\",\n message: \"Failed to deserialize a message received from the worker.\",\n });\n };\n\n // An uncaught error inside the worker script. The worker itself stays alive\n // (the platform does not auto-terminate it), so restart-on-error explicitly\n // re-spawns a fresh worker when enabled and the bound is not exhausted.\n private _onError = (event: ErrorEvent): void => {\n this._setError({\n name: \"Error\",\n message: event.message || \"Worker script error.\",\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n if (this._restartOnError && this._restartCount < this._maxRestarts) {\n this._scheduleRestart();\n }\n };\n\n private _scheduleRestart(): void {\n this._clearRestartTimer();\n const gen = this._gen;\n this._restartTimer = setTimeout(() => {\n // §3.4: a dispose() between scheduling and firing bumps _gen; skip the\n // re-spawn so a torn-down Core does not resurrect a worker.\n if (gen !== this._gen) return;\n this._restartTimer = null;\n this._restartCount++;\n this._terminateWorker();\n // Clear the crash error BEFORE re-spawning so a successful restart leaves a\n // consistent running=true / error=null state (an `error` binding must not\n // keep showing the previous script's failure once the fresh worker is live).\n // Order matters: _spawn() re-sets `error` if the new spawn itself fails, so\n // a failed restart still surfaces its own error rather than null.\n this._setError(null);\n this._spawn();\n }, this._restartInterval);\n }\n\n private _clearRestartTimer(): void {\n if (this._restartTimer !== null) {\n clearTimeout(this._restartTimer);\n this._restartTimer = null;\n }\n }\n\n private _terminateWorker(): void {\n if (!this._worker) return;\n this._worker.removeEventListener(\"message\", this._onMessage);\n this._worker.removeEventListener(\"messageerror\", this._onMessageError);\n this._worker.removeEventListener(\"error\", this._onError);\n this._worker.terminate();\n this._worker = null;\n this._setRunning(false);\n }\n\n private _normalizeError(err: unknown): WcsWorkerErrorDetail {\n if (err instanceof Error) {\n // DOMException is an Error subclass; its `name` (DataCloneError, etc.) is\n // the meaningful discriminator for consumers switching on failure kind.\n return { name: err.name, message: err.message };\n }\n return { name: \"Error\", message: String(err) };\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWorker } from \"./components/Worker.js\";\n\nlet registered = false;\n\n// Attribute names for the optional post-on-click DOM trigger (clipboard.js-style\n// DX). The element carrying `data-worker-target` points at a <wcs-worker> by id;\n// the payload to post comes from either a literal `data-worker-text` or a\n// `data-worker-from` CSS selector resolving to a source element.\nconst TEXT_ATTRIBUTE = \"data-worker-text\";\nconst FROM_ATTRIBUTE = \"data-worker-from\";\n\nfunction resolveText(triggerElement: Element): string | null {\n // Literal text wins when present (including an empty string — posting \"\" is a\n // legitimate request). The `?? \"\"` right-hand side is defensive and\n // unreachable: hasAttribute() just returned true, so getAttribute() cannot be\n // null here. It exists only to satisfy the `string | null` return type — do\n // not chase coverage on it (the DOM contract makes the null branch impossible).\n if (triggerElement.hasAttribute(TEXT_ATTRIBUTE)) {\n return triggerElement.getAttribute(TEXT_ATTRIBUTE) ?? \"\";\n }\n const selector = triggerElement.getAttribute(FROM_ATTRIBUTE);\n if (!selector) return null;\n // A user-authored selector can be syntactically invalid (e.g. `[data-*` or a\n // bare `:not()`), which makes querySelector throw a SyntaxError. Swallow it and\n // treat the source as unresolvable — the same \"nothing to post\" path as a\n // selector that matches no element — so one bad attribute never crashes the\n // document-level click handler and kills autoTrigger for the whole tab.\n let source: Element | null;\n try {\n source = document.querySelector(selector);\n } catch {\n return null;\n }\n if (!source) return null;\n // Read a form control's `value`; fall back to text content. A bare\n // `\"value\" in source` check is too broad — it also matches <button>,\n // <li value>, <progress>, etc. (which carry an unrelated `value`), posting the\n // wrong thing. Narrow to the text-bearing controls a user actually points\n // `data-worker-from` at; everything else falls through to textContent.\n if (\n source instanceof HTMLInputElement ||\n source instanceof HTMLTextAreaElement ||\n source instanceof HTMLSelectElement\n ) {\n return source.value;\n }\n // `?? \"\"` is defensive: per the DOM spec only Document / DocumentType /\n // Notation nodes have a null `textContent`, and querySelector only ever returns\n // an Element (whose textContent is always a string). The branch is therefore\n // unreachable in practice and kept solely for the `string | null` type — not\n // worth a contrived test.\n return source.textContent ?? \"\";\n}\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const workerId = triggerElement.getAttribute(config.triggerAttribute);\n if (!workerId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWorker as a value (avoids a components ⇄ autoTrigger import cycle:\n // Worker.connectedCallback() calls registerAutoTrigger()). instanceof against\n // the customElements registry keeps the same identity guarantee.\n const WorkerCtor = customElements.get(config.tagNames.worker);\n const workerElement = document.getElementById(workerId);\n if (!WorkerCtor || !(workerElement instanceof WorkerCtor)) return;\n\n const text = resolveText(triggerElement);\n // No resolvable source: leave the click alone (do not preventDefault) so the\n // element's default action is unaffected.\n if (text === null) return;\n\n // Suppress the default action so a post can run without navigating. Intentional:\n // do not attach data-worker-target to an element whose default action you also\n // want (a real <a href> link). See README \"Optional DOM Triggering\".\n event.preventDefault();\n (workerElement as WcsWorker).post(text);\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/upgrade-properties.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\n// custom element の property upgrade — `static wcBindable.inputs` に宣言した入力のうち、\n// 要素が upgrade される前に代入された own データプロパティを取り込み直す。\n//\n// なぜ必要か:\n// 未定義タグの要素は素の HTMLElement なので、`el.url = \"...\"` は own データプロパティを作る。\n// upgrade 後にクラスの accessor が prototype へ入っても own プロパティが優先されるため、\n// setter は二度と呼ばれず、値は要素へ届かないまま消える(エラーも警告も出ない)。\n// 常にプロパティ代入を行う framework(Angular の `[prop]`、Lit の `.prop=`、\n// Solid の `prop:`、Vue の `.prop` 修飾子)× 遅延定義(autoloader / CDN / code-split)で\n// 常態的に起きる。docs/architecture-hardening/13-framework-adapter-binding-constraints.md §1.2。\n//\n// 安全側の判定:\n// own プロパティがあっても、prototype チェーンに accessor が無ければ「シャドウ」ではなく\n// その own プロパティ自体が正規の格納先なので触らない(public class field を壊さない)。\n//\n// SINGLE SOURCE OF TRUTH: edit only this file (/protocol/upgrade-properties.ts), then run\n// `node scripts/sync-protocol-types.mjs` to regenerate the per-package copies\n// (packages/<pkg>/src/protocol/upgradeProperties.ts). Those copies are generated — do not edit them.\nimport { IWcBindable } from \"./wcBindable.js\";\n\nfunction hasAccessorOnPrototype(target: object, name: string): boolean {\n let proto = Object.getPrototypeOf(target);\n while (proto !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name);\n if (descriptor !== undefined) {\n return typeof descriptor.get === \"function\" || typeof descriptor.set === \"function\";\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n}\n\n/**\n * `connectedCallback` の先頭で呼ぶ。宣言済み input のうち upgrade 前の代入で\n * accessor をシャドウしている own プロパティを、delete → 再代入で setter に通し直す。\n *\n * - 冪等: 再代入は accessor を通るので own プロパティは残らず、2 回目以降は no-op。\n * - 宣言に `inputs` が無い要素、`wcBindable` を持たない要素では何もしない。\n * - 値の意味は変えない。今まで捨てられていた代入が届くようになる一方向の変化。\n */\nexport function upgradeProperties(element: object): void {\n const declaration = (element as { constructor?: { wcBindable?: IWcBindable } }).constructor?.wcBindable;\n const inputs = declaration?.inputs;\n if (inputs === undefined) return;\n for (const input of inputs) {\n const name = input.name;\n if (!Object.prototype.hasOwnProperty.call(element, name)) continue;\n if (!hasAccessorOnPrototype(element, name)) continue;\n const record = element as Record<string, unknown>;\n const value = record[name];\n delete record[name];\n record[name] = value;\n }\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable, WcsWorkerErrorDetail } from \"../types.js\";\nimport { WorkerCore } from \"../core/WorkerCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n// Named WcsWorker (not `Worker`) to avoid shadowing the global `Worker`\n// constructor and to match the <wcs-broadcast> WcsBroadcast / <wcs-ws>\n// WcsWebSocket convention.\nexport class WcsWorker extends HTMLElement {\n // SSR (§4.1/§4.4): expose connectedCallbackPromise backed by _core.observe()\n // so a shell renderer can await first-connect readiness uniformly across all\n // IO nodes. The worker still spawns synchronously in connectedCallback; the\n // Core's observe() resolves immediately (command-driven, no async probe), so\n // the promise is effectively already-resolved but the contract is honored.\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WorkerCore.wcBindable,\n // Shell-level settable surface. `src` selects the script; `manual` suppresses\n // auto-spawn; `keep-alive` keeps the worker past disconnect; the restart-*\n // inputs configure opt-in restart-on-error. There is no momentary `post`\n // property: posting needs an argument (the payload), so element actions run\n // via command-token (`command.post: $command.ping`) or the DOM autoTrigger,\n // keeping `post` a plain command and the `command.post:` wiring readable.\n inputs: [\n { name: \"src\", attribute: \"src\" },\n { name: \"type\", attribute: \"type\" },\n { name: \"name\", attribute: \"name\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"keepAlive\", attribute: \"keep-alive\" },\n { name: \"restartOnError\", attribute: \"restart-on-error\" },\n { name: \"maxRestarts\", attribute: \"max-restarts\" },\n { name: \"restartInterval\", attribute: \"restart-interval\" },\n ],\n // Commands are identical to the Core's — the attribute accessors (src, type,\n // name, ...) do not collide with start/post/terminate.\n commands: WorkerCore.wcBindable.commands,\n };\n static get observedAttributes(): string[] { return [\"src\"]; }\n\n private _core: WorkerCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WorkerCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-worker:running-changed\": (d) => ({ running: d === true }),\n \"wcs-worker:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get src(): string {\n return this.getAttribute(\"src\") || \"\";\n }\n\n set src(value: string) {\n this.setAttribute(\"src\", value);\n }\n\n get type(): WorkerType {\n return this.getAttribute(\"type\") === \"classic\" ? \"classic\" : \"module\";\n }\n\n set type(value: WorkerType) {\n this.setAttribute(\"type\", value);\n }\n\n get name(): string {\n return this.getAttribute(\"name\") || \"\";\n }\n\n set name(value: string) {\n this.setAttribute(\"name\", value);\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n get keepAlive(): boolean {\n return this.hasAttribute(\"keep-alive\");\n }\n\n set keepAlive(value: boolean) {\n if (value) {\n this.setAttribute(\"keep-alive\", \"\");\n } else {\n this.removeAttribute(\"keep-alive\");\n }\n }\n\n get restartOnError(): boolean {\n return this.hasAttribute(\"restart-on-error\");\n }\n\n set restartOnError(value: boolean) {\n if (value) {\n this.setAttribute(\"restart-on-error\", \"\");\n } else {\n this.removeAttribute(\"restart-on-error\");\n }\n }\n\n get maxRestarts(): number {\n const attr = this.getAttribute(\"max-restarts\");\n // `max-restarts=\"Infinity\"` is the documented default-equivalent for an\n // unbounded restart budget. parseInt(\"Infinity\", 10) is NaN, so match it\n // explicitly rather than leaning on the NaN fallback (which would silently\n // break if that fallback ever changed). Any other non-numeric value still\n // falls back to Infinity via the NaN guard.\n if (attr === \"Infinity\") return Infinity;\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxRestarts(value: number) {\n this.setAttribute(\"max-restarts\", String(value));\n }\n\n get restartInterval(): number {\n const attr = this.getAttribute(\"restart-interval\");\n const parsed = attr ? parseInt(attr, 10) : 0;\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n\n set restartInterval(value: number) {\n this.setAttribute(\"restart-interval\", String(value));\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get error(): WcsWorkerErrorDetail | null {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get running(): boolean {\n return this._core.running;\n }\n\n // --- Commands ---\n\n start(): void {\n // Delegate unconditionally — including the empty-`src` case — so the Core's\n // never-throw contract holds at the Shell boundary too: start(\"\") raises a\n // TypeError through `error` rather than failing silently. The auto-spawn\n // paths (connectedCallback / attributeChangedCallback) already gate on a\n // non-empty `src`, so this only affects an explicit `el.start()` call.\n this._core.start(this.src, {\n type: this.type,\n name: this.name,\n restartOnError: this.restartOnError,\n maxRestarts: this.maxRestarts,\n restartInterval: this.restartInterval,\n });\n }\n\n post(data: any, transfer?: Transferable[]): void {\n this._core.post(data, transfer);\n }\n\n terminate(): void {\n this._core.terminate();\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"src\" && this.isConnected && !this.manual && newValue) {\n this.start();\n }\n }\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // SSR (§4.4): back connectedCallbackPromise with the Core's observe(). It\n // resolves immediately for this command-driven node, but wiring it keeps the\n // readiness contract uniform with the async-init IO nodes.\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.src) {\n this.start();\n }\n }\n\n disconnectedCallback(): void {\n // Deliberately does NOT call unregisterAutoTrigger(). The autoTrigger click\n // listener is a single process-wide document listener (registerAutoTrigger\n // is idempotent), shared by every <wcs-worker> on the page — not owned by\n // this element. Tearing it down when the last element disconnects would\n // break a later-inserted trigger, so it is intentionally left installed for\n // the document's lifetime (one passive listener, negligible cost). This\n // mirrors <wcs-broadcast> / <wcs-clipboard>, which register but never\n // unregister either; unregisterAutoTrigger stays exported purely as a\n // symmetric teardown hook for tests / advanced manual control.\n //\n // keep-alive intentionally leaves the worker running past disconnect: the\n // worker outlives the element and ownership transfers to the caller, who must\n // call terminate() to free the thread. Without keep-alive the worker is torn\n // down like <wcs-ws> / <wcs-broadcast> close on disconnect.\n if (!this.keepAlive) {\n this._core.dispose();\n }\n }\n}\n","import { WcsWorker } from \"./components/Worker.js\";\nimport { config } from \"./config.js\";\n\n/**\n * Register this package's tags. Pass a scoped `CustomElementRegistry` to define\n * them for a single shadow tree -- scoped registries do not inherit the global\n * one, so a tree using one needs its own definitions.\n */\nexport function registerComponents(registry: CustomElementRegistry = customElements): void {\n if (!registry.get(config.tagNames.worker)) {\n registry.define(config.tagNames.worker, WcsWorker);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWorker(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcstack/worker",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Declarative Web Worker component for Web Components. Framework-agnostic Dedicated Worker primitive via wc-bindable-protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.esm.js",
|