@wcstack/midi 3.5.4 → 4.0.0-rc.1
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/dist/auto.min.js +1 -1
- package/dist/auto.min.js.map +1 -1
- package/dist/index.esm.js +21 -32
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/auto.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e={tagNames:{midi:"wcs-midi"}},t=e,s="capability-missing",n="not-allowed",i="access-error",r="send-failed";const o={type:"other",channel:null,note:null,velocity:null,control:null,value:null};const a="unsupported",c=e=>e.detail,u=e=>t=>c(t)?.[e]??null;class l extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-midi:message",semantics:"event"},{name:"type",event:"wcs-midi:message",semantics:"event",getter:u("type")},{name:"channel",event:"wcs-midi:message",semantics:"event",getter:u("channel")},{name:"note",event:"wcs-midi:message",semantics:"event",getter:u("note")},{name:"velocity",event:"wcs-midi:message",semantics:"event",getter:u("velocity")},{name:"control",event:"wcs-midi:message",semantics:"event",getter:u("control")},{name:"value",event:"wcs-midi:message",semantics:"event",getter:u("value")},{name:"devices",event:"wcs-midi:devices",semantics:"state"},{name:"connected",event:"wcs-midi:statechange",semantics:"state"},{name:"permission",event:"wcs-midi:permission",semantics:"state"},{name:"granted",event:"wcs-midi:permission",semantics:"state",getter:e=>"granted"===c(e)},{name:"denied",event:"wcs-midi:permission",semantics:"state",getter:e=>"denied"===c(e)},{name:"unsupported",event:"wcs-midi:permission",semantics:"state",getter:e=>c(e)===a},{name:"error",event:"wcs-midi:error",semantics:"state"},{name:"errorInfo",event:"wcs-midi:error-info-changed",semantics:"state"}],commands:[{name:"request",async:!0},{name:"close"},{name:"send"}]};_target;_options={};_access=null;_hookedInputs=new Set;_message=null;_devices=[];_connected=!1;_permission="prompt";_error=null;_errorInfo=null;_permissionStatus=null;_gen=0;_ready=Promise.resolve();constructor(e,t){super(),this._target=t??this,e&&(this._options={...e})}get message(){return this._message}get type(){return this._message?.type??null}get channel(){return this._message?.channel??null}get note(){return this._message?.note??null}get velocity(){return this._message?.velocity??null}get control(){return this._message?.control??null}get value(){return this._message?.value??null}get devices(){return this._devices}get connected(){return this._connected}get permission(){return this._permission}get granted(){return"granted"===this._permission}get denied(){return"denied"===this._permission}get unsupported(){return this._permission===a}get error(){return this._error}get errorInfo(){return this._errorInfo}get ready(){return this._ready}observe(e){const t=null===this._access;return this.setOptions(e),e.auto&&t&&(this._ready=this.request()),this._ready}setOptions(e){this._options={...this._options,...e},this._access&&this._hookInputs(this._access)}request(){const e=this._resolveApi();if(!e)return this._setPermission(a),this._setError(a,a),this._ready=Promise.resolve(),this._ready;const t=++this._gen;return this._probePermission(),this._ready=e({sysex:!0===this._options.sysex}).then(e=>{t===this._gen&&(this._access=e,e.onstatechange=this._onStateChange,this._setError(null),this._setPermission("granted"),this._hookInputs(e),this._publishDevices(e),this._setConnected(!0))},e=>{t===this._gen&&(this._setPermission("denied"),this._setError(this._messageOf(e),e?.name))}),this._ready}close(){this._gen++,this._unhookInputs(),this._access&&(this._access.onstatechange=null,this._access=null),this._setConnected(!1)}send(e,t){const s=this._resolveOutput();if(s)try{s.send(e,t)}catch(e){this._setError(this._messageOf(e),"send")}}dispose(){this.close(),this._permissionStatus&&(this._permissionStatus.removeEventListener("change",this._onPermissionChange),this._permissionStatus=null)}_resolveApi(){const e=globalThis.navigator;return e&&"function"==typeof e.requestMIDIAccess?t=>e.requestMIDIAccess(t):null}_messageOf(e){return"string"==typeof e?.message&&""!==e.message?e.message:"MIDI error"}_probePermission(){if(this._permissionStatus)return;const e=globalThis.navigator.permissions;if(!e||"function"!=typeof e.query)return;const t=this._gen;e.query({name:"midi",sysex:!0===this._options.sysex}).then(e=>{t===this._gen&&(this._permissionStatus=e,this._setPermission(e.state),e.addEventListener("change",this._onPermissionChange))},()=>{})}_onPermissionChange=e=>{this._setPermission(e.target.state)};_matches(e,t){if(e.id===t)return!0;return(e.name??"").toLowerCase().startsWith(t.toLowerCase())}_selectedInputs(e){const t=[...e.inputs.values()],s=this._options.input;return null==s||""===s?t:t.filter(e=>this._matches(e,s))}_resolveOutput(){if(!this._access)return null;const e=[...this._access.outputs.values()],t=this._options.output;return null==t||""===t?e[0]??null:e.find(e=>this._matches(e,t))??null}_hookInputs(e){const t=new Set(this._selectedInputs(e));for(const e of this._hookedInputs)t.has(e)||(e.onmidimessage=null,this._hookedInputs.delete(e));for(const e of t)this._hookedInputs.has(e)||(e.onmidimessage=this._onMidiMessage,this._hookedInputs.add(e))}_unhookInputs(){for(const e of this._hookedInputs)e.onmidimessage=null;this._hookedInputs.clear()}_onStateChange=()=>{const e=this._access;this._hookInputs(e),this._publishDevices(e)};_onMidiMessage=e=>{const t=e.data;if(!t)return;const s=function(e){const t=e[0];if("number"!=typeof t)return o;const s="number"==typeof e[1]?e[1]:0,n="number"==typeof e[2]?e[2]:0;if(t>=240)return{...o,type:240===t?"sysex":"other"};if(t<128)return o;const i=1+(15&t);switch(240&t){case 128:return{type:"noteoff",channel:i,note:s,velocity:n/127,control:null,value:null};case 144:return n>0?{type:"noteon",channel:i,note:s,velocity:n/127,control:null,value:null}:{type:"noteoff",channel:i,note:s,velocity:0,control:null,value:null};case 160:return{type:"polyaftertouch",channel:i,note:s,velocity:null,control:null,value:n};case 176:return{type:"controlchange",channel:i,note:null,velocity:null,control:s,value:n};case 192:return{type:"programchange",channel:i,note:null,velocity:null,control:null,value:s};case 208:return{type:"aftertouch",channel:i,note:null,velocity:null,control:null,value:s};default:return{type:"pitchbend",channel:i,note:null,velocity:null,control:null,value:((n<<7|s)-8192)/8192}}}(t),n=this._options.channel;if(null!=n&&null!==s.channel&&s.channel!==n)return;const i=e.target;this._publishMessage({...s,data:new Uint8Array(t),port:i?.id??"",portName:i?.name??"",timestamp:e.timeStamp??0})};_publishMessage(e){this._message=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:message",{detail:e,bubbles:!0}))}_publishDevices(e){const t=this._snapshotDevices(e);this._sameDevices(t)||(this._devices=t,this._target.dispatchEvent(new CustomEvent("wcs-midi:devices",{detail:t,bubbles:!0})))}_snapshotDevices(e){const t=(e,t)=>[...e.values()].map(e=>({id:e.id,name:e.name??"",manufacturer:e.manufacturer??"",direction:t,state:"connected"===e.state?"connected":"disconnected"}));return[...t(e.inputs,"input"),...t(e.outputs,"output")]}_sameDevices(e){return e.length===this._devices.length&&e.every((e,t)=>{const s=this._devices[t];return s.id===e.id&&s.state===e.state&&s.direction===e.direction&&s.name===e.name})}_setConnected(e){this._connected!==e&&(this._connected=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:statechange",{detail:e,bubbles:!0})))}_setPermission(e){this._permission!==e&&(this._permission=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:permission",{detail:e,bubbles:!0})))}_setError(e,t){this._error!==e&&(this._error=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:error",{detail:e,bubbles:!0}))),this._commitErrorInfo(null===e?null:function(e,t){return"unsupported"===e?{code:s,phase:"probe",recoverable:!1,message:t}:"send"===e?{code:r,phase:"execute",recoverable:!0,message:t}:"SecurityError"===e||"NotAllowedError"===e?{code:n,phase:"start",recoverable:!1,message:t}:{code:i,phase:"start",recoverable:!0,message:t}}(t,e))}_commitErrorInfo(e){null===this._errorInfo&&null===e||(this._errorInfo=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:error-info-changed",{detail:e,bubbles:!0})))}}function h(e,t){let s=Object.getPrototypeOf(e);for(;null!==s;){const e=Object.getOwnPropertyDescriptor(s,t);if(void 0!==e)return"function"==typeof e.get||"function"==typeof e.set;s=Object.getPrototypeOf(s)}return!1}class d extends HTMLElement{static hasConnectedCallbackPromise=!0;static observedAttributes=["input","output","channel"];static wcBindable={...l.wcBindable,inputs:[{name:"input",attribute:"input"},{name:"output",attribute:"output"},{name:"channel",attribute:"channel"},{name:"sysex",attribute:"sysex"},{name:"auto",attribute:"auto"}]};_core;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new l(null,this),this._internals=this._initInternals(),this._wireStates({"wcs-midi:permission":e=>({granted:"granted"===e,denied:"denied"===e,unsupported:"unsupported"===e}),"wcs-midi:statechange":e=>({connected:!0===e}),"wcs-midi:error":e=>({error:null!==e})})}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const e=this.attachInternals();return e.states.add("wcs-probe"),e.states.delete("wcs-probe"),e}catch{return null}}_wireStates(e){if(null===this._internals)return;const t=this._internals.states;for(const[s,n]of Object.entries(e))this.addEventListener(s,e=>{const s=this.hasAttribute("debug-states");for(const[i,r]of Object.entries(n(e.detail))){try{r?t.add(i):t.delete(i)}catch{}s&&this.toggleAttribute(`data-wcs-state-${i}`,r)}})}get input(){return this.getAttribute("input")??""}set input(e){this.setAttribute("input",e)}get output(){return this.getAttribute("output")??""}set output(e){this.setAttribute("output",e)}get channel(){const e=this.getAttribute("channel");if(null===e)return null;const t=Number(e);return Number.isFinite(t)?t:null}set channel(e){null===e?this.removeAttribute("channel"):this.setAttribute("channel",String(e))}get sysex(){return this.hasAttribute("sysex")}set sysex(e){this.toggleAttribute("sysex",e)}get auto(){return this.hasAttribute("auto")}set auto(e){this.toggleAttribute("auto",e)}get message(){return this._core.message}get type(){return this._core.type}get note(){return this._core.note}get velocity(){return this._core.velocity}get control(){return this._core.control}get value(){return this._core.value}get devices(){return this._core.devices}get connected(){return this._core.connected}get permission(){return this._core.permission}get granted(){return this._core.granted}get denied(){return this._core.denied}get unsupported(){return this._core.unsupported}get error(){return this._core.error}get errorInfo(){return this._core.errorInfo}get core(){return this._core}get connectedCallbackPromise(){return this._connectedCallbackPromise}request(){return this._core.request()}close(){this._core.close()}send(e,t){this._core.send(e,t)}_options(){return{input:this.input,output:this.output,channel:this.channel,sysex:this.sysex,auto:this.auto}}connectedCallback(){!function(e){const t=e.constructor?.wcBindable,s=t?.inputs;if(void 0!==s)for(const t of s){const s=t.name;if(!Object.prototype.hasOwnProperty.call(e,s))continue;if(!h(e,s))continue;const n=e,i=n[s];delete n[s],n[s]=i}}(this),this.style.display="none",this._connectedCallbackPromise=this._core.observe(this._options())}disconnectedCallback(){this._core.dispose()}attributeChangedCallback(e,t,s){t!==s&&this.isConnected&&this._core.setOptions(this._options())}}var m;!function(e=customElements){e.get(t.tagNames.midi)||e.define(t.tagNames.midi,d)}(m);
|
|
1
|
+
const e={tagNames:{midi:"wcs-midi"}},t="capability-missing",s="not-allowed",n="access-error",i="send-failed";const r={type:"other",channel:null,note:null,velocity:null,control:null,value:null};const o="unsupported",a=e=>e.detail,c=e=>t=>a(t)?.[e]??null;class u extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-midi:message",semantics:"event"},{name:"type",event:"wcs-midi:message",semantics:"event",getter:c("type")},{name:"channel",event:"wcs-midi:message",semantics:"event",getter:c("channel")},{name:"note",event:"wcs-midi:message",semantics:"event",getter:c("note")},{name:"velocity",event:"wcs-midi:message",semantics:"event",getter:c("velocity")},{name:"control",event:"wcs-midi:message",semantics:"event",getter:c("control")},{name:"value",event:"wcs-midi:message",semantics:"event",getter:c("value")},{name:"devices",event:"wcs-midi:devices",semantics:"state"},{name:"connected",event:"wcs-midi:statechange",semantics:"state"},{name:"permission",event:"wcs-midi:permission",semantics:"state"},{name:"granted",event:"wcs-midi:permission",semantics:"state",getter:e=>"granted"===a(e)},{name:"denied",event:"wcs-midi:permission",semantics:"state",getter:e=>"denied"===a(e)},{name:"unsupported",event:"wcs-midi:permission",semantics:"state",getter:e=>a(e)===o},{name:"error",event:"wcs-midi:error",semantics:"state"},{name:"errorInfo",event:"wcs-midi:error-info-changed",semantics:"state"}],commands:[{name:"request",async:!0},{name:"close"},{name:"send"}]};_target;_options={};_access=null;_hookedInputs=new Set;_message=null;_devices=[];_connected=!1;_permission="prompt";_error=null;_errorInfo=null;_permissionStatus=null;_gen=0;_ready=Promise.resolve();constructor(e,t){super(),this._target=t??this,e&&(this._options={...e})}get message(){return this._message}get type(){return this._message?.type??null}get channel(){return this._message?.channel??null}get note(){return this._message?.note??null}get velocity(){return this._message?.velocity??null}get control(){return this._message?.control??null}get value(){return this._message?.value??null}get devices(){return this._devices}get connected(){return this._connected}get permission(){return this._permission}get granted(){return"granted"===this._permission}get denied(){return"denied"===this._permission}get unsupported(){return this._permission===o}get error(){return this._error}get errorInfo(){return this._errorInfo}get ready(){return this._ready}observe(e){const t=null===this._access;return this.setOptions(e),e.auto&&t&&(this._ready=this.request()),this._ready}setOptions(e){this._options={...this._options,...e},this._access&&this._hookInputs(this._access)}request(){const e=this._resolveApi();if(!e)return this._setPermission(o),this._setError(o,o),this._ready=Promise.resolve(),this._ready;const t=++this._gen;return this._probePermission(),this._ready=e({sysex:!0===this._options.sysex}).then(e=>{t===this._gen&&(this._access=e,e.onstatechange=this._onStateChange,this._setError(null),this._setPermission("granted"),this._hookInputs(e),this._publishDevices(e),this._setConnected(!0))},e=>{t===this._gen&&(this._setPermission("denied"),this._setError(this._messageOf(e),e?.name))}),this._ready}close(){this._gen++,this._unhookInputs(),this._access&&(this._access.onstatechange=null,this._access=null),this._setConnected(!1)}send(e,t){const s=this._resolveOutput();if(s)try{s.send(e,t)}catch(e){this._setError(this._messageOf(e),"send")}}dispose(){this.close(),this._permissionStatus&&(this._permissionStatus.removeEventListener("change",this._onPermissionChange),this._permissionStatus=null)}_resolveApi(){const e=globalThis.navigator;return e&&"function"==typeof e.requestMIDIAccess?t=>e.requestMIDIAccess(t):null}_messageOf(e){return"string"==typeof e?.message&&""!==e.message?e.message:"MIDI error"}_probePermission(){if(this._permissionStatus)return;const e=globalThis.navigator.permissions;if(!e||"function"!=typeof e.query)return;const t=this._gen;e.query({name:"midi",sysex:!0===this._options.sysex}).then(e=>{t===this._gen&&(this._permissionStatus=e,this._setPermission(e.state),e.addEventListener("change",this._onPermissionChange))},()=>{})}_onPermissionChange=e=>{this._setPermission(e.target.state)};_matches(e,t){if(e.id===t)return!0;return(e.name??"").toLowerCase().startsWith(t.toLowerCase())}_selectedInputs(e){const t=[...e.inputs.values()],s=this._options.input;return null==s||""===s?t:t.filter(e=>this._matches(e,s))}_resolveOutput(){if(!this._access)return null;const e=[...this._access.outputs.values()],t=this._options.output;return null==t||""===t?e[0]??null:e.find(e=>this._matches(e,t))??null}_hookInputs(e){const t=new Set(this._selectedInputs(e));for(const e of this._hookedInputs)t.has(e)||(e.onmidimessage=null,this._hookedInputs.delete(e));for(const e of t)this._hookedInputs.has(e)||(e.onmidimessage=this._onMidiMessage,this._hookedInputs.add(e))}_unhookInputs(){for(const e of this._hookedInputs)e.onmidimessage=null;this._hookedInputs.clear()}_onStateChange=()=>{const e=this._access;this._hookInputs(e),this._publishDevices(e)};_onMidiMessage=e=>{const t=e.data;if(!t)return;const s=function(e){const t=e[0];if("number"!=typeof t)return r;const s="number"==typeof e[1]?e[1]:0,n="number"==typeof e[2]?e[2]:0;if(t>=240)return{...r,type:240===t?"sysex":"other"};if(t<128)return r;const i=1+(15&t);switch(240&t){case 128:return{type:"noteoff",channel:i,note:s,velocity:n/127,control:null,value:null};case 144:return n>0?{type:"noteon",channel:i,note:s,velocity:n/127,control:null,value:null}:{type:"noteoff",channel:i,note:s,velocity:0,control:null,value:null};case 160:return{type:"polyaftertouch",channel:i,note:s,velocity:null,control:null,value:n};case 176:return{type:"controlchange",channel:i,note:null,velocity:null,control:s,value:n};case 192:return{type:"programchange",channel:i,note:null,velocity:null,control:null,value:s};case 208:return{type:"aftertouch",channel:i,note:null,velocity:null,control:null,value:s};default:return{type:"pitchbend",channel:i,note:null,velocity:null,control:null,value:((n<<7|s)-8192)/8192}}}(t),n=this._options.channel;if(null!=n&&null!==s.channel&&s.channel!==n)return;const i=e.target;this._publishMessage({...s,data:new Uint8Array(t),port:i?.id??"",portName:i?.name??"",timestamp:e.timeStamp??0})};_publishMessage(e){this._message=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:message",{detail:e,bubbles:!0}))}_publishDevices(e){const t=this._snapshotDevices(e);this._sameDevices(t)||(this._devices=t,this._target.dispatchEvent(new CustomEvent("wcs-midi:devices",{detail:t,bubbles:!0})))}_snapshotDevices(e){const t=(e,t)=>[...e.values()].map(e=>({id:e.id,name:e.name??"",manufacturer:e.manufacturer??"",direction:t,state:"connected"===e.state?"connected":"disconnected"}));return[...t(e.inputs,"input"),...t(e.outputs,"output")]}_sameDevices(e){return e.length===this._devices.length&&e.every((e,t)=>{const s=this._devices[t];return s.id===e.id&&s.state===e.state&&s.direction===e.direction&&s.name===e.name})}_setConnected(e){this._connected!==e&&(this._connected=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:statechange",{detail:e,bubbles:!0})))}_setPermission(e){this._permission!==e&&(this._permission=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:permission",{detail:e,bubbles:!0})))}_setError(e,r){this._error!==e&&(this._error=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:error",{detail:e,bubbles:!0}))),this._commitErrorInfo(null===e?null:function(e,r){return"unsupported"===e?{code:t,phase:"probe",recoverable:!1,message:r}:"send"===e?{code:i,phase:"execute",recoverable:!0,message:r}:"SecurityError"===e||"NotAllowedError"===e?{code:s,phase:"start",recoverable:!1,message:r}:{code:n,phase:"start",recoverable:!0,message:r}}(r,e))}_commitErrorInfo(e){null===this._errorInfo&&null===e||(this._errorInfo=e,this._target.dispatchEvent(new CustomEvent("wcs-midi:error-info-changed",{detail:e,bubbles:!0})))}}function l(e,t){let s=Object.getPrototypeOf(e);for(;null!==s;){const e=Object.getOwnPropertyDescriptor(s,t);if(void 0!==e)return"function"==typeof e.get||"function"==typeof e.set;s=Object.getPrototypeOf(s)}return!1}class h extends HTMLElement{static hasConnectedCallbackPromise=!0;static observedAttributes=["input","output","channel"];static wcBindable={...u.wcBindable,inputs:[{name:"input",attribute:"input"},{name:"output",attribute:"output"},{name:"channel",attribute:"channel"},{name:"sysex",attribute:"sysex"},{name:"auto",attribute:"auto"}]};_core;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new u(null,this),this._internals=this._initInternals(),this._wireStates({"wcs-midi:permission":e=>({granted:"granted"===e,denied:"denied"===e,unsupported:"unsupported"===e}),"wcs-midi:statechange":e=>({connected:!0===e}),"wcs-midi:error":e=>({error:null!==e})})}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const e=this.attachInternals();return e.states.add("wcs-probe"),e.states.delete("wcs-probe"),e}catch{return null}}_wireStates(e){if(null===this._internals)return;const t=this._internals.states;for(const[s,n]of Object.entries(e))this.addEventListener(s,e=>{const s=this.hasAttribute("debug-states");for(const[i,r]of Object.entries(n(e.detail))){try{r?t.add(i):t.delete(i)}catch{}s&&this.toggleAttribute(`data-wcs-state-${i}`,r)}})}get input(){return this.getAttribute("input")??""}set input(e){this.setAttribute("input",e)}get output(){return this.getAttribute("output")??""}set output(e){this.setAttribute("output",e)}get channel(){const e=this.getAttribute("channel");if(null===e)return null;const t=Number(e);return Number.isFinite(t)?t:null}set channel(e){null===e?this.removeAttribute("channel"):this.setAttribute("channel",String(e))}get sysex(){return this.hasAttribute("sysex")}set sysex(e){this.toggleAttribute("sysex",e)}get auto(){return this.hasAttribute("auto")}set auto(e){this.toggleAttribute("auto",e)}get message(){return this._core.message}get type(){return this._core.type}get note(){return this._core.note}get velocity(){return this._core.velocity}get control(){return this._core.control}get value(){return this._core.value}get devices(){return this._core.devices}get connected(){return this._core.connected}get permission(){return this._core.permission}get granted(){return this._core.granted}get denied(){return this._core.denied}get unsupported(){return this._core.unsupported}get error(){return this._core.error}get errorInfo(){return this._core.errorInfo}get core(){return this._core}get connectedCallbackPromise(){return this._connectedCallbackPromise}request(){return this._core.request()}close(){this._core.close()}send(e,t){this._core.send(e,t)}_options(){return{input:this.input,output:this.output,channel:this.channel,sysex:this.sysex,auto:this.auto}}connectedCallback(){!function(e){const t=e.constructor?.wcBindable,s=t?.inputs;if(void 0!==s)for(const t of s){const s=t.name;if(!Object.prototype.hasOwnProperty.call(e,s))continue;if(!l(e,s))continue;const n=e,i=n[s];delete n[s],n[s]=i}}(this),this.style.display="none",this._connectedCallbackPromise=this._core.observe(this._options())}disconnectedCallback(){this._core.dispose()}attributeChangedCallback(e,t,s){t!==s&&this.isConnected&&this._core.setOptions(this._options())}}var d;!function(t=customElements){t.get(e.tagNames.midi)||t.define(e.tagNames.midi,h)}(d);
|
|
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/midiCapabilities.ts","../src/midi/parseMessage.ts","../src/core/MidiCore.ts","../src/protocol/upgradeProperties.ts","../src/components/Midi.ts","../src/bootstrapMidi.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n tagNames: {\n midi: string;\n };\n}\n\nconst _config: IInternalConfig = {\n tagNames: {\n midi: \"wcs-midi\",\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\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\n// The defaults as shipped, for warnInvalid: a value 3.x lets through unchecked must not change\n// what a later call is compared against.\nconst defaults: Record<string, unknown> = { ..._config, tagNames: { ..._config.tagNames } };\nconst warned = new Set<string>();\n\n/**\n * 3.5 forward-compat check. Warns, once per key per page, about an option that 4.0's bootstrapMidi\n * throws on: one this package does not have, a value of another type than its default (null, or an\n * array for an object, included), or a tag name it does not define or that is not a string. An\n * undefined value is left out, as in 4.0. It only warns: setConfig then goes on exactly as in 3.x.\n * Bootstrap-time only, never on a hot path.\n */\nfunction warnInvalid(given: Record<string, unknown>, known: Record<string, unknown>, path = \"\"): void {\n for (const [key, value] of Object.entries(given)) {\n const name = path + key;\n const current = known[key];\n if (value === undefined) {\n continue;\n }\n if (\n !Object.prototype.hasOwnProperty.call(known, key) ||\n value === null ||\n typeof value !== typeof current ||\n Array.isArray(value) !== Array.isArray(current)\n ) {\n if (!warned.has(name)) {\n warned.add(name);\n console.warn(`[@wcstack/midi] bootstrapMidi: \"${name}\" is not one of its options, or not of the option's type. 3.x ignores it or applies it unchecked; 4.0 throws on it.`);\n }\n } else if (name === \"tagNames\") {\n warnInvalid(value as Record<string, unknown>, current as Record<string, unknown>, \"tagNames.\");\n }\n }\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n warnInvalid(partialConfig as Record<string, unknown>, defaults);\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * midiCapabilities.ts\n *\n * Web MIDI 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)\n * から import する。\n *\n * この node の失敗は 2 箇所からしか来ない:\n * 1. `requestMIDIAccess()` の rejection — 権限拒否・API 不在・sysex 拒否。\n * 2. `MIDIOutput.send()` の throw — 不正なメッセージ・切断済みポート。\n * `_setError` は screen-orientation と同じ discriminator 技法で、synthetic な\n * `\"unsupported\"` / `\"send\"` ヒントと caught された `Error.name` を弁別する\n * (message の文言に依存した分岐を作らない)。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した midi error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_MIDI_ERROR_CODE = {\n /** `navigator.requestMIDIAccess` 自体が不在(synthetic \"unsupported\")。 */\n CapabilityMissing: \"capability-missing\",\n /**\n * `SecurityError` / `NotAllowedError` — ユーザーが拒否した、あるいは\n * permissions policy / 非 secure context で許可されない。retry では回復しない。\n */\n NotAllowed: \"not-allowed\",\n /** その他の `requestMIDIAccess()` 失敗。fresh な request は成功しうる。 */\n AccessError: \"access-error\",\n /** `MIDIOutput.send()` の失敗(不正なメッセージ / 切断済みポート)。 */\n SendFailed: \"send-failed\",\n} as const;\n\n/**\n * Web MIDI の失敗を serializable な error taxonomy に写す。\n *\n * `name` は呼び出し側が渡す discriminator:\n * - `\"unsupported\"` — API 不在 → phase=\"probe\" / capability-missing。\n * - `\"send\"` — 送信失敗 → phase=\"execute\" / send-failed。recoverable(ポートが\n * 戻れば成功しうる)。\n * - `SecurityError` / `NotAllowedError` — 拒否 → phase=\"start\" / not-allowed。\n * - それ以外(`AbortError`、生の throw、`.name` 欠如等) → phase=\"start\" /\n * access-error。\n */\nexport function deriveMidiErrorInfo(name: string | undefined, message: string): WcsIoErrorInfo {\n if (name === \"unsupported\") {\n return { code: WCS_MIDI_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n if (name === \"send\") {\n return { code: WCS_MIDI_ERROR_CODE.SendFailed, phase: \"execute\", recoverable: true, message };\n }\n if (name === \"SecurityError\" || name === \"NotAllowedError\") {\n return { code: WCS_MIDI_ERROR_CODE.NotAllowed, phase: \"start\", recoverable: false, message };\n }\n return { code: WCS_MIDI_ERROR_CODE.AccessError, phase: \"start\", recoverable: true, message };\n}\n","import { IMidiParsed, MidiMessageType } from \"../types.js\";\n\n// Channel voice message commands (high nibble of the status byte).\nconst NOTE_OFF = 0x80;\nconst NOTE_ON = 0x90;\nconst POLY_AFTERTOUCH = 0xa0;\nconst CONTROL_CHANGE = 0xb0;\nconst PROGRAM_CHANGE = 0xc0;\nconst AFTERTOUCH = 0xd0;\nconst SYSTEM = 0xf0;\n\nconst SYSEX_START = 0xf0;\n\nconst EMPTY: IMidiParsed = {\n type: \"other\", channel: null, note: null, velocity: null, control: null, value: null,\n};\n\n/**\n * Decode a raw MIDI message into the fields bindings actually want.\n *\n * Two normalizations are deliberate, because every consumer would otherwise\n * repeat them:\n *\n * - **A note-on with velocity 0 is reported as `\"noteoff\"`.** Many controllers\n * send running-status note-ons and never emit 0x8n at all; treating them as\n * note-ons leaves stuck notes. The raw status byte is still available in\n * `data[0]` for callers that care.\n * - **Velocity is normalized to 0-1**, so it multiplies straight into a gain\n * without the caller knowing about the 7-bit MIDI range. Controller values\n * stay raw 0-127 (`value`), since their meaning is per-controller.\n *\n * Never throws: a truncated or nonsensical buffer decodes to `type: \"other\"`\n * with every field `null` (async-io-node-guidelines.md §3.6).\n */\nexport function parseMessage(data: Uint8Array | number[]): IMidiParsed {\n const status = data[0];\n if (typeof status !== \"number\") return EMPTY;\n\n const d1 = typeof data[1] === \"number\" ? data[1] : 0;\n const d2 = typeof data[2] === \"number\" ? data[2] : 0;\n\n // System messages (0xF0-0xFF) carry no channel nibble.\n if (status >= SYSTEM) {\n return { ...EMPTY, type: status === SYSEX_START ? \"sysex\" : \"other\" };\n }\n // Below 0x80 is a data byte, not a status byte: the buffer is malformed or\n // running-status (which the Web MIDI API already expands for us).\n if (status < NOTE_OFF) return EMPTY;\n\n const command = status & 0xf0;\n const channel = (status & 0x0f) + 1;\n\n switch (command) {\n case NOTE_OFF:\n return { type: \"noteoff\", channel, note: d1, velocity: d2 / 127, control: null, value: null };\n case NOTE_ON:\n // velocity 0 == note off (see doc comment).\n return d2 > 0\n ? { type: \"noteon\", channel, note: d1, velocity: d2 / 127, control: null, value: null }\n : { type: \"noteoff\", channel, note: d1, velocity: 0, control: null, value: null };\n case POLY_AFTERTOUCH:\n return { type: \"polyaftertouch\", channel, note: d1, velocity: null, control: null, value: d2 };\n case CONTROL_CHANGE:\n return { type: \"controlchange\", channel, note: null, velocity: null, control: d1, value: d2 };\n case PROGRAM_CHANGE:\n return { type: \"programchange\", channel, note: null, velocity: null, control: null, value: d1 };\n case AFTERTOUCH:\n return { type: \"aftertouch\", channel, note: null, velocity: null, control: null, value: d1 };\n default:\n // 0xE0 pitch bend — the only high nibble left between 0x80 and 0xEF once\n // the six cases above are taken. 14-bit little-endian, centered at 8192,\n // normalized to -1..1.\n return {\n type: \"pitchbend\", channel, note: null, velocity: null, control: null,\n value: (((d2 << 7) | d1) - 8192) / 8192,\n };\n }\n}\n\n/** Message kinds a caller may want to filter on, exported for tooling. */\nexport const MIDI_MESSAGE_TYPES: readonly MidiMessageType[] = [\n \"noteon\", \"noteoff\", \"polyaftertouch\", \"controlchange\",\n \"programchange\", \"aftertouch\", \"pitchbend\", \"sysex\", \"other\",\n];\n","import {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState,\n} from \"../types.js\";\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveMidiErrorInfo } from \"./midiCapabilities.js\";\nimport { parseMessage } from \"../midi/parseMessage.js\";\n\nconst UNSUPPORTED = \"unsupported\";\n\n// Minimal structural types for the Web MIDI API. The DOM lib does not ship them\n// in every TypeScript configuration, and structural types keep the Core testable\n// against a fake without casting through `any` at each use site.\ninterface MidiPortLike extends EventTarget {\n id: string;\n name?: string | null;\n manufacturer?: string | null;\n state: string;\n type?: string;\n}\ninterface MidiInputLike extends MidiPortLike {\n onmidimessage: ((event: any) => void) | null;\n}\ninterface MidiOutputLike extends MidiPortLike {\n send(data: number[] | Uint8Array, timestamp?: number): void;\n}\ninterface MidiAccessLike {\n inputs: Map<string, MidiInputLike>;\n outputs: Map<string, MidiOutputLike>;\n onstatechange: ((event: any) => void) | null;\n sysexEnabled?: boolean;\n}\n\nconst detailOf = (event: Event): any => (event as CustomEvent).detail;\nconst messageField = <K extends keyof IMidiMessage>(key: K) =>\n (event: Event): IMidiMessage[K] | null => detailOf(event)?.[key] ?? null;\n\n/**\n * Headless Web MIDI primitive: a framework-agnostic wrapper around\n * `navigator.requestMIDIAccess()` exposed through the wc-bindable protocol.\n *\n * Direction is genuinely two-way, unlike `@wcstack/permission` (monitor only):\n * incoming messages flow element → state as `event`-semantics occurrences, and\n * `send()` is a command going the other way. Both live on one node because a\n * page holds exactly one `MIDIAccess` — splitting input and output into two tags\n * would only force them to coordinate over the same shared handle.\n *\n * Nothing starts on construction. `requestMIDIAccess()` can raise a permission\n * prompt, so it is deliberately command-driven (`request()`), matching the\n * `idle` / Generic Sensor family. `observe({ auto: true })` opts back into\n * requesting immediately.\n *\n * The `MIDIAccess` handle itself is never published: the Core owns it and drops\n * it in `close()` / `dispose()`, as `worker` / `websocket` / `broadcast` do with\n * theirs. Only values cross the protocol boundary.\n */\nexport class MidiCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n // One occurrence event, decomposed into derived getters\n // (async-io-node-guidelines.md §4.2). Never same-value guarded: two\n // identical note-ons are two distinct presses.\n { name: \"message\", event: \"wcs-midi:message\", semantics: \"event\" },\n { name: \"type\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"type\") },\n { name: \"channel\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"channel\") },\n { name: \"note\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"note\") },\n { name: \"velocity\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"velocity\") },\n { name: \"control\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"control\") },\n { name: \"value\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"value\") },\n { name: \"devices\", event: \"wcs-midi:devices\", semantics: \"state\" },\n { name: \"connected\", event: \"wcs-midi:statechange\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-midi:permission\", semantics: \"state\" },\n { name: \"granted\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"granted\" },\n { name: \"denied\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"denied\" },\n { name: \"unsupported\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === UNSUPPORTED },\n { name: \"error\", event: \"wcs-midi:error\", semantics: \"state\" },\n { name: \"errorInfo\", event: \"wcs-midi:error-info-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"request\", async: true },\n { name: \"close\" },\n { name: \"send\" },\n ],\n };\n\n private _target: EventTarget;\n private _options: IMidiOptions = {};\n\n private _access: MidiAccessLike | null = null;\n private _hookedInputs = new Set<MidiInputLike>();\n\n private _message: IMidiMessage | null = null;\n private _devices: IMidiDevice[] = [];\n private _connected = false;\n private _permission: MidiPermissionState = \"prompt\";\n private _error: string | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n\n private _permissionStatus: PermissionStatus | null = null;\n\n // Monotonic id bumped by every request(), close() and dispose(). An in-flight\n // requestMIDIAccess() captures it and bails on resolve when superseded, so a\n // rapid disconnect→reconnect (or a close() mid-flight) never hooks listeners\n // onto a torn-down instance.\n private _gen = 0;\n\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(options?: IMidiOptions | null, target?: EventTarget) {\n super();\n this._target = target ?? this;\n if (options) this._options = { ...options };\n }\n\n // --- Observable getters ---\n\n get message(): IMidiMessage | null { return this._message; }\n get type(): MidiMessageType | null { return this._message?.type ?? null; }\n get channel(): number | null { return this._message?.channel ?? null; }\n get note(): number | null { return this._message?.note ?? null; }\n get velocity(): number | null { return this._message?.velocity ?? null; }\n get control(): number | null { return this._message?.control ?? null; }\n get value(): number | null { return this._message?.value ?? null; }\n\n get devices(): IMidiDevice[] { return this._devices; }\n get connected(): boolean { return this._connected; }\n get permission(): MidiPermissionState { return this._permission; }\n get granted(): boolean { return this._permission === \"granted\"; }\n get denied(): boolean { return this._permission === \"denied\"; }\n get unsupported(): boolean { return this._permission === UNSUPPORTED; }\n get error(): string | null { return this._error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._errorInfo; }\n\n /** Resolves once the current (or initial) access attempt settles. */\n get ready(): Promise<void> { return this._ready; }\n\n // --- Public API ---\n\n /**\n * Store the options and, when `auto` is set, request access. Idempotent:\n * calling it again with new options re-applies port selection to the live\n * access without re-requesting.\n */\n observe(options: IMidiOptions): Promise<void> {\n const wasIdle = this._access === null;\n this.setOptions(options);\n if (options.auto && wasIdle) {\n this._ready = this.request();\n }\n return this._ready;\n }\n\n /**\n * Re-apply port selection / channel filtering. Cheap and safe at any time —\n * with no access held it only records the options for a later `request()`.\n */\n setOptions(options: IMidiOptions): void {\n this._options = { ...this._options, ...options };\n if (this._access) this._hookInputs(this._access);\n }\n\n /**\n * Acquire MIDI access. Never rejects: a refusal or a missing API surfaces as\n * `permission` / `error` state (async-io-node-guidelines.md §3.6).\n */\n request(): Promise<void> {\n const requestAccess = this._resolveApi();\n if (!requestAccess) {\n this._setPermission(UNSUPPORTED);\n this._setError(UNSUPPORTED, UNSUPPORTED);\n this._ready = Promise.resolve();\n return this._ready;\n }\n const gen = ++this._gen;\n this._probePermission();\n this._ready = requestAccess({ sysex: this._options.sysex === true }).then(\n (access: MidiAccessLike) => {\n if (gen !== this._gen) return;\n this._access = access;\n access.onstatechange = this._onStateChange;\n this._setError(null);\n this._setPermission(\"granted\");\n this._hookInputs(access);\n this._publishDevices(access);\n this._setConnected(true);\n },\n (error: any) => {\n if (gen !== this._gen) return;\n this._setPermission(\"denied\");\n this._setError(this._messageOf(error), error?.name);\n },\n );\n return this._ready;\n }\n\n /**\n * Release the access handle and detach every listener, keeping the observed\n * permission state. A later `request()` re-acquires.\n */\n close(): void {\n this._gen++;\n this._unhookInputs();\n if (this._access) {\n this._access.onstatechange = null;\n this._access = null;\n }\n this._setConnected(false);\n }\n\n /**\n * Send a raw MIDI message to the selected output port (or the first available\n * one). No-op when no output is reachable; a failing `send()` surfaces on\n * `error` rather than throwing.\n *\n * Positional arguments pass through verbatim from command-token\n * (docs/spec-proposal-command-token-arguments.md).\n */\n send(data: number[] | Uint8Array, timestamp?: number): void {\n const port = this._resolveOutput();\n if (!port) return;\n try {\n port.send(data, timestamp);\n } catch (error: any) {\n this._setError(this._messageOf(error), \"send\");\n }\n }\n\n /**\n * Detach everything. Headless callers own this lifecycle themselves: without\n * it the live `onmidimessage` handlers keep this instance reachable for as\n * long as the ports are alive.\n */\n dispose(): void {\n this.close();\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal: API resolution ---\n\n // Resolved at call time, never cached: keeps the unsupported branch honest and\n // lets tests swap the global (async-io-node-guidelines.md §3.7). Read off\n // globalThis rather than the bare identifier so an SSR/worker context with no\n // navigator at all takes the same \"unsupported\" path as Safari.\n private _resolveApi(): ((options: { sysex: boolean }) => Promise<MidiAccessLike>) | null {\n const nav = (globalThis as { navigator?: any }).navigator;\n if (!nav || typeof nav.requestMIDIAccess !== \"function\") return null;\n return (options) => nav.requestMIDIAccess(options);\n }\n\n private _messageOf(error: any): string {\n return typeof error?.message === \"string\" && error.message !== \"\" ? error.message : \"MIDI error\";\n }\n\n // --- Internal: permission monitoring ---\n\n // Optional extra: browsers that answer query({name:\"midi\"}) let a grant flipped\n // in site settings flow into the declarative state without a re-request. Where\n // the descriptor is rejected we simply keep inferring from request() outcomes.\n private _probePermission(): void {\n if (this._permissionStatus) return;\n // Only ever reached after _resolveApi() found navigator.requestMIDIAccess,\n // so navigator itself is known to exist here.\n const permissions = (globalThis as { navigator?: any }).navigator.permissions;\n if (!permissions || typeof permissions.query !== \"function\") return;\n const gen = this._gen;\n permissions.query({ name: \"midi\", sysex: this._options.sysex === true }).then(\n (status: PermissionStatus) => {\n if (gen !== this._gen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as MidiPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => { /* descriptor not understood — request() outcomes remain the source */ },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n this._setPermission((event.target as PermissionStatus).state as MidiPermissionState);\n };\n\n // --- Internal: ports ---\n\n private _matches(port: MidiPortLike, selector: string): boolean {\n if (port.id === selector) return true;\n const name = port.name ?? \"\";\n return name.toLowerCase().startsWith(selector.toLowerCase());\n }\n\n // Takes the access explicitly rather than reading the field: every call site\n // already holds a non-null handle, and a defensive re-check here would be a\n // branch no test could ever reach.\n private _selectedInputs(access: MidiAccessLike): MidiInputLike[] {\n const all = [...access.inputs.values()];\n const selector = this._options.input;\n // No selector means \"whatever is plugged in\" — the expectation for MIDI is\n // that a controller just works, not that the page names it first.\n if (selector === undefined || selector === null || selector === \"\") return all;\n return all.filter((port) => this._matches(port, selector));\n }\n\n private _resolveOutput(): MidiOutputLike | null {\n if (!this._access) return null;\n const all = [...this._access.outputs.values()];\n const selector = this._options.output;\n if (selector === undefined || selector === null || selector === \"\") return all[0] ?? null;\n return all.find((port) => this._matches(port, selector)) ?? null;\n }\n\n private _hookInputs(access: MidiAccessLike): void {\n const wanted = new Set(this._selectedInputs(access));\n for (const port of this._hookedInputs) {\n if (!wanted.has(port)) {\n port.onmidimessage = null;\n this._hookedInputs.delete(port);\n }\n }\n for (const port of wanted) {\n if (this._hookedInputs.has(port)) continue;\n port.onmidimessage = this._onMidiMessage;\n this._hookedInputs.add(port);\n }\n }\n\n private _unhookInputs(): void {\n for (const port of this._hookedInputs) port.onmidimessage = null;\n this._hookedInputs.clear();\n }\n\n private _onStateChange = (): void => {\n // Port list changed: re-apply selection (a newly plugged input must start\n // delivering) and republish. `onstatechange` is only installed while an\n // access is held and cleared in close(), so the handle is non-null here.\n const access = this._access!;\n this._hookInputs(access);\n this._publishDevices(access);\n };\n\n private _onMidiMessage = (event: { data?: Uint8Array | null; target?: any; timeStamp?: number }): void => {\n const raw = event.data;\n if (!raw) return;\n const parsed = parseMessage(raw);\n const channelFilter = this._options.channel;\n if (channelFilter != null && parsed.channel !== null && parsed.channel !== channelFilter) return;\n const port = event.target as MidiPortLike | undefined;\n this._publishMessage({\n ...parsed,\n // Fresh copy every time: the platform buffer must never be handed out\n // (producer snapshot contract).\n data: new Uint8Array(raw),\n port: port?.id ?? \"\",\n portName: port?.name ?? \"\",\n timestamp: event.timeStamp ?? 0,\n });\n };\n\n // --- Internal: state setters ---\n\n // Occurrence, not state: identical payloads are distinct presses, so there is\n // deliberately no same-value guard here.\n private _publishMessage(message: IMidiMessage): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:message\", { detail: message, bubbles: true }));\n }\n\n private _publishDevices(access: MidiAccessLike): void {\n const next = this._snapshotDevices(access);\n if (this._sameDevices(next)) return;\n // Fresh array assigned before notifying (producer snapshot contract).\n this._devices = next;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:devices\", { detail: next, bubbles: true }));\n }\n\n private _snapshotDevices(access: MidiAccessLike): IMidiDevice[] {\n const collect = (ports: Map<string, MidiPortLike>, direction: \"input\" | \"output\"): IMidiDevice[] =>\n [...ports.values()].map((port) => ({\n id: port.id,\n name: port.name ?? \"\",\n manufacturer: port.manufacturer ?? \"\",\n direction,\n state: port.state === \"connected\" ? \"connected\" : \"disconnected\",\n }));\n return [\n ...collect(access.inputs as Map<string, MidiPortLike>, \"input\"),\n ...collect(access.outputs as Map<string, MidiPortLike>, \"output\"),\n ];\n }\n\n // Content comparison, not reference: statechange fires separately for the\n // input and the output side of one physical device, so an unfiltered\n // republish would double-notify on every plug.\n private _sameDevices(next: IMidiDevice[]): boolean {\n if (next.length !== this._devices.length) return false;\n return next.every((device, i) => {\n const prev = this._devices[i];\n return prev.id === device.id && prev.state === device.state\n && prev.direction === device.direction && prev.name === device.name;\n });\n }\n\n private _setConnected(connected: boolean): void {\n if (this._connected === connected) return;\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:statechange\", { detail: connected, bubbles: true }));\n }\n\n private _setPermission(permission: MidiPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:permission\", { detail: permission, bubbles: true }));\n }\n\n private _setError(error: string | null, name?: string): void {\n if (this._error !== error) {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error\", { detail: error, bubbles: true }));\n }\n this._commitErrorInfo(error === null ? null : deriveMidiErrorInfo(name, error));\n }\n\n // errorInfo transitions exactly when error does (no independent same-value\n // guard: a fresh object is built per transition).\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n if (this._errorInfo === null && info === null) return;\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error-info-changed\", { detail: info, bubbles: true }));\n }\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 {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState, WcsIoErrorInfo,\n} from \"../types.js\";\nimport { MidiCore } from \"../core/MidiCore.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n/**\n * `<wcs-midi>` — declarative Web MIDI input/output.\n *\n * Nothing happens on connect: `requestMIDIAccess()` can raise a permission\n * prompt, so access is command-driven (`command.request`). Add the `auto`\n * attribute to opt into requesting as soon as the element connects.\n */\nexport class WcsMidi extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static observedAttributes = [\"input\", \"output\", \"channel\"];\n\n static wcBindable: IWcBindable = {\n ...MidiCore.wcBindable,\n inputs: [\n { name: \"input\", attribute: \"input\" },\n { name: \"output\", attribute: \"output\" },\n { name: \"channel\", attribute: \"channel\" },\n { name: \"sysex\", attribute: \"sysex\" },\n { name: \"auto\", attribute: \"auto\" },\n ],\n };\n\n private _core: MidiCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new MidiCore(null, this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-midi:permission\": (d) => ({\n granted: d === \"granted\",\n denied: d === \"denied\",\n unsupported: d === \"unsupported\",\n }),\n \"wcs-midi:statechange\": (d) => ({ connected: d === true }),\n \"wcs-midi:error\": (d) => ({ error: d !== null }),\n });\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 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 non-dashed\n // state names. Either case silently disables reflection.\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 input(): string { return this.getAttribute(\"input\") ?? \"\"; }\n set input(value: string) { this.setAttribute(\"input\", value); }\n\n get output(): string { return this.getAttribute(\"output\") ?? \"\"; }\n set output(value: string) { this.setAttribute(\"output\", value); }\n\n get channel(): number | null {\n const raw = this.getAttribute(\"channel\");\n if (raw === null) return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n }\n\n set channel(value: number | null) {\n if (value === null) {\n this.removeAttribute(\"channel\");\n } else {\n this.setAttribute(\"channel\", String(value));\n }\n }\n\n get sysex(): boolean { return this.hasAttribute(\"sysex\"); }\n set sysex(value: boolean) { this.toggleAttribute(\"sysex\", value); }\n\n get auto(): boolean { return this.hasAttribute(\"auto\"); }\n set auto(value: boolean) { this.toggleAttribute(\"auto\", value); }\n\n // --- Core delegated getters ---\n\n get message(): IMidiMessage | null { return this._core.message; }\n get type(): MidiMessageType | null { return this._core.type; }\n get note(): number | null { return this._core.note; }\n get velocity(): number | null { return this._core.velocity; }\n get control(): number | null { return this._core.control; }\n get value(): number | null { return this._core.value; }\n get devices(): IMidiDevice[] { return this._core.devices; }\n get connected(): boolean { return this._core.connected; }\n get permission(): MidiPermissionState { return this._core.permission; }\n get granted(): boolean { return this._core.granted; }\n get denied(): boolean { return this._core.denied; }\n get unsupported(): boolean { return this._core.unsupported; }\n get error(): string | null { return this._core.error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._core.errorInfo; }\n\n /** Headless escape hatch: the Core backing this element. */\n get core(): MidiCore { return this._core; }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Commands ---\n\n request(): Promise<void> { return this._core.request(); }\n close(): void { this._core.close(); }\n send(data: number[] | Uint8Array, timestamp?: number): void { this._core.send(data, timestamp); }\n\n // --- Internal ---\n\n private _options(): IMidiOptions {\n return {\n input: this.input,\n output: this.output,\n channel: this.channel,\n sysex: this.sysex,\n auto: this.auto,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n this._connectedCallbackPromise = this._core.observe(this._options());\n }\n\n disconnectedCallback(): void {\n this._core.dispose();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n // Port selection and channel filtering are live: they re-hook the existing\n // access rather than re-requesting it (no second permission prompt).\n if (this.isConnected) this._core.setOptions(this._options());\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapMidi(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsMidi } from \"./components/Midi.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.midi)) {\n registry.define(config.tagNames.midi, WcsMidi);\n }\n}\n"],"names":["_config","tagNames","midi","config","WCS_MIDI_ERROR_CODE","EMPTY","type","channel","note","velocity","control","value","UNSUPPORTED","detailOf","event","detail","messageField","key","MidiCore","EventTarget","static","protocol","version","properties","name","semantics","getter","e","commands","async","_target","_options","_access","_hookedInputs","Set","_message","_devices","_connected","_permission","_error","_errorInfo","_permissionStatus","_gen","_ready","Promise","resolve","constructor","options","target","super","this","message","devices","connected","permission","granted","denied","unsupported","error","errorInfo","ready","observe","wasIdle","setOptions","auto","request","_hookInputs","requestAccess","_resolveApi","_setPermission","_setError","gen","_probePermission","sysex","then","access","onstatechange","_onStateChange","_publishDevices","_setConnected","_messageOf","close","_unhookInputs","send","data","timestamp","port","_resolveOutput","dispose","removeEventListener","_onPermissionChange","nav","globalThis","navigator","requestMIDIAccess","permissions","query","status","state","addEventListener","_matches","selector","id","toLowerCase","startsWith","_selectedInputs","all","inputs","values","input","filter","outputs","output","find","wanted","has","onmidimessage","delete","_onMidiMessage","add","clear","raw","parsed","d1","d2","parseMessage","channelFilter","_publishMessage","Uint8Array","portName","timeStamp","dispatchEvent","CustomEvent","bubbles","next","_snapshotDevices","_sameDevices","collect","ports","direction","map","manufacturer","length","every","device","i","prev","_commitErrorInfo","code","phase","recoverable","deriveMidiErrorInfo","info","hasAccessorOnPrototype","proto","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","undefined","get","set","WcsMidi","HTMLElement","wcBindable","attribute","_core","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","debugStates","states","attachInternals","internals","toStates","entries","debug","hasAttribute","on","toggleAttribute","getAttribute","setAttribute","n","Number","isFinite","removeAttribute","String","core","connectedCallbackPromise","connectedCallback","element","declaration","prototype","hasOwnProperty","call","record","upgradeProperties","style","display","disconnectedCallback","attributeChangedCallback","_name","oldValue","newValue","isConnected","registry","customElements","define","registerComponents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auto.min.js","sources":["../src/config.ts","../src/core/midiCapabilities.ts","../src/midi/parseMessage.ts","../src/core/MidiCore.ts","../src/protocol/upgradeProperties.ts","../src/components/Midi.ts","../src/bootstrapMidi.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n tagNames: {\n midi: string;\n };\n}\n\nconst _config: IInternalConfig = {\n tagNames: {\n midi: \"wcs-midi\",\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\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\n/** A misspelt option would otherwise do nothing: `bootstrapMidi` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/midi] bootstrapMidi: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\n frozenConfig = null;\n}\n","/**\n * midiCapabilities.ts\n *\n * Web MIDI 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)\n * から import する。\n *\n * この node の失敗は 2 箇所からしか来ない:\n * 1. `requestMIDIAccess()` の rejection — 権限拒否・API 不在・sysex 拒否。\n * 2. `MIDIOutput.send()` の throw — 不正なメッセージ・切断済みポート。\n * `_setError` は screen-orientation と同じ discriminator 技法で、synthetic な\n * `\"unsupported\"` / `\"send\"` ヒントと caught された `Error.name` を弁別する\n * (message の文言に依存した分岐を作らない)。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した midi error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_MIDI_ERROR_CODE = {\n /** `navigator.requestMIDIAccess` 自体が不在(synthetic \"unsupported\")。 */\n CapabilityMissing: \"capability-missing\",\n /**\n * `SecurityError` / `NotAllowedError` — ユーザーが拒否した、あるいは\n * permissions policy / 非 secure context で許可されない。retry では回復しない。\n */\n NotAllowed: \"not-allowed\",\n /** その他の `requestMIDIAccess()` 失敗。fresh な request は成功しうる。 */\n AccessError: \"access-error\",\n /** `MIDIOutput.send()` の失敗(不正なメッセージ / 切断済みポート)。 */\n SendFailed: \"send-failed\",\n} as const;\n\n/**\n * Web MIDI の失敗を serializable な error taxonomy に写す。\n *\n * `name` は呼び出し側が渡す discriminator:\n * - `\"unsupported\"` — API 不在 → phase=\"probe\" / capability-missing。\n * - `\"send\"` — 送信失敗 → phase=\"execute\" / send-failed。recoverable(ポートが\n * 戻れば成功しうる)。\n * - `SecurityError` / `NotAllowedError` — 拒否 → phase=\"start\" / not-allowed。\n * - それ以外(`AbortError`、生の throw、`.name` 欠如等) → phase=\"start\" /\n * access-error。\n */\nexport function deriveMidiErrorInfo(name: string | undefined, message: string): WcsIoErrorInfo {\n if (name === \"unsupported\") {\n return { code: WCS_MIDI_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n if (name === \"send\") {\n return { code: WCS_MIDI_ERROR_CODE.SendFailed, phase: \"execute\", recoverable: true, message };\n }\n if (name === \"SecurityError\" || name === \"NotAllowedError\") {\n return { code: WCS_MIDI_ERROR_CODE.NotAllowed, phase: \"start\", recoverable: false, message };\n }\n return { code: WCS_MIDI_ERROR_CODE.AccessError, phase: \"start\", recoverable: true, message };\n}\n","import { IMidiParsed, MidiMessageType } from \"../types.js\";\n\n// Channel voice message commands (high nibble of the status byte).\nconst NOTE_OFF = 0x80;\nconst NOTE_ON = 0x90;\nconst POLY_AFTERTOUCH = 0xa0;\nconst CONTROL_CHANGE = 0xb0;\nconst PROGRAM_CHANGE = 0xc0;\nconst AFTERTOUCH = 0xd0;\nconst SYSTEM = 0xf0;\n\nconst SYSEX_START = 0xf0;\n\nconst EMPTY: IMidiParsed = {\n type: \"other\", channel: null, note: null, velocity: null, control: null, value: null,\n};\n\n/**\n * Decode a raw MIDI message into the fields bindings actually want.\n *\n * Two normalizations are deliberate, because every consumer would otherwise\n * repeat them:\n *\n * - **A note-on with velocity 0 is reported as `\"noteoff\"`.** Many controllers\n * send running-status note-ons and never emit 0x8n at all; treating them as\n * note-ons leaves stuck notes. The raw status byte is still available in\n * `data[0]` for callers that care.\n * - **Velocity is normalized to 0-1**, so it multiplies straight into a gain\n * without the caller knowing about the 7-bit MIDI range. Controller values\n * stay raw 0-127 (`value`), since their meaning is per-controller.\n *\n * Never throws: a truncated or nonsensical buffer decodes to `type: \"other\"`\n * with every field `null` (async-io-node-guidelines.md §3.6).\n */\nexport function parseMessage(data: Uint8Array | number[]): IMidiParsed {\n const status = data[0];\n if (typeof status !== \"number\") return EMPTY;\n\n const d1 = typeof data[1] === \"number\" ? data[1] : 0;\n const d2 = typeof data[2] === \"number\" ? data[2] : 0;\n\n // System messages (0xF0-0xFF) carry no channel nibble.\n if (status >= SYSTEM) {\n return { ...EMPTY, type: status === SYSEX_START ? \"sysex\" : \"other\" };\n }\n // Below 0x80 is a data byte, not a status byte: the buffer is malformed or\n // running-status (which the Web MIDI API already expands for us).\n if (status < NOTE_OFF) return EMPTY;\n\n const command = status & 0xf0;\n const channel = (status & 0x0f) + 1;\n\n switch (command) {\n case NOTE_OFF:\n return { type: \"noteoff\", channel, note: d1, velocity: d2 / 127, control: null, value: null };\n case NOTE_ON:\n // velocity 0 == note off (see doc comment).\n return d2 > 0\n ? { type: \"noteon\", channel, note: d1, velocity: d2 / 127, control: null, value: null }\n : { type: \"noteoff\", channel, note: d1, velocity: 0, control: null, value: null };\n case POLY_AFTERTOUCH:\n return { type: \"polyaftertouch\", channel, note: d1, velocity: null, control: null, value: d2 };\n case CONTROL_CHANGE:\n return { type: \"controlchange\", channel, note: null, velocity: null, control: d1, value: d2 };\n case PROGRAM_CHANGE:\n return { type: \"programchange\", channel, note: null, velocity: null, control: null, value: d1 };\n case AFTERTOUCH:\n return { type: \"aftertouch\", channel, note: null, velocity: null, control: null, value: d1 };\n default:\n // 0xE0 pitch bend — the only high nibble left between 0x80 and 0xEF once\n // the six cases above are taken. 14-bit little-endian, centered at 8192,\n // normalized to -1..1.\n return {\n type: \"pitchbend\", channel, note: null, velocity: null, control: null,\n value: (((d2 << 7) | d1) - 8192) / 8192,\n };\n }\n}\n\n/** Message kinds a caller may want to filter on, exported for tooling. */\nexport const MIDI_MESSAGE_TYPES: readonly MidiMessageType[] = [\n \"noteon\", \"noteoff\", \"polyaftertouch\", \"controlchange\",\n \"programchange\", \"aftertouch\", \"pitchbend\", \"sysex\", \"other\",\n];\n","import {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState,\n} from \"../types.js\";\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveMidiErrorInfo } from \"./midiCapabilities.js\";\nimport { parseMessage } from \"../midi/parseMessage.js\";\n\nconst UNSUPPORTED = \"unsupported\";\n\n// Minimal structural types for the Web MIDI API. The DOM lib does not ship them\n// in every TypeScript configuration, and structural types keep the Core testable\n// against a fake without casting through `any` at each use site.\ninterface MidiPortLike extends EventTarget {\n id: string;\n name?: string | null;\n manufacturer?: string | null;\n state: string;\n type?: string;\n}\ninterface MidiInputLike extends MidiPortLike {\n onmidimessage: ((event: any) => void) | null;\n}\ninterface MidiOutputLike extends MidiPortLike {\n send(data: number[] | Uint8Array, timestamp?: number): void;\n}\ninterface MidiAccessLike {\n inputs: Map<string, MidiInputLike>;\n outputs: Map<string, MidiOutputLike>;\n onstatechange: ((event: any) => void) | null;\n sysexEnabled?: boolean;\n}\n\nconst detailOf = (event: Event): any => (event as CustomEvent).detail;\nconst messageField = <K extends keyof IMidiMessage>(key: K) =>\n (event: Event): IMidiMessage[K] | null => detailOf(event)?.[key] ?? null;\n\n/**\n * Headless Web MIDI primitive: a framework-agnostic wrapper around\n * `navigator.requestMIDIAccess()` exposed through the wc-bindable protocol.\n *\n * Direction is genuinely two-way, unlike `@wcstack/permission` (monitor only):\n * incoming messages flow element → state as `event`-semantics occurrences, and\n * `send()` is a command going the other way. Both live on one node because a\n * page holds exactly one `MIDIAccess` — splitting input and output into two tags\n * would only force them to coordinate over the same shared handle.\n *\n * Nothing starts on construction. `requestMIDIAccess()` can raise a permission\n * prompt, so it is deliberately command-driven (`request()`), matching the\n * `idle` / Generic Sensor family. `observe({ auto: true })` opts back into\n * requesting immediately.\n *\n * The `MIDIAccess` handle itself is never published: the Core owns it and drops\n * it in `close()` / `dispose()`, as `worker` / `websocket` / `broadcast` do with\n * theirs. Only values cross the protocol boundary.\n */\nexport class MidiCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n // One occurrence event, decomposed into derived getters\n // (async-io-node-guidelines.md §4.2). Never same-value guarded: two\n // identical note-ons are two distinct presses.\n { name: \"message\", event: \"wcs-midi:message\", semantics: \"event\" },\n { name: \"type\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"type\") },\n { name: \"channel\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"channel\") },\n { name: \"note\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"note\") },\n { name: \"velocity\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"velocity\") },\n { name: \"control\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"control\") },\n { name: \"value\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"value\") },\n { name: \"devices\", event: \"wcs-midi:devices\", semantics: \"state\" },\n { name: \"connected\", event: \"wcs-midi:statechange\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-midi:permission\", semantics: \"state\" },\n { name: \"granted\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"granted\" },\n { name: \"denied\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"denied\" },\n { name: \"unsupported\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === UNSUPPORTED },\n { name: \"error\", event: \"wcs-midi:error\", semantics: \"state\" },\n { name: \"errorInfo\", event: \"wcs-midi:error-info-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"request\", async: true },\n { name: \"close\" },\n { name: \"send\" },\n ],\n };\n\n private _target: EventTarget;\n private _options: IMidiOptions = {};\n\n private _access: MidiAccessLike | null = null;\n private _hookedInputs = new Set<MidiInputLike>();\n\n private _message: IMidiMessage | null = null;\n private _devices: IMidiDevice[] = [];\n private _connected = false;\n private _permission: MidiPermissionState = \"prompt\";\n private _error: string | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n\n private _permissionStatus: PermissionStatus | null = null;\n\n // Monotonic id bumped by every request(), close() and dispose(). An in-flight\n // requestMIDIAccess() captures it and bails on resolve when superseded, so a\n // rapid disconnect→reconnect (or a close() mid-flight) never hooks listeners\n // onto a torn-down instance.\n private _gen = 0;\n\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(options?: IMidiOptions | null, target?: EventTarget) {\n super();\n this._target = target ?? this;\n if (options) this._options = { ...options };\n }\n\n // --- Observable getters ---\n\n get message(): IMidiMessage | null { return this._message; }\n get type(): MidiMessageType | null { return this._message?.type ?? null; }\n get channel(): number | null { return this._message?.channel ?? null; }\n get note(): number | null { return this._message?.note ?? null; }\n get velocity(): number | null { return this._message?.velocity ?? null; }\n get control(): number | null { return this._message?.control ?? null; }\n get value(): number | null { return this._message?.value ?? null; }\n\n get devices(): IMidiDevice[] { return this._devices; }\n get connected(): boolean { return this._connected; }\n get permission(): MidiPermissionState { return this._permission; }\n get granted(): boolean { return this._permission === \"granted\"; }\n get denied(): boolean { return this._permission === \"denied\"; }\n get unsupported(): boolean { return this._permission === UNSUPPORTED; }\n get error(): string | null { return this._error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._errorInfo; }\n\n /** Resolves once the current (or initial) access attempt settles. */\n get ready(): Promise<void> { return this._ready; }\n\n // --- Public API ---\n\n /**\n * Store the options and, when `auto` is set, request access. Idempotent:\n * calling it again with new options re-applies port selection to the live\n * access without re-requesting.\n */\n observe(options: IMidiOptions): Promise<void> {\n const wasIdle = this._access === null;\n this.setOptions(options);\n if (options.auto && wasIdle) {\n this._ready = this.request();\n }\n return this._ready;\n }\n\n /**\n * Re-apply port selection / channel filtering. Cheap and safe at any time —\n * with no access held it only records the options for a later `request()`.\n */\n setOptions(options: IMidiOptions): void {\n this._options = { ...this._options, ...options };\n if (this._access) this._hookInputs(this._access);\n }\n\n /**\n * Acquire MIDI access. Never rejects: a refusal or a missing API surfaces as\n * `permission` / `error` state (async-io-node-guidelines.md §3.6).\n */\n request(): Promise<void> {\n const requestAccess = this._resolveApi();\n if (!requestAccess) {\n this._setPermission(UNSUPPORTED);\n this._setError(UNSUPPORTED, UNSUPPORTED);\n this._ready = Promise.resolve();\n return this._ready;\n }\n const gen = ++this._gen;\n this._probePermission();\n this._ready = requestAccess({ sysex: this._options.sysex === true }).then(\n (access: MidiAccessLike) => {\n if (gen !== this._gen) return;\n this._access = access;\n access.onstatechange = this._onStateChange;\n this._setError(null);\n this._setPermission(\"granted\");\n this._hookInputs(access);\n this._publishDevices(access);\n this._setConnected(true);\n },\n (error: any) => {\n if (gen !== this._gen) return;\n this._setPermission(\"denied\");\n this._setError(this._messageOf(error), error?.name);\n },\n );\n return this._ready;\n }\n\n /**\n * Release the access handle and detach every listener, keeping the observed\n * permission state. A later `request()` re-acquires.\n */\n close(): void {\n this._gen++;\n this._unhookInputs();\n if (this._access) {\n this._access.onstatechange = null;\n this._access = null;\n }\n this._setConnected(false);\n }\n\n /**\n * Send a raw MIDI message to the selected output port (or the first available\n * one). No-op when no output is reachable; a failing `send()` surfaces on\n * `error` rather than throwing.\n *\n * Positional arguments pass through verbatim from command-token\n * (docs/spec-proposal-command-token-arguments.md).\n */\n send(data: number[] | Uint8Array, timestamp?: number): void {\n const port = this._resolveOutput();\n if (!port) return;\n try {\n port.send(data, timestamp);\n } catch (error: any) {\n this._setError(this._messageOf(error), \"send\");\n }\n }\n\n /**\n * Detach everything. Headless callers own this lifecycle themselves: without\n * it the live `onmidimessage` handlers keep this instance reachable for as\n * long as the ports are alive.\n */\n dispose(): void {\n this.close();\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal: API resolution ---\n\n // Resolved at call time, never cached: keeps the unsupported branch honest and\n // lets tests swap the global (async-io-node-guidelines.md §3.7). Read off\n // globalThis rather than the bare identifier so an SSR/worker context with no\n // navigator at all takes the same \"unsupported\" path as Safari.\n private _resolveApi(): ((options: { sysex: boolean }) => Promise<MidiAccessLike>) | null {\n const nav = (globalThis as { navigator?: any }).navigator;\n if (!nav || typeof nav.requestMIDIAccess !== \"function\") return null;\n return (options) => nav.requestMIDIAccess(options);\n }\n\n private _messageOf(error: any): string {\n return typeof error?.message === \"string\" && error.message !== \"\" ? error.message : \"MIDI error\";\n }\n\n // --- Internal: permission monitoring ---\n\n // Optional extra: browsers that answer query({name:\"midi\"}) let a grant flipped\n // in site settings flow into the declarative state without a re-request. Where\n // the descriptor is rejected we simply keep inferring from request() outcomes.\n private _probePermission(): void {\n if (this._permissionStatus) return;\n // Only ever reached after _resolveApi() found navigator.requestMIDIAccess,\n // so navigator itself is known to exist here.\n const permissions = (globalThis as { navigator?: any }).navigator.permissions;\n if (!permissions || typeof permissions.query !== \"function\") return;\n const gen = this._gen;\n permissions.query({ name: \"midi\", sysex: this._options.sysex === true }).then(\n (status: PermissionStatus) => {\n if (gen !== this._gen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as MidiPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => { /* descriptor not understood — request() outcomes remain the source */ },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n this._setPermission((event.target as PermissionStatus).state as MidiPermissionState);\n };\n\n // --- Internal: ports ---\n\n private _matches(port: MidiPortLike, selector: string): boolean {\n if (port.id === selector) return true;\n const name = port.name ?? \"\";\n return name.toLowerCase().startsWith(selector.toLowerCase());\n }\n\n // Takes the access explicitly rather than reading the field: every call site\n // already holds a non-null handle, and a defensive re-check here would be a\n // branch no test could ever reach.\n private _selectedInputs(access: MidiAccessLike): MidiInputLike[] {\n const all = [...access.inputs.values()];\n const selector = this._options.input;\n // No selector means \"whatever is plugged in\" — the expectation for MIDI is\n // that a controller just works, not that the page names it first.\n if (selector === undefined || selector === null || selector === \"\") return all;\n return all.filter((port) => this._matches(port, selector));\n }\n\n private _resolveOutput(): MidiOutputLike | null {\n if (!this._access) return null;\n const all = [...this._access.outputs.values()];\n const selector = this._options.output;\n if (selector === undefined || selector === null || selector === \"\") return all[0] ?? null;\n return all.find((port) => this._matches(port, selector)) ?? null;\n }\n\n private _hookInputs(access: MidiAccessLike): void {\n const wanted = new Set(this._selectedInputs(access));\n for (const port of this._hookedInputs) {\n if (!wanted.has(port)) {\n port.onmidimessage = null;\n this._hookedInputs.delete(port);\n }\n }\n for (const port of wanted) {\n if (this._hookedInputs.has(port)) continue;\n port.onmidimessage = this._onMidiMessage;\n this._hookedInputs.add(port);\n }\n }\n\n private _unhookInputs(): void {\n for (const port of this._hookedInputs) port.onmidimessage = null;\n this._hookedInputs.clear();\n }\n\n private _onStateChange = (): void => {\n // Port list changed: re-apply selection (a newly plugged input must start\n // delivering) and republish. `onstatechange` is only installed while an\n // access is held and cleared in close(), so the handle is non-null here.\n const access = this._access!;\n this._hookInputs(access);\n this._publishDevices(access);\n };\n\n private _onMidiMessage = (event: { data?: Uint8Array | null; target?: any; timeStamp?: number }): void => {\n const raw = event.data;\n if (!raw) return;\n const parsed = parseMessage(raw);\n const channelFilter = this._options.channel;\n if (channelFilter != null && parsed.channel !== null && parsed.channel !== channelFilter) return;\n const port = event.target as MidiPortLike | undefined;\n this._publishMessage({\n ...parsed,\n // Fresh copy every time: the platform buffer must never be handed out\n // (producer snapshot contract).\n data: new Uint8Array(raw),\n port: port?.id ?? \"\",\n portName: port?.name ?? \"\",\n timestamp: event.timeStamp ?? 0,\n });\n };\n\n // --- Internal: state setters ---\n\n // Occurrence, not state: identical payloads are distinct presses, so there is\n // deliberately no same-value guard here.\n private _publishMessage(message: IMidiMessage): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:message\", { detail: message, bubbles: true }));\n }\n\n private _publishDevices(access: MidiAccessLike): void {\n const next = this._snapshotDevices(access);\n if (this._sameDevices(next)) return;\n // Fresh array assigned before notifying (producer snapshot contract).\n this._devices = next;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:devices\", { detail: next, bubbles: true }));\n }\n\n private _snapshotDevices(access: MidiAccessLike): IMidiDevice[] {\n const collect = (ports: Map<string, MidiPortLike>, direction: \"input\" | \"output\"): IMidiDevice[] =>\n [...ports.values()].map((port) => ({\n id: port.id,\n name: port.name ?? \"\",\n manufacturer: port.manufacturer ?? \"\",\n direction,\n state: port.state === \"connected\" ? \"connected\" : \"disconnected\",\n }));\n return [\n ...collect(access.inputs as Map<string, MidiPortLike>, \"input\"),\n ...collect(access.outputs as Map<string, MidiPortLike>, \"output\"),\n ];\n }\n\n // Content comparison, not reference: statechange fires separately for the\n // input and the output side of one physical device, so an unfiltered\n // republish would double-notify on every plug.\n private _sameDevices(next: IMidiDevice[]): boolean {\n if (next.length !== this._devices.length) return false;\n return next.every((device, i) => {\n const prev = this._devices[i];\n return prev.id === device.id && prev.state === device.state\n && prev.direction === device.direction && prev.name === device.name;\n });\n }\n\n private _setConnected(connected: boolean): void {\n if (this._connected === connected) return;\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:statechange\", { detail: connected, bubbles: true }));\n }\n\n private _setPermission(permission: MidiPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:permission\", { detail: permission, bubbles: true }));\n }\n\n private _setError(error: string | null, name?: string): void {\n if (this._error !== error) {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error\", { detail: error, bubbles: true }));\n }\n this._commitErrorInfo(error === null ? null : deriveMidiErrorInfo(name, error));\n }\n\n // errorInfo transitions exactly when error does (no independent same-value\n // guard: a fresh object is built per transition).\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n if (this._errorInfo === null && info === null) return;\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error-info-changed\", { detail: info, bubbles: true }));\n }\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 {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState, WcsIoErrorInfo,\n} from \"../types.js\";\nimport { MidiCore } from \"../core/MidiCore.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n/**\n * `<wcs-midi>` — declarative Web MIDI input/output.\n *\n * Nothing happens on connect: `requestMIDIAccess()` can raise a permission\n * prompt, so access is command-driven (`command.request`). Add the `auto`\n * attribute to opt into requesting as soon as the element connects.\n */\nexport class WcsMidi extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static observedAttributes = [\"input\", \"output\", \"channel\"];\n\n static wcBindable: IWcBindable = {\n ...MidiCore.wcBindable,\n inputs: [\n { name: \"input\", attribute: \"input\" },\n { name: \"output\", attribute: \"output\" },\n { name: \"channel\", attribute: \"channel\" },\n { name: \"sysex\", attribute: \"sysex\" },\n { name: \"auto\", attribute: \"auto\" },\n ],\n };\n\n private _core: MidiCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new MidiCore(null, this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-midi:permission\": (d) => ({\n granted: d === \"granted\",\n denied: d === \"denied\",\n unsupported: d === \"unsupported\",\n }),\n \"wcs-midi:statechange\": (d) => ({ connected: d === true }),\n \"wcs-midi:error\": (d) => ({ error: d !== null }),\n });\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 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 non-dashed\n // state names. Either case silently disables reflection.\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 input(): string { return this.getAttribute(\"input\") ?? \"\"; }\n set input(value: string) { this.setAttribute(\"input\", value); }\n\n get output(): string { return this.getAttribute(\"output\") ?? \"\"; }\n set output(value: string) { this.setAttribute(\"output\", value); }\n\n get channel(): number | null {\n const raw = this.getAttribute(\"channel\");\n if (raw === null) return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n }\n\n set channel(value: number | null) {\n if (value === null) {\n this.removeAttribute(\"channel\");\n } else {\n this.setAttribute(\"channel\", String(value));\n }\n }\n\n get sysex(): boolean { return this.hasAttribute(\"sysex\"); }\n set sysex(value: boolean) { this.toggleAttribute(\"sysex\", value); }\n\n get auto(): boolean { return this.hasAttribute(\"auto\"); }\n set auto(value: boolean) { this.toggleAttribute(\"auto\", value); }\n\n // --- Core delegated getters ---\n\n get message(): IMidiMessage | null { return this._core.message; }\n get type(): MidiMessageType | null { return this._core.type; }\n get note(): number | null { return this._core.note; }\n get velocity(): number | null { return this._core.velocity; }\n get control(): number | null { return this._core.control; }\n get value(): number | null { return this._core.value; }\n get devices(): IMidiDevice[] { return this._core.devices; }\n get connected(): boolean { return this._core.connected; }\n get permission(): MidiPermissionState { return this._core.permission; }\n get granted(): boolean { return this._core.granted; }\n get denied(): boolean { return this._core.denied; }\n get unsupported(): boolean { return this._core.unsupported; }\n get error(): string | null { return this._core.error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._core.errorInfo; }\n\n /** Headless escape hatch: the Core backing this element. */\n get core(): MidiCore { return this._core; }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Commands ---\n\n request(): Promise<void> { return this._core.request(); }\n close(): void { this._core.close(); }\n send(data: number[] | Uint8Array, timestamp?: number): void { this._core.send(data, timestamp); }\n\n // --- Internal ---\n\n private _options(): IMidiOptions {\n return {\n input: this.input,\n output: this.output,\n channel: this.channel,\n sysex: this.sysex,\n auto: this.auto,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n this._connectedCallbackPromise = this._core.observe(this._options());\n }\n\n disconnectedCallback(): void {\n this._core.dispose();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n // Port selection and channel filtering are live: they re-hook the existing\n // access rather than re-requesting it (no second permission prompt).\n if (this.isConnected) this._core.setOptions(this._options());\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapMidi(userConfig?: IWritableConfig, registry?: CustomElementRegistry): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents(registry);\n}\n","import { WcsMidi } from \"./components/Midi.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.midi)) {\n registry.define(config.tagNames.midi, WcsMidi);\n }\n}\n"],"names":["config","tagNames","midi","WCS_MIDI_ERROR_CODE","EMPTY","type","channel","note","velocity","control","value","UNSUPPORTED","detailOf","event","detail","messageField","key","MidiCore","EventTarget","static","protocol","version","properties","name","semantics","getter","e","commands","async","_target","_options","_access","_hookedInputs","Set","_message","_devices","_connected","_permission","_error","_errorInfo","_permissionStatus","_gen","_ready","Promise","resolve","constructor","options","target","super","this","message","devices","connected","permission","granted","denied","unsupported","error","errorInfo","ready","observe","wasIdle","setOptions","auto","request","_hookInputs","requestAccess","_resolveApi","_setPermission","_setError","gen","_probePermission","sysex","then","access","onstatechange","_onStateChange","_publishDevices","_setConnected","_messageOf","close","_unhookInputs","send","data","timestamp","port","_resolveOutput","dispose","removeEventListener","_onPermissionChange","nav","globalThis","navigator","requestMIDIAccess","permissions","query","status","state","addEventListener","_matches","selector","id","toLowerCase","startsWith","_selectedInputs","all","inputs","values","input","filter","outputs","output","find","wanted","has","onmidimessage","delete","_onMidiMessage","add","clear","raw","parsed","d1","d2","parseMessage","channelFilter","_publishMessage","Uint8Array","portName","timeStamp","dispatchEvent","CustomEvent","bubbles","next","_snapshotDevices","_sameDevices","collect","ports","direction","map","manufacturer","length","every","device","i","prev","_commitErrorInfo","code","phase","recoverable","deriveMidiErrorInfo","info","hasAccessorOnPrototype","proto","Object","getPrototypeOf","descriptor","getOwnPropertyDescriptor","undefined","get","set","WcsMidi","HTMLElement","wcBindable","attribute","_core","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","debugStates","states","attachInternals","internals","toStates","entries","debug","hasAttribute","on","toggleAttribute","getAttribute","setAttribute","n","Number","isFinite","removeAttribute","String","core","connectedCallbackPromise","connectedCallback","element","declaration","prototype","hasOwnProperty","call","record","upgradeProperties","style","display","disconnectedCallback","attributeChangedCallback","_name","oldValue","newValue","isConnected","registry","customElements","define","registerComponents"],"mappings":"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"}
|
package/dist/index.esm.js
CHANGED
|
@@ -29,43 +29,32 @@ function getConfig() {
|
|
|
29
29
|
}
|
|
30
30
|
return frozenConfig;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
/** A misspelt option would otherwise do nothing: `bootstrapMidi` refuses it. */
|
|
33
|
+
function invalid(key) {
|
|
34
|
+
throw new Error(`[@wcstack/midi] bootstrapMidi: "${key}" is not one of its options, or not of the option's type.`);
|
|
35
|
+
}
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* undefined value is left out, as in 4.0. It only warns: setConfig then goes on exactly as in 3.x.
|
|
41
|
-
* Bootstrap-time only, never on a hot path.
|
|
37
|
+
* Applies the options given; an undefined value is left out. An option this package does not
|
|
38
|
+
* have, a value of another type than its default (null, or an array for an object, included) or
|
|
39
|
+
* a tag name it does not define throws, and then nothing is applied.
|
|
42
40
|
*/
|
|
43
|
-
function
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (!Object.
|
|
51
|
-
|
|
52
|
-
typeof value !== typeof current ||
|
|
53
|
-
Array.isArray(value) !== Array.isArray(current)) {
|
|
54
|
-
if (!warned.has(name)) {
|
|
55
|
-
warned.add(name);
|
|
56
|
-
console.warn(`[@wcstack/midi] bootstrapMidi: "${name}" is not one of its options, or not of the option's type. 3.x ignores it or applies it unchecked; 4.0 throws on it.`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
else if (name === "tagNames") {
|
|
60
|
-
warnInvalid(value, current, "tagNames.");
|
|
41
|
+
function setConfig(partialConfig) {
|
|
42
|
+
const options = _config;
|
|
43
|
+
const tags = _config.tagNames;
|
|
44
|
+
const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);
|
|
45
|
+
const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);
|
|
46
|
+
for (const [key, value] of given) {
|
|
47
|
+
const current = options[key];
|
|
48
|
+
if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {
|
|
49
|
+
invalid(key);
|
|
61
50
|
}
|
|
62
51
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (partialConfig.tagNames) {
|
|
67
|
-
Object.assign(_config.tagNames, partialConfig.tagNames);
|
|
52
|
+
for (const [name, tag] of givenTags) {
|
|
53
|
+
if (!Object.hasOwn(tags, name) || typeof tag !== "string")
|
|
54
|
+
invalid(`tagNames.${name}`);
|
|
68
55
|
}
|
|
56
|
+
for (const [name, tag] of givenTags)
|
|
57
|
+
tags[name] = tag;
|
|
69
58
|
frozenConfig = null;
|
|
70
59
|
}
|
|
71
60
|
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/midiCapabilities.ts","../src/midi/parseMessage.ts","../src/core/MidiCore.ts","../src/protocol/upgradeProperties.ts","../src/components/Midi.ts","../src/registerComponents.ts","../src/bootstrapMidi.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n tagNames: {\n midi: string;\n };\n}\n\nconst _config: IInternalConfig = {\n tagNames: {\n midi: \"wcs-midi\",\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\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\n// The defaults as shipped, for warnInvalid: a value 3.x lets through unchecked must not change\n// what a later call is compared against.\nconst defaults: Record<string, unknown> = { ..._config, tagNames: { ..._config.tagNames } };\nconst warned = new Set<string>();\n\n/**\n * 3.5 forward-compat check. Warns, once per key per page, about an option that 4.0's bootstrapMidi\n * throws on: one this package does not have, a value of another type than its default (null, or an\n * array for an object, included), or a tag name it does not define or that is not a string. An\n * undefined value is left out, as in 4.0. It only warns: setConfig then goes on exactly as in 3.x.\n * Bootstrap-time only, never on a hot path.\n */\nfunction warnInvalid(given: Record<string, unknown>, known: Record<string, unknown>, path = \"\"): void {\n for (const [key, value] of Object.entries(given)) {\n const name = path + key;\n const current = known[key];\n if (value === undefined) {\n continue;\n }\n if (\n !Object.prototype.hasOwnProperty.call(known, key) ||\n value === null ||\n typeof value !== typeof current ||\n Array.isArray(value) !== Array.isArray(current)\n ) {\n if (!warned.has(name)) {\n warned.add(name);\n console.warn(`[@wcstack/midi] bootstrapMidi: \"${name}\" is not one of its options, or not of the option's type. 3.x ignores it or applies it unchecked; 4.0 throws on it.`);\n }\n } else if (name === \"tagNames\") {\n warnInvalid(value as Record<string, unknown>, current as Record<string, unknown>, \"tagNames.\");\n }\n }\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n warnInvalid(partialConfig as Record<string, unknown>, defaults);\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * midiCapabilities.ts\n *\n * Web MIDI 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)\n * から import する。\n *\n * この node の失敗は 2 箇所からしか来ない:\n * 1. `requestMIDIAccess()` の rejection — 権限拒否・API 不在・sysex 拒否。\n * 2. `MIDIOutput.send()` の throw — 不正なメッセージ・切断済みポート。\n * `_setError` は screen-orientation と同じ discriminator 技法で、synthetic な\n * `\"unsupported\"` / `\"send\"` ヒントと caught された `Error.name` を弁別する\n * (message の文言に依存した分岐を作らない)。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した midi error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_MIDI_ERROR_CODE = {\n /** `navigator.requestMIDIAccess` 自体が不在(synthetic \"unsupported\")。 */\n CapabilityMissing: \"capability-missing\",\n /**\n * `SecurityError` / `NotAllowedError` — ユーザーが拒否した、あるいは\n * permissions policy / 非 secure context で許可されない。retry では回復しない。\n */\n NotAllowed: \"not-allowed\",\n /** その他の `requestMIDIAccess()` 失敗。fresh な request は成功しうる。 */\n AccessError: \"access-error\",\n /** `MIDIOutput.send()` の失敗(不正なメッセージ / 切断済みポート)。 */\n SendFailed: \"send-failed\",\n} as const;\n\n/**\n * Web MIDI の失敗を serializable な error taxonomy に写す。\n *\n * `name` は呼び出し側が渡す discriminator:\n * - `\"unsupported\"` — API 不在 → phase=\"probe\" / capability-missing。\n * - `\"send\"` — 送信失敗 → phase=\"execute\" / send-failed。recoverable(ポートが\n * 戻れば成功しうる)。\n * - `SecurityError` / `NotAllowedError` — 拒否 → phase=\"start\" / not-allowed。\n * - それ以外(`AbortError`、生の throw、`.name` 欠如等) → phase=\"start\" /\n * access-error。\n */\nexport function deriveMidiErrorInfo(name: string | undefined, message: string): WcsIoErrorInfo {\n if (name === \"unsupported\") {\n return { code: WCS_MIDI_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n if (name === \"send\") {\n return { code: WCS_MIDI_ERROR_CODE.SendFailed, phase: \"execute\", recoverable: true, message };\n }\n if (name === \"SecurityError\" || name === \"NotAllowedError\") {\n return { code: WCS_MIDI_ERROR_CODE.NotAllowed, phase: \"start\", recoverable: false, message };\n }\n return { code: WCS_MIDI_ERROR_CODE.AccessError, phase: \"start\", recoverable: true, message };\n}\n","import { IMidiParsed, MidiMessageType } from \"../types.js\";\n\n// Channel voice message commands (high nibble of the status byte).\nconst NOTE_OFF = 0x80;\nconst NOTE_ON = 0x90;\nconst POLY_AFTERTOUCH = 0xa0;\nconst CONTROL_CHANGE = 0xb0;\nconst PROGRAM_CHANGE = 0xc0;\nconst AFTERTOUCH = 0xd0;\nconst SYSTEM = 0xf0;\n\nconst SYSEX_START = 0xf0;\n\nconst EMPTY: IMidiParsed = {\n type: \"other\", channel: null, note: null, velocity: null, control: null, value: null,\n};\n\n/**\n * Decode a raw MIDI message into the fields bindings actually want.\n *\n * Two normalizations are deliberate, because every consumer would otherwise\n * repeat them:\n *\n * - **A note-on with velocity 0 is reported as `\"noteoff\"`.** Many controllers\n * send running-status note-ons and never emit 0x8n at all; treating them as\n * note-ons leaves stuck notes. The raw status byte is still available in\n * `data[0]` for callers that care.\n * - **Velocity is normalized to 0-1**, so it multiplies straight into a gain\n * without the caller knowing about the 7-bit MIDI range. Controller values\n * stay raw 0-127 (`value`), since their meaning is per-controller.\n *\n * Never throws: a truncated or nonsensical buffer decodes to `type: \"other\"`\n * with every field `null` (async-io-node-guidelines.md §3.6).\n */\nexport function parseMessage(data: Uint8Array | number[]): IMidiParsed {\n const status = data[0];\n if (typeof status !== \"number\") return EMPTY;\n\n const d1 = typeof data[1] === \"number\" ? data[1] : 0;\n const d2 = typeof data[2] === \"number\" ? data[2] : 0;\n\n // System messages (0xF0-0xFF) carry no channel nibble.\n if (status >= SYSTEM) {\n return { ...EMPTY, type: status === SYSEX_START ? \"sysex\" : \"other\" };\n }\n // Below 0x80 is a data byte, not a status byte: the buffer is malformed or\n // running-status (which the Web MIDI API already expands for us).\n if (status < NOTE_OFF) return EMPTY;\n\n const command = status & 0xf0;\n const channel = (status & 0x0f) + 1;\n\n switch (command) {\n case NOTE_OFF:\n return { type: \"noteoff\", channel, note: d1, velocity: d2 / 127, control: null, value: null };\n case NOTE_ON:\n // velocity 0 == note off (see doc comment).\n return d2 > 0\n ? { type: \"noteon\", channel, note: d1, velocity: d2 / 127, control: null, value: null }\n : { type: \"noteoff\", channel, note: d1, velocity: 0, control: null, value: null };\n case POLY_AFTERTOUCH:\n return { type: \"polyaftertouch\", channel, note: d1, velocity: null, control: null, value: d2 };\n case CONTROL_CHANGE:\n return { type: \"controlchange\", channel, note: null, velocity: null, control: d1, value: d2 };\n case PROGRAM_CHANGE:\n return { type: \"programchange\", channel, note: null, velocity: null, control: null, value: d1 };\n case AFTERTOUCH:\n return { type: \"aftertouch\", channel, note: null, velocity: null, control: null, value: d1 };\n default:\n // 0xE0 pitch bend — the only high nibble left between 0x80 and 0xEF once\n // the six cases above are taken. 14-bit little-endian, centered at 8192,\n // normalized to -1..1.\n return {\n type: \"pitchbend\", channel, note: null, velocity: null, control: null,\n value: (((d2 << 7) | d1) - 8192) / 8192,\n };\n }\n}\n\n/** Message kinds a caller may want to filter on, exported for tooling. */\nexport const MIDI_MESSAGE_TYPES: readonly MidiMessageType[] = [\n \"noteon\", \"noteoff\", \"polyaftertouch\", \"controlchange\",\n \"programchange\", \"aftertouch\", \"pitchbend\", \"sysex\", \"other\",\n];\n","import {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState,\n} from \"../types.js\";\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveMidiErrorInfo } from \"./midiCapabilities.js\";\nimport { parseMessage } from \"../midi/parseMessage.js\";\n\nconst UNSUPPORTED = \"unsupported\";\n\n// Minimal structural types for the Web MIDI API. The DOM lib does not ship them\n// in every TypeScript configuration, and structural types keep the Core testable\n// against a fake without casting through `any` at each use site.\ninterface MidiPortLike extends EventTarget {\n id: string;\n name?: string | null;\n manufacturer?: string | null;\n state: string;\n type?: string;\n}\ninterface MidiInputLike extends MidiPortLike {\n onmidimessage: ((event: any) => void) | null;\n}\ninterface MidiOutputLike extends MidiPortLike {\n send(data: number[] | Uint8Array, timestamp?: number): void;\n}\ninterface MidiAccessLike {\n inputs: Map<string, MidiInputLike>;\n outputs: Map<string, MidiOutputLike>;\n onstatechange: ((event: any) => void) | null;\n sysexEnabled?: boolean;\n}\n\nconst detailOf = (event: Event): any => (event as CustomEvent).detail;\nconst messageField = <K extends keyof IMidiMessage>(key: K) =>\n (event: Event): IMidiMessage[K] | null => detailOf(event)?.[key] ?? null;\n\n/**\n * Headless Web MIDI primitive: a framework-agnostic wrapper around\n * `navigator.requestMIDIAccess()` exposed through the wc-bindable protocol.\n *\n * Direction is genuinely two-way, unlike `@wcstack/permission` (monitor only):\n * incoming messages flow element → state as `event`-semantics occurrences, and\n * `send()` is a command going the other way. Both live on one node because a\n * page holds exactly one `MIDIAccess` — splitting input and output into two tags\n * would only force them to coordinate over the same shared handle.\n *\n * Nothing starts on construction. `requestMIDIAccess()` can raise a permission\n * prompt, so it is deliberately command-driven (`request()`), matching the\n * `idle` / Generic Sensor family. `observe({ auto: true })` opts back into\n * requesting immediately.\n *\n * The `MIDIAccess` handle itself is never published: the Core owns it and drops\n * it in `close()` / `dispose()`, as `worker` / `websocket` / `broadcast` do with\n * theirs. Only values cross the protocol boundary.\n */\nexport class MidiCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n // One occurrence event, decomposed into derived getters\n // (async-io-node-guidelines.md §4.2). Never same-value guarded: two\n // identical note-ons are two distinct presses.\n { name: \"message\", event: \"wcs-midi:message\", semantics: \"event\" },\n { name: \"type\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"type\") },\n { name: \"channel\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"channel\") },\n { name: \"note\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"note\") },\n { name: \"velocity\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"velocity\") },\n { name: \"control\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"control\") },\n { name: \"value\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"value\") },\n { name: \"devices\", event: \"wcs-midi:devices\", semantics: \"state\" },\n { name: \"connected\", event: \"wcs-midi:statechange\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-midi:permission\", semantics: \"state\" },\n { name: \"granted\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"granted\" },\n { name: \"denied\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"denied\" },\n { name: \"unsupported\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === UNSUPPORTED },\n { name: \"error\", event: \"wcs-midi:error\", semantics: \"state\" },\n { name: \"errorInfo\", event: \"wcs-midi:error-info-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"request\", async: true },\n { name: \"close\" },\n { name: \"send\" },\n ],\n };\n\n private _target: EventTarget;\n private _options: IMidiOptions = {};\n\n private _access: MidiAccessLike | null = null;\n private _hookedInputs = new Set<MidiInputLike>();\n\n private _message: IMidiMessage | null = null;\n private _devices: IMidiDevice[] = [];\n private _connected = false;\n private _permission: MidiPermissionState = \"prompt\";\n private _error: string | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n\n private _permissionStatus: PermissionStatus | null = null;\n\n // Monotonic id bumped by every request(), close() and dispose(). An in-flight\n // requestMIDIAccess() captures it and bails on resolve when superseded, so a\n // rapid disconnect→reconnect (or a close() mid-flight) never hooks listeners\n // onto a torn-down instance.\n private _gen = 0;\n\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(options?: IMidiOptions | null, target?: EventTarget) {\n super();\n this._target = target ?? this;\n if (options) this._options = { ...options };\n }\n\n // --- Observable getters ---\n\n get message(): IMidiMessage | null { return this._message; }\n get type(): MidiMessageType | null { return this._message?.type ?? null; }\n get channel(): number | null { return this._message?.channel ?? null; }\n get note(): number | null { return this._message?.note ?? null; }\n get velocity(): number | null { return this._message?.velocity ?? null; }\n get control(): number | null { return this._message?.control ?? null; }\n get value(): number | null { return this._message?.value ?? null; }\n\n get devices(): IMidiDevice[] { return this._devices; }\n get connected(): boolean { return this._connected; }\n get permission(): MidiPermissionState { return this._permission; }\n get granted(): boolean { return this._permission === \"granted\"; }\n get denied(): boolean { return this._permission === \"denied\"; }\n get unsupported(): boolean { return this._permission === UNSUPPORTED; }\n get error(): string | null { return this._error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._errorInfo; }\n\n /** Resolves once the current (or initial) access attempt settles. */\n get ready(): Promise<void> { return this._ready; }\n\n // --- Public API ---\n\n /**\n * Store the options and, when `auto` is set, request access. Idempotent:\n * calling it again with new options re-applies port selection to the live\n * access without re-requesting.\n */\n observe(options: IMidiOptions): Promise<void> {\n const wasIdle = this._access === null;\n this.setOptions(options);\n if (options.auto && wasIdle) {\n this._ready = this.request();\n }\n return this._ready;\n }\n\n /**\n * Re-apply port selection / channel filtering. Cheap and safe at any time —\n * with no access held it only records the options for a later `request()`.\n */\n setOptions(options: IMidiOptions): void {\n this._options = { ...this._options, ...options };\n if (this._access) this._hookInputs(this._access);\n }\n\n /**\n * Acquire MIDI access. Never rejects: a refusal or a missing API surfaces as\n * `permission` / `error` state (async-io-node-guidelines.md §3.6).\n */\n request(): Promise<void> {\n const requestAccess = this._resolveApi();\n if (!requestAccess) {\n this._setPermission(UNSUPPORTED);\n this._setError(UNSUPPORTED, UNSUPPORTED);\n this._ready = Promise.resolve();\n return this._ready;\n }\n const gen = ++this._gen;\n this._probePermission();\n this._ready = requestAccess({ sysex: this._options.sysex === true }).then(\n (access: MidiAccessLike) => {\n if (gen !== this._gen) return;\n this._access = access;\n access.onstatechange = this._onStateChange;\n this._setError(null);\n this._setPermission(\"granted\");\n this._hookInputs(access);\n this._publishDevices(access);\n this._setConnected(true);\n },\n (error: any) => {\n if (gen !== this._gen) return;\n this._setPermission(\"denied\");\n this._setError(this._messageOf(error), error?.name);\n },\n );\n return this._ready;\n }\n\n /**\n * Release the access handle and detach every listener, keeping the observed\n * permission state. A later `request()` re-acquires.\n */\n close(): void {\n this._gen++;\n this._unhookInputs();\n if (this._access) {\n this._access.onstatechange = null;\n this._access = null;\n }\n this._setConnected(false);\n }\n\n /**\n * Send a raw MIDI message to the selected output port (or the first available\n * one). No-op when no output is reachable; a failing `send()` surfaces on\n * `error` rather than throwing.\n *\n * Positional arguments pass through verbatim from command-token\n * (docs/spec-proposal-command-token-arguments.md).\n */\n send(data: number[] | Uint8Array, timestamp?: number): void {\n const port = this._resolveOutput();\n if (!port) return;\n try {\n port.send(data, timestamp);\n } catch (error: any) {\n this._setError(this._messageOf(error), \"send\");\n }\n }\n\n /**\n * Detach everything. Headless callers own this lifecycle themselves: without\n * it the live `onmidimessage` handlers keep this instance reachable for as\n * long as the ports are alive.\n */\n dispose(): void {\n this.close();\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal: API resolution ---\n\n // Resolved at call time, never cached: keeps the unsupported branch honest and\n // lets tests swap the global (async-io-node-guidelines.md §3.7). Read off\n // globalThis rather than the bare identifier so an SSR/worker context with no\n // navigator at all takes the same \"unsupported\" path as Safari.\n private _resolveApi(): ((options: { sysex: boolean }) => Promise<MidiAccessLike>) | null {\n const nav = (globalThis as { navigator?: any }).navigator;\n if (!nav || typeof nav.requestMIDIAccess !== \"function\") return null;\n return (options) => nav.requestMIDIAccess(options);\n }\n\n private _messageOf(error: any): string {\n return typeof error?.message === \"string\" && error.message !== \"\" ? error.message : \"MIDI error\";\n }\n\n // --- Internal: permission monitoring ---\n\n // Optional extra: browsers that answer query({name:\"midi\"}) let a grant flipped\n // in site settings flow into the declarative state without a re-request. Where\n // the descriptor is rejected we simply keep inferring from request() outcomes.\n private _probePermission(): void {\n if (this._permissionStatus) return;\n // Only ever reached after _resolveApi() found navigator.requestMIDIAccess,\n // so navigator itself is known to exist here.\n const permissions = (globalThis as { navigator?: any }).navigator.permissions;\n if (!permissions || typeof permissions.query !== \"function\") return;\n const gen = this._gen;\n permissions.query({ name: \"midi\", sysex: this._options.sysex === true }).then(\n (status: PermissionStatus) => {\n if (gen !== this._gen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as MidiPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => { /* descriptor not understood — request() outcomes remain the source */ },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n this._setPermission((event.target as PermissionStatus).state as MidiPermissionState);\n };\n\n // --- Internal: ports ---\n\n private _matches(port: MidiPortLike, selector: string): boolean {\n if (port.id === selector) return true;\n const name = port.name ?? \"\";\n return name.toLowerCase().startsWith(selector.toLowerCase());\n }\n\n // Takes the access explicitly rather than reading the field: every call site\n // already holds a non-null handle, and a defensive re-check here would be a\n // branch no test could ever reach.\n private _selectedInputs(access: MidiAccessLike): MidiInputLike[] {\n const all = [...access.inputs.values()];\n const selector = this._options.input;\n // No selector means \"whatever is plugged in\" — the expectation for MIDI is\n // that a controller just works, not that the page names it first.\n if (selector === undefined || selector === null || selector === \"\") return all;\n return all.filter((port) => this._matches(port, selector));\n }\n\n private _resolveOutput(): MidiOutputLike | null {\n if (!this._access) return null;\n const all = [...this._access.outputs.values()];\n const selector = this._options.output;\n if (selector === undefined || selector === null || selector === \"\") return all[0] ?? null;\n return all.find((port) => this._matches(port, selector)) ?? null;\n }\n\n private _hookInputs(access: MidiAccessLike): void {\n const wanted = new Set(this._selectedInputs(access));\n for (const port of this._hookedInputs) {\n if (!wanted.has(port)) {\n port.onmidimessage = null;\n this._hookedInputs.delete(port);\n }\n }\n for (const port of wanted) {\n if (this._hookedInputs.has(port)) continue;\n port.onmidimessage = this._onMidiMessage;\n this._hookedInputs.add(port);\n }\n }\n\n private _unhookInputs(): void {\n for (const port of this._hookedInputs) port.onmidimessage = null;\n this._hookedInputs.clear();\n }\n\n private _onStateChange = (): void => {\n // Port list changed: re-apply selection (a newly plugged input must start\n // delivering) and republish. `onstatechange` is only installed while an\n // access is held and cleared in close(), so the handle is non-null here.\n const access = this._access!;\n this._hookInputs(access);\n this._publishDevices(access);\n };\n\n private _onMidiMessage = (event: { data?: Uint8Array | null; target?: any; timeStamp?: number }): void => {\n const raw = event.data;\n if (!raw) return;\n const parsed = parseMessage(raw);\n const channelFilter = this._options.channel;\n if (channelFilter != null && parsed.channel !== null && parsed.channel !== channelFilter) return;\n const port = event.target as MidiPortLike | undefined;\n this._publishMessage({\n ...parsed,\n // Fresh copy every time: the platform buffer must never be handed out\n // (producer snapshot contract).\n data: new Uint8Array(raw),\n port: port?.id ?? \"\",\n portName: port?.name ?? \"\",\n timestamp: event.timeStamp ?? 0,\n });\n };\n\n // --- Internal: state setters ---\n\n // Occurrence, not state: identical payloads are distinct presses, so there is\n // deliberately no same-value guard here.\n private _publishMessage(message: IMidiMessage): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:message\", { detail: message, bubbles: true }));\n }\n\n private _publishDevices(access: MidiAccessLike): void {\n const next = this._snapshotDevices(access);\n if (this._sameDevices(next)) return;\n // Fresh array assigned before notifying (producer snapshot contract).\n this._devices = next;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:devices\", { detail: next, bubbles: true }));\n }\n\n private _snapshotDevices(access: MidiAccessLike): IMidiDevice[] {\n const collect = (ports: Map<string, MidiPortLike>, direction: \"input\" | \"output\"): IMidiDevice[] =>\n [...ports.values()].map((port) => ({\n id: port.id,\n name: port.name ?? \"\",\n manufacturer: port.manufacturer ?? \"\",\n direction,\n state: port.state === \"connected\" ? \"connected\" : \"disconnected\",\n }));\n return [\n ...collect(access.inputs as Map<string, MidiPortLike>, \"input\"),\n ...collect(access.outputs as Map<string, MidiPortLike>, \"output\"),\n ];\n }\n\n // Content comparison, not reference: statechange fires separately for the\n // input and the output side of one physical device, so an unfiltered\n // republish would double-notify on every plug.\n private _sameDevices(next: IMidiDevice[]): boolean {\n if (next.length !== this._devices.length) return false;\n return next.every((device, i) => {\n const prev = this._devices[i];\n return prev.id === device.id && prev.state === device.state\n && prev.direction === device.direction && prev.name === device.name;\n });\n }\n\n private _setConnected(connected: boolean): void {\n if (this._connected === connected) return;\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:statechange\", { detail: connected, bubbles: true }));\n }\n\n private _setPermission(permission: MidiPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:permission\", { detail: permission, bubbles: true }));\n }\n\n private _setError(error: string | null, name?: string): void {\n if (this._error !== error) {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error\", { detail: error, bubbles: true }));\n }\n this._commitErrorInfo(error === null ? null : deriveMidiErrorInfo(name, error));\n }\n\n // errorInfo transitions exactly when error does (no independent same-value\n // guard: a fresh object is built per transition).\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n if (this._errorInfo === null && info === null) return;\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error-info-changed\", { detail: info, bubbles: true }));\n }\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 {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState, WcsIoErrorInfo,\n} from \"../types.js\";\nimport { MidiCore } from \"../core/MidiCore.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n/**\n * `<wcs-midi>` — declarative Web MIDI input/output.\n *\n * Nothing happens on connect: `requestMIDIAccess()` can raise a permission\n * prompt, so access is command-driven (`command.request`). Add the `auto`\n * attribute to opt into requesting as soon as the element connects.\n */\nexport class WcsMidi extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static observedAttributes = [\"input\", \"output\", \"channel\"];\n\n static wcBindable: IWcBindable = {\n ...MidiCore.wcBindable,\n inputs: [\n { name: \"input\", attribute: \"input\" },\n { name: \"output\", attribute: \"output\" },\n { name: \"channel\", attribute: \"channel\" },\n { name: \"sysex\", attribute: \"sysex\" },\n { name: \"auto\", attribute: \"auto\" },\n ],\n };\n\n private _core: MidiCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new MidiCore(null, this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-midi:permission\": (d) => ({\n granted: d === \"granted\",\n denied: d === \"denied\",\n unsupported: d === \"unsupported\",\n }),\n \"wcs-midi:statechange\": (d) => ({ connected: d === true }),\n \"wcs-midi:error\": (d) => ({ error: d !== null }),\n });\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 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 non-dashed\n // state names. Either case silently disables reflection.\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 input(): string { return this.getAttribute(\"input\") ?? \"\"; }\n set input(value: string) { this.setAttribute(\"input\", value); }\n\n get output(): string { return this.getAttribute(\"output\") ?? \"\"; }\n set output(value: string) { this.setAttribute(\"output\", value); }\n\n get channel(): number | null {\n const raw = this.getAttribute(\"channel\");\n if (raw === null) return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n }\n\n set channel(value: number | null) {\n if (value === null) {\n this.removeAttribute(\"channel\");\n } else {\n this.setAttribute(\"channel\", String(value));\n }\n }\n\n get sysex(): boolean { return this.hasAttribute(\"sysex\"); }\n set sysex(value: boolean) { this.toggleAttribute(\"sysex\", value); }\n\n get auto(): boolean { return this.hasAttribute(\"auto\"); }\n set auto(value: boolean) { this.toggleAttribute(\"auto\", value); }\n\n // --- Core delegated getters ---\n\n get message(): IMidiMessage | null { return this._core.message; }\n get type(): MidiMessageType | null { return this._core.type; }\n get note(): number | null { return this._core.note; }\n get velocity(): number | null { return this._core.velocity; }\n get control(): number | null { return this._core.control; }\n get value(): number | null { return this._core.value; }\n get devices(): IMidiDevice[] { return this._core.devices; }\n get connected(): boolean { return this._core.connected; }\n get permission(): MidiPermissionState { return this._core.permission; }\n get granted(): boolean { return this._core.granted; }\n get denied(): boolean { return this._core.denied; }\n get unsupported(): boolean { return this._core.unsupported; }\n get error(): string | null { return this._core.error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._core.errorInfo; }\n\n /** Headless escape hatch: the Core backing this element. */\n get core(): MidiCore { return this._core; }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Commands ---\n\n request(): Promise<void> { return this._core.request(); }\n close(): void { this._core.close(); }\n send(data: number[] | Uint8Array, timestamp?: number): void { this._core.send(data, timestamp); }\n\n // --- Internal ---\n\n private _options(): IMidiOptions {\n return {\n input: this.input,\n output: this.output,\n channel: this.channel,\n sysex: this.sysex,\n auto: this.auto,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n this._connectedCallbackPromise = this._core.observe(this._options());\n }\n\n disconnectedCallback(): void {\n this._core.dispose();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n // Port selection and channel filtering are live: they re-hook the existing\n // access rather than re-requesting it (no second permission prompt).\n if (this.isConnected) this._core.setOptions(this._options());\n }\n}\n","import { WcsMidi } from \"./components/Midi.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.midi)) {\n registry.define(config.tagNames.midi, WcsMidi);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapMidi(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/midiCapabilities.ts","../src/midi/parseMessage.ts","../src/core/MidiCore.ts","../src/protocol/upgradeProperties.ts","../src/components/Midi.ts","../src/registerComponents.ts","../src/bootstrapMidi.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n tagNames: {\n midi: string;\n };\n}\n\nconst _config: IInternalConfig = {\n tagNames: {\n midi: \"wcs-midi\",\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\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\n/** A misspelt option would otherwise do nothing: `bootstrapMidi` refuses it. */\nfunction invalid(key: string): never {\n throw new Error(`[@wcstack/midi] bootstrapMidi: \"${key}\" is not one of its options, or not of the option's type.`);\n}\n\n/**\n * Applies the options given; an undefined value is left out. An option this package does not\n * have, a value of another type than its default (null, or an array for an object, included) or\n * a tag name it does not define throws, and then nothing is applied.\n */\nexport function setConfig(partialConfig: IWritableConfig): void {\n const options = _config as unknown as Record<string, unknown>;\n const tags = _config.tagNames as Record<string, string>;\n const given = Object.entries(partialConfig).filter(([, value]) => value !== undefined);\n const givenTags = Object.entries(partialConfig.tagNames ?? {}).filter(([, tag]) => tag !== undefined);\n for (const [key, value] of given) {\n const current = options[key];\n if (!Object.hasOwn(options, key) || value === null || typeof value !== typeof current || Array.isArray(value) !== Array.isArray(current)) {\n invalid(key);\n }\n }\n for (const [name, tag] of givenTags) {\n if (!Object.hasOwn(tags, name) || typeof tag !== \"string\") invalid(`tagNames.${name}`);\n }\n for (const [name, tag] of givenTags) tags[name] = tag as string;\n frozenConfig = null;\n}\n","/**\n * midiCapabilities.ts\n *\n * Web MIDI 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)\n * から import する。\n *\n * この node の失敗は 2 箇所からしか来ない:\n * 1. `requestMIDIAccess()` の rejection — 権限拒否・API 不在・sysex 拒否。\n * 2. `MIDIOutput.send()` の throw — 不正なメッセージ・切断済みポート。\n * `_setError` は screen-orientation と同じ discriminator 技法で、synthetic な\n * `\"unsupported\"` / `\"send\"` ヒントと caught された `Error.name` を弁別する\n * (message の文言に依存した分岐を作らない)。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した midi error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_MIDI_ERROR_CODE = {\n /** `navigator.requestMIDIAccess` 自体が不在(synthetic \"unsupported\")。 */\n CapabilityMissing: \"capability-missing\",\n /**\n * `SecurityError` / `NotAllowedError` — ユーザーが拒否した、あるいは\n * permissions policy / 非 secure context で許可されない。retry では回復しない。\n */\n NotAllowed: \"not-allowed\",\n /** その他の `requestMIDIAccess()` 失敗。fresh な request は成功しうる。 */\n AccessError: \"access-error\",\n /** `MIDIOutput.send()` の失敗(不正なメッセージ / 切断済みポート)。 */\n SendFailed: \"send-failed\",\n} as const;\n\n/**\n * Web MIDI の失敗を serializable な error taxonomy に写す。\n *\n * `name` は呼び出し側が渡す discriminator:\n * - `\"unsupported\"` — API 不在 → phase=\"probe\" / capability-missing。\n * - `\"send\"` — 送信失敗 → phase=\"execute\" / send-failed。recoverable(ポートが\n * 戻れば成功しうる)。\n * - `SecurityError` / `NotAllowedError` — 拒否 → phase=\"start\" / not-allowed。\n * - それ以外(`AbortError`、生の throw、`.name` 欠如等) → phase=\"start\" /\n * access-error。\n */\nexport function deriveMidiErrorInfo(name: string | undefined, message: string): WcsIoErrorInfo {\n if (name === \"unsupported\") {\n return { code: WCS_MIDI_ERROR_CODE.CapabilityMissing, phase: \"probe\", recoverable: false, message };\n }\n if (name === \"send\") {\n return { code: WCS_MIDI_ERROR_CODE.SendFailed, phase: \"execute\", recoverable: true, message };\n }\n if (name === \"SecurityError\" || name === \"NotAllowedError\") {\n return { code: WCS_MIDI_ERROR_CODE.NotAllowed, phase: \"start\", recoverable: false, message };\n }\n return { code: WCS_MIDI_ERROR_CODE.AccessError, phase: \"start\", recoverable: true, message };\n}\n","import { IMidiParsed, MidiMessageType } from \"../types.js\";\n\n// Channel voice message commands (high nibble of the status byte).\nconst NOTE_OFF = 0x80;\nconst NOTE_ON = 0x90;\nconst POLY_AFTERTOUCH = 0xa0;\nconst CONTROL_CHANGE = 0xb0;\nconst PROGRAM_CHANGE = 0xc0;\nconst AFTERTOUCH = 0xd0;\nconst SYSTEM = 0xf0;\n\nconst SYSEX_START = 0xf0;\n\nconst EMPTY: IMidiParsed = {\n type: \"other\", channel: null, note: null, velocity: null, control: null, value: null,\n};\n\n/**\n * Decode a raw MIDI message into the fields bindings actually want.\n *\n * Two normalizations are deliberate, because every consumer would otherwise\n * repeat them:\n *\n * - **A note-on with velocity 0 is reported as `\"noteoff\"`.** Many controllers\n * send running-status note-ons and never emit 0x8n at all; treating them as\n * note-ons leaves stuck notes. The raw status byte is still available in\n * `data[0]` for callers that care.\n * - **Velocity is normalized to 0-1**, so it multiplies straight into a gain\n * without the caller knowing about the 7-bit MIDI range. Controller values\n * stay raw 0-127 (`value`), since their meaning is per-controller.\n *\n * Never throws: a truncated or nonsensical buffer decodes to `type: \"other\"`\n * with every field `null` (async-io-node-guidelines.md §3.6).\n */\nexport function parseMessage(data: Uint8Array | number[]): IMidiParsed {\n const status = data[0];\n if (typeof status !== \"number\") return EMPTY;\n\n const d1 = typeof data[1] === \"number\" ? data[1] : 0;\n const d2 = typeof data[2] === \"number\" ? data[2] : 0;\n\n // System messages (0xF0-0xFF) carry no channel nibble.\n if (status >= SYSTEM) {\n return { ...EMPTY, type: status === SYSEX_START ? \"sysex\" : \"other\" };\n }\n // Below 0x80 is a data byte, not a status byte: the buffer is malformed or\n // running-status (which the Web MIDI API already expands for us).\n if (status < NOTE_OFF) return EMPTY;\n\n const command = status & 0xf0;\n const channel = (status & 0x0f) + 1;\n\n switch (command) {\n case NOTE_OFF:\n return { type: \"noteoff\", channel, note: d1, velocity: d2 / 127, control: null, value: null };\n case NOTE_ON:\n // velocity 0 == note off (see doc comment).\n return d2 > 0\n ? { type: \"noteon\", channel, note: d1, velocity: d2 / 127, control: null, value: null }\n : { type: \"noteoff\", channel, note: d1, velocity: 0, control: null, value: null };\n case POLY_AFTERTOUCH:\n return { type: \"polyaftertouch\", channel, note: d1, velocity: null, control: null, value: d2 };\n case CONTROL_CHANGE:\n return { type: \"controlchange\", channel, note: null, velocity: null, control: d1, value: d2 };\n case PROGRAM_CHANGE:\n return { type: \"programchange\", channel, note: null, velocity: null, control: null, value: d1 };\n case AFTERTOUCH:\n return { type: \"aftertouch\", channel, note: null, velocity: null, control: null, value: d1 };\n default:\n // 0xE0 pitch bend — the only high nibble left between 0x80 and 0xEF once\n // the six cases above are taken. 14-bit little-endian, centered at 8192,\n // normalized to -1..1.\n return {\n type: \"pitchbend\", channel, note: null, velocity: null, control: null,\n value: (((d2 << 7) | d1) - 8192) / 8192,\n };\n }\n}\n\n/** Message kinds a caller may want to filter on, exported for tooling. */\nexport const MIDI_MESSAGE_TYPES: readonly MidiMessageType[] = [\n \"noteon\", \"noteoff\", \"polyaftertouch\", \"controlchange\",\n \"programchange\", \"aftertouch\", \"pitchbend\", \"sysex\", \"other\",\n];\n","import {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState,\n} from \"../types.js\";\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveMidiErrorInfo } from \"./midiCapabilities.js\";\nimport { parseMessage } from \"../midi/parseMessage.js\";\n\nconst UNSUPPORTED = \"unsupported\";\n\n// Minimal structural types for the Web MIDI API. The DOM lib does not ship them\n// in every TypeScript configuration, and structural types keep the Core testable\n// against a fake without casting through `any` at each use site.\ninterface MidiPortLike extends EventTarget {\n id: string;\n name?: string | null;\n manufacturer?: string | null;\n state: string;\n type?: string;\n}\ninterface MidiInputLike extends MidiPortLike {\n onmidimessage: ((event: any) => void) | null;\n}\ninterface MidiOutputLike extends MidiPortLike {\n send(data: number[] | Uint8Array, timestamp?: number): void;\n}\ninterface MidiAccessLike {\n inputs: Map<string, MidiInputLike>;\n outputs: Map<string, MidiOutputLike>;\n onstatechange: ((event: any) => void) | null;\n sysexEnabled?: boolean;\n}\n\nconst detailOf = (event: Event): any => (event as CustomEvent).detail;\nconst messageField = <K extends keyof IMidiMessage>(key: K) =>\n (event: Event): IMidiMessage[K] | null => detailOf(event)?.[key] ?? null;\n\n/**\n * Headless Web MIDI primitive: a framework-agnostic wrapper around\n * `navigator.requestMIDIAccess()` exposed through the wc-bindable protocol.\n *\n * Direction is genuinely two-way, unlike `@wcstack/permission` (monitor only):\n * incoming messages flow element → state as `event`-semantics occurrences, and\n * `send()` is a command going the other way. Both live on one node because a\n * page holds exactly one `MIDIAccess` — splitting input and output into two tags\n * would only force them to coordinate over the same shared handle.\n *\n * Nothing starts on construction. `requestMIDIAccess()` can raise a permission\n * prompt, so it is deliberately command-driven (`request()`), matching the\n * `idle` / Generic Sensor family. `observe({ auto: true })` opts back into\n * requesting immediately.\n *\n * The `MIDIAccess` handle itself is never published: the Core owns it and drops\n * it in `close()` / `dispose()`, as `worker` / `websocket` / `broadcast` do with\n * theirs. Only values cross the protocol boundary.\n */\nexport class MidiCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n // One occurrence event, decomposed into derived getters\n // (async-io-node-guidelines.md §4.2). Never same-value guarded: two\n // identical note-ons are two distinct presses.\n { name: \"message\", event: \"wcs-midi:message\", semantics: \"event\" },\n { name: \"type\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"type\") },\n { name: \"channel\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"channel\") },\n { name: \"note\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"note\") },\n { name: \"velocity\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"velocity\") },\n { name: \"control\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"control\") },\n { name: \"value\", event: \"wcs-midi:message\", semantics: \"event\", getter: messageField(\"value\") },\n { name: \"devices\", event: \"wcs-midi:devices\", semantics: \"state\" },\n { name: \"connected\", event: \"wcs-midi:statechange\", semantics: \"state\" },\n { name: \"permission\", event: \"wcs-midi:permission\", semantics: \"state\" },\n { name: \"granted\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"granted\" },\n { name: \"denied\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === \"denied\" },\n { name: \"unsupported\", event: \"wcs-midi:permission\", semantics: \"state\", getter: (e: Event) => detailOf(e) === UNSUPPORTED },\n { name: \"error\", event: \"wcs-midi:error\", semantics: \"state\" },\n { name: \"errorInfo\", event: \"wcs-midi:error-info-changed\", semantics: \"state\" },\n ],\n commands: [\n { name: \"request\", async: true },\n { name: \"close\" },\n { name: \"send\" },\n ],\n };\n\n private _target: EventTarget;\n private _options: IMidiOptions = {};\n\n private _access: MidiAccessLike | null = null;\n private _hookedInputs = new Set<MidiInputLike>();\n\n private _message: IMidiMessage | null = null;\n private _devices: IMidiDevice[] = [];\n private _connected = false;\n private _permission: MidiPermissionState = \"prompt\";\n private _error: string | null = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n\n private _permissionStatus: PermissionStatus | null = null;\n\n // Monotonic id bumped by every request(), close() and dispose(). An in-flight\n // requestMIDIAccess() captures it and bails on resolve when superseded, so a\n // rapid disconnect→reconnect (or a close() mid-flight) never hooks listeners\n // onto a torn-down instance.\n private _gen = 0;\n\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(options?: IMidiOptions | null, target?: EventTarget) {\n super();\n this._target = target ?? this;\n if (options) this._options = { ...options };\n }\n\n // --- Observable getters ---\n\n get message(): IMidiMessage | null { return this._message; }\n get type(): MidiMessageType | null { return this._message?.type ?? null; }\n get channel(): number | null { return this._message?.channel ?? null; }\n get note(): number | null { return this._message?.note ?? null; }\n get velocity(): number | null { return this._message?.velocity ?? null; }\n get control(): number | null { return this._message?.control ?? null; }\n get value(): number | null { return this._message?.value ?? null; }\n\n get devices(): IMidiDevice[] { return this._devices; }\n get connected(): boolean { return this._connected; }\n get permission(): MidiPermissionState { return this._permission; }\n get granted(): boolean { return this._permission === \"granted\"; }\n get denied(): boolean { return this._permission === \"denied\"; }\n get unsupported(): boolean { return this._permission === UNSUPPORTED; }\n get error(): string | null { return this._error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._errorInfo; }\n\n /** Resolves once the current (or initial) access attempt settles. */\n get ready(): Promise<void> { return this._ready; }\n\n // --- Public API ---\n\n /**\n * Store the options and, when `auto` is set, request access. Idempotent:\n * calling it again with new options re-applies port selection to the live\n * access without re-requesting.\n */\n observe(options: IMidiOptions): Promise<void> {\n const wasIdle = this._access === null;\n this.setOptions(options);\n if (options.auto && wasIdle) {\n this._ready = this.request();\n }\n return this._ready;\n }\n\n /**\n * Re-apply port selection / channel filtering. Cheap and safe at any time —\n * with no access held it only records the options for a later `request()`.\n */\n setOptions(options: IMidiOptions): void {\n this._options = { ...this._options, ...options };\n if (this._access) this._hookInputs(this._access);\n }\n\n /**\n * Acquire MIDI access. Never rejects: a refusal or a missing API surfaces as\n * `permission` / `error` state (async-io-node-guidelines.md §3.6).\n */\n request(): Promise<void> {\n const requestAccess = this._resolveApi();\n if (!requestAccess) {\n this._setPermission(UNSUPPORTED);\n this._setError(UNSUPPORTED, UNSUPPORTED);\n this._ready = Promise.resolve();\n return this._ready;\n }\n const gen = ++this._gen;\n this._probePermission();\n this._ready = requestAccess({ sysex: this._options.sysex === true }).then(\n (access: MidiAccessLike) => {\n if (gen !== this._gen) return;\n this._access = access;\n access.onstatechange = this._onStateChange;\n this._setError(null);\n this._setPermission(\"granted\");\n this._hookInputs(access);\n this._publishDevices(access);\n this._setConnected(true);\n },\n (error: any) => {\n if (gen !== this._gen) return;\n this._setPermission(\"denied\");\n this._setError(this._messageOf(error), error?.name);\n },\n );\n return this._ready;\n }\n\n /**\n * Release the access handle and detach every listener, keeping the observed\n * permission state. A later `request()` re-acquires.\n */\n close(): void {\n this._gen++;\n this._unhookInputs();\n if (this._access) {\n this._access.onstatechange = null;\n this._access = null;\n }\n this._setConnected(false);\n }\n\n /**\n * Send a raw MIDI message to the selected output port (or the first available\n * one). No-op when no output is reachable; a failing `send()` surfaces on\n * `error` rather than throwing.\n *\n * Positional arguments pass through verbatim from command-token\n * (docs/spec-proposal-command-token-arguments.md).\n */\n send(data: number[] | Uint8Array, timestamp?: number): void {\n const port = this._resolveOutput();\n if (!port) return;\n try {\n port.send(data, timestamp);\n } catch (error: any) {\n this._setError(this._messageOf(error), \"send\");\n }\n }\n\n /**\n * Detach everything. Headless callers own this lifecycle themselves: without\n * it the live `onmidimessage` handlers keep this instance reachable for as\n * long as the ports are alive.\n */\n dispose(): void {\n this.close();\n if (this._permissionStatus) {\n this._permissionStatus.removeEventListener(\"change\", this._onPermissionChange);\n this._permissionStatus = null;\n }\n }\n\n // --- Internal: API resolution ---\n\n // Resolved at call time, never cached: keeps the unsupported branch honest and\n // lets tests swap the global (async-io-node-guidelines.md §3.7). Read off\n // globalThis rather than the bare identifier so an SSR/worker context with no\n // navigator at all takes the same \"unsupported\" path as Safari.\n private _resolveApi(): ((options: { sysex: boolean }) => Promise<MidiAccessLike>) | null {\n const nav = (globalThis as { navigator?: any }).navigator;\n if (!nav || typeof nav.requestMIDIAccess !== \"function\") return null;\n return (options) => nav.requestMIDIAccess(options);\n }\n\n private _messageOf(error: any): string {\n return typeof error?.message === \"string\" && error.message !== \"\" ? error.message : \"MIDI error\";\n }\n\n // --- Internal: permission monitoring ---\n\n // Optional extra: browsers that answer query({name:\"midi\"}) let a grant flipped\n // in site settings flow into the declarative state without a re-request. Where\n // the descriptor is rejected we simply keep inferring from request() outcomes.\n private _probePermission(): void {\n if (this._permissionStatus) return;\n // Only ever reached after _resolveApi() found navigator.requestMIDIAccess,\n // so navigator itself is known to exist here.\n const permissions = (globalThis as { navigator?: any }).navigator.permissions;\n if (!permissions || typeof permissions.query !== \"function\") return;\n const gen = this._gen;\n permissions.query({ name: \"midi\", sysex: this._options.sysex === true }).then(\n (status: PermissionStatus) => {\n if (gen !== this._gen) return;\n this._permissionStatus = status;\n this._setPermission(status.state as MidiPermissionState);\n status.addEventListener(\"change\", this._onPermissionChange);\n },\n () => { /* descriptor not understood — request() outcomes remain the source */ },\n );\n }\n\n private _onPermissionChange = (event: Event): void => {\n this._setPermission((event.target as PermissionStatus).state as MidiPermissionState);\n };\n\n // --- Internal: ports ---\n\n private _matches(port: MidiPortLike, selector: string): boolean {\n if (port.id === selector) return true;\n const name = port.name ?? \"\";\n return name.toLowerCase().startsWith(selector.toLowerCase());\n }\n\n // Takes the access explicitly rather than reading the field: every call site\n // already holds a non-null handle, and a defensive re-check here would be a\n // branch no test could ever reach.\n private _selectedInputs(access: MidiAccessLike): MidiInputLike[] {\n const all = [...access.inputs.values()];\n const selector = this._options.input;\n // No selector means \"whatever is plugged in\" — the expectation for MIDI is\n // that a controller just works, not that the page names it first.\n if (selector === undefined || selector === null || selector === \"\") return all;\n return all.filter((port) => this._matches(port, selector));\n }\n\n private _resolveOutput(): MidiOutputLike | null {\n if (!this._access) return null;\n const all = [...this._access.outputs.values()];\n const selector = this._options.output;\n if (selector === undefined || selector === null || selector === \"\") return all[0] ?? null;\n return all.find((port) => this._matches(port, selector)) ?? null;\n }\n\n private _hookInputs(access: MidiAccessLike): void {\n const wanted = new Set(this._selectedInputs(access));\n for (const port of this._hookedInputs) {\n if (!wanted.has(port)) {\n port.onmidimessage = null;\n this._hookedInputs.delete(port);\n }\n }\n for (const port of wanted) {\n if (this._hookedInputs.has(port)) continue;\n port.onmidimessage = this._onMidiMessage;\n this._hookedInputs.add(port);\n }\n }\n\n private _unhookInputs(): void {\n for (const port of this._hookedInputs) port.onmidimessage = null;\n this._hookedInputs.clear();\n }\n\n private _onStateChange = (): void => {\n // Port list changed: re-apply selection (a newly plugged input must start\n // delivering) and republish. `onstatechange` is only installed while an\n // access is held and cleared in close(), so the handle is non-null here.\n const access = this._access!;\n this._hookInputs(access);\n this._publishDevices(access);\n };\n\n private _onMidiMessage = (event: { data?: Uint8Array | null; target?: any; timeStamp?: number }): void => {\n const raw = event.data;\n if (!raw) return;\n const parsed = parseMessage(raw);\n const channelFilter = this._options.channel;\n if (channelFilter != null && parsed.channel !== null && parsed.channel !== channelFilter) return;\n const port = event.target as MidiPortLike | undefined;\n this._publishMessage({\n ...parsed,\n // Fresh copy every time: the platform buffer must never be handed out\n // (producer snapshot contract).\n data: new Uint8Array(raw),\n port: port?.id ?? \"\",\n portName: port?.name ?? \"\",\n timestamp: event.timeStamp ?? 0,\n });\n };\n\n // --- Internal: state setters ---\n\n // Occurrence, not state: identical payloads are distinct presses, so there is\n // deliberately no same-value guard here.\n private _publishMessage(message: IMidiMessage): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:message\", { detail: message, bubbles: true }));\n }\n\n private _publishDevices(access: MidiAccessLike): void {\n const next = this._snapshotDevices(access);\n if (this._sameDevices(next)) return;\n // Fresh array assigned before notifying (producer snapshot contract).\n this._devices = next;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:devices\", { detail: next, bubbles: true }));\n }\n\n private _snapshotDevices(access: MidiAccessLike): IMidiDevice[] {\n const collect = (ports: Map<string, MidiPortLike>, direction: \"input\" | \"output\"): IMidiDevice[] =>\n [...ports.values()].map((port) => ({\n id: port.id,\n name: port.name ?? \"\",\n manufacturer: port.manufacturer ?? \"\",\n direction,\n state: port.state === \"connected\" ? \"connected\" : \"disconnected\",\n }));\n return [\n ...collect(access.inputs as Map<string, MidiPortLike>, \"input\"),\n ...collect(access.outputs as Map<string, MidiPortLike>, \"output\"),\n ];\n }\n\n // Content comparison, not reference: statechange fires separately for the\n // input and the output side of one physical device, so an unfiltered\n // republish would double-notify on every plug.\n private _sameDevices(next: IMidiDevice[]): boolean {\n if (next.length !== this._devices.length) return false;\n return next.every((device, i) => {\n const prev = this._devices[i];\n return prev.id === device.id && prev.state === device.state\n && prev.direction === device.direction && prev.name === device.name;\n });\n }\n\n private _setConnected(connected: boolean): void {\n if (this._connected === connected) return;\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:statechange\", { detail: connected, bubbles: true }));\n }\n\n private _setPermission(permission: MidiPermissionState): void {\n if (this._permission === permission) return;\n this._permission = permission;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:permission\", { detail: permission, bubbles: true }));\n }\n\n private _setError(error: string | null, name?: string): void {\n if (this._error !== error) {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error\", { detail: error, bubbles: true }));\n }\n this._commitErrorInfo(error === null ? null : deriveMidiErrorInfo(name, error));\n }\n\n // errorInfo transitions exactly when error does (no independent same-value\n // guard: a fresh object is built per transition).\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n if (this._errorInfo === null && info === null) return;\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-midi:error-info-changed\", { detail: info, bubbles: true }));\n }\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 {\n IMidiDevice, IMidiMessage, IMidiOptions, IWcBindable, MidiMessageType,\n MidiPermissionState, WcsIoErrorInfo,\n} from \"../types.js\";\nimport { MidiCore } from \"../core/MidiCore.js\";\nimport { upgradeProperties } from \"../protocol/upgradeProperties.js\";\n\n/**\n * `<wcs-midi>` — declarative Web MIDI input/output.\n *\n * Nothing happens on connect: `requestMIDIAccess()` can raise a permission\n * prompt, so access is command-driven (`command.request`). Add the `auto`\n * attribute to opt into requesting as soon as the element connects.\n */\nexport class WcsMidi extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static observedAttributes = [\"input\", \"output\", \"channel\"];\n\n static wcBindable: IWcBindable = {\n ...MidiCore.wcBindable,\n inputs: [\n { name: \"input\", attribute: \"input\" },\n { name: \"output\", attribute: \"output\" },\n { name: \"channel\", attribute: \"channel\" },\n { name: \"sysex\", attribute: \"sysex\" },\n { name: \"auto\", attribute: \"auto\" },\n ],\n };\n\n private _core: MidiCore;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new MidiCore(null, this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-midi:permission\": (d) => ({\n granted: d === \"granted\",\n denied: d === \"denied\",\n unsupported: d === \"unsupported\",\n }),\n \"wcs-midi:statechange\": (d) => ({ connected: d === true }),\n \"wcs-midi:error\": (d) => ({ error: d !== null }),\n });\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 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 non-dashed\n // state names. Either case silently disables reflection.\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 input(): string { return this.getAttribute(\"input\") ?? \"\"; }\n set input(value: string) { this.setAttribute(\"input\", value); }\n\n get output(): string { return this.getAttribute(\"output\") ?? \"\"; }\n set output(value: string) { this.setAttribute(\"output\", value); }\n\n get channel(): number | null {\n const raw = this.getAttribute(\"channel\");\n if (raw === null) return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n }\n\n set channel(value: number | null) {\n if (value === null) {\n this.removeAttribute(\"channel\");\n } else {\n this.setAttribute(\"channel\", String(value));\n }\n }\n\n get sysex(): boolean { return this.hasAttribute(\"sysex\"); }\n set sysex(value: boolean) { this.toggleAttribute(\"sysex\", value); }\n\n get auto(): boolean { return this.hasAttribute(\"auto\"); }\n set auto(value: boolean) { this.toggleAttribute(\"auto\", value); }\n\n // --- Core delegated getters ---\n\n get message(): IMidiMessage | null { return this._core.message; }\n get type(): MidiMessageType | null { return this._core.type; }\n get note(): number | null { return this._core.note; }\n get velocity(): number | null { return this._core.velocity; }\n get control(): number | null { return this._core.control; }\n get value(): number | null { return this._core.value; }\n get devices(): IMidiDevice[] { return this._core.devices; }\n get connected(): boolean { return this._core.connected; }\n get permission(): MidiPermissionState { return this._core.permission; }\n get granted(): boolean { return this._core.granted; }\n get denied(): boolean { return this._core.denied; }\n get unsupported(): boolean { return this._core.unsupported; }\n get error(): string | null { return this._core.error; }\n get errorInfo(): WcsIoErrorInfo | null { return this._core.errorInfo; }\n\n /** Headless escape hatch: the Core backing this element. */\n get core(): MidiCore { return this._core; }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Commands ---\n\n request(): Promise<void> { return this._core.request(); }\n close(): void { this._core.close(); }\n send(data: number[] | Uint8Array, timestamp?: number): void { this._core.send(data, timestamp); }\n\n // --- Internal ---\n\n private _options(): IMidiOptions {\n return {\n input: this.input,\n output: this.output,\n channel: this.channel,\n sysex: this.sysex,\n auto: this.auto,\n };\n }\n\n // --- Lifecycle ---\n\n connectedCallback(): void {\n // upgrade 前に代入された input を取り込み直す(doc 13 §1.2 / Phase A1)\n upgradeProperties(this);\n this.style.display = \"none\";\n this._connectedCallbackPromise = this._core.observe(this._options());\n }\n\n disconnectedCallback(): void {\n this._core.dispose();\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n // Port selection and channel filtering are live: they re-hook the existing\n // access rather than re-requesting it (no second permission prompt).\n if (this.isConnected) this._core.setOptions(this._options());\n }\n}\n","import { WcsMidi } from \"./components/Midi.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.midi)) {\n registry.define(config.tagNames.midi, WcsMidi);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapMidi(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