diff --git a/CHANGES.md b/CHANGES.md index b5765b55..26674dc7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,11 @@ ## Unreleased +### Added + +* `Driver::utc_now` (Gets current UTC timestamp) +* `Driver::timezone_offset` (Gets browsers time zone offset in seconds) + ### Changed * Hush excessive logging when no Content-Type or cookie provided diff --git a/crates/vertigo/src/driver_module/api/api_import.rs b/crates/vertigo/src/driver_module/api/api_import.rs index 2b95bf1f..13ebd9b2 100644 --- a/crates/vertigo/src/driver_module/api/api_import.rs +++ b/crates/vertigo/src/driver_module/api/api_import.rs @@ -133,7 +133,7 @@ impl ApiImport { if result != JsValue::Null { if let JsValue::Json(value) = result { - return value + return value; } log::error!("cookie_get_json -> params decode error -> result={result:?}"); } @@ -264,6 +264,10 @@ impl ApiImport { } pub fn instant_now(&self) -> InstantType { + self.utc_now() as InstantType + } + + pub fn utc_now(&self) -> i64 { let result = self .dom_access() .root("window") @@ -272,20 +276,35 @@ impl ApiImport { .fetch(); match result { - JsValue::I64(time) => { - time as u64 as InstantType - } - JsValue::F64(time) => { - time as u64 as InstantType - } + JsValue::I64(time) => time, + JsValue::F64(time) => time as i64, _ => { self.panic_message - .show(format!("api.instant_now -> incorrect result {result:?}")); - 0_u64 + .show(format!("api.utc_now -> incorrect result {result:?}")); + 0_i64 } } } + pub fn timezone_offset(&self) -> i32 { + let result = self + .dom_access() + .api() + .call("getTimezoneOffset", vec![]) + .fetch(); + + if let JsValue::I32(result) = result { + // Return in seconds to be compatible with chrono + // Opposite as JS returns the offset backwards + result * -60 + } else { + self.panic_message.show(format!( + "api.timezone_offset -> incorrect result {result:?}" + )); + 0 + } + } + pub fn history_back(&self) { self.dom_access() .root("window") @@ -679,11 +698,10 @@ impl ApiImport { /// Synthetic command to respond with plain text, not DOM pub fn plain_response(&self, body: String) { if self.is_browser() { - return + return; } - self - .dom_access() + self.dom_access() .synthetic("plain_response", JsValue::String(body)) .exec(); } diff --git a/crates/vertigo/src/driver_module/driver.rs b/crates/vertigo/src/driver_module/driver.rs index 6e74c4f7..aca4bb5a 100644 --- a/crates/vertigo/src/driver_module/driver.rs +++ b/crates/vertigo/src/driver_module/driver.rs @@ -155,6 +155,18 @@ impl Driver { Instant::now(self.inner.api.clone()) } + /// Gets current UTC timestamp + pub fn utc_now(&self) -> i64 { + self.inner.api.utc_now() + } + + /// Gets browsers time zone offset in seconds + /// + /// Compatible with chrono's `FixedOffset::east_opt` method. + pub fn timezone_offset(&self) -> i32 { + self.inner.api.timezone_offset() + } + /// Create new RequestBuilder for GETs (more complex version of [fetch](struct.Driver.html#method.fetch)) #[must_use] pub fn request_get(&self, url: impl Into) -> RequestBuilder { diff --git a/crates/vertigo/src/driver_module/src_js/api_browser.ts b/crates/vertigo/src/driver_module/src_js/api_browser.ts index dcc3d498..1db901e0 100644 --- a/crates/vertigo/src/driver_module/src_js/api_browser.ts +++ b/crates/vertigo/src/driver_module/src_js/api_browser.ts @@ -40,4 +40,8 @@ export class ApiBrowser { public get_env = (name: string): string | null => { return document.documentElement.getAttribute(`data-env-${name}`); } + + public getTimezoneOffset = (): number => { + return new Date().getTimezoneOffset() + } } diff --git a/crates/vertigo/src/driver_module/wasm_run.js b/crates/vertigo/src/driver_module/wasm_run.js index 8bf295dc..923f1a69 100644 --- a/crates/vertigo/src/driver_module/wasm_run.js +++ b/crates/vertigo/src/driver_module/wasm_run.js @@ -1,2 +1,2 @@ -"use strict";const e=e=>{throw Error("assert never")},t=new TextDecoder("utf-8"),r=new TextEncoder;class s{constructor(e,t,r){this.getUint8Memory=e,this.ptr=t,this.size=r,this.pointer=0,this.dataView=new DataView(this.getUint8Memory().buffer,this.ptr,this.size)}getByte(){const e=this.dataView.getUint8(this.pointer);return this.pointer+=1,e}setByte(e){this.dataView.setUint8(this.pointer,e),this.pointer+=1}getU16(){const e=this.dataView.getUint16(this.pointer);return this.pointer+=2,e}setU16(e){this.dataView.setUint16(this.pointer,e),this.pointer+=2}getU32(){const e=this.dataView.getUint32(this.pointer);return this.pointer+=4,e}setU32(e){this.dataView.setUint32(this.pointer,e),this.pointer+=4}getI32(){const e=this.dataView.getInt32(this.pointer);return this.pointer+=4,e}setI32(e){this.dataView.setInt32(this.pointer,e),this.pointer+=4}getU64(){const e=this.dataView.getBigUint64(this.pointer);return this.pointer+=8,e}setU64(e){this.dataView.setBigUint64(this.pointer,e),this.pointer+=8}getI64(){const e=this.dataView.getBigInt64(this.pointer);return this.pointer+=8,e}setI64(e){this.dataView.setBigInt64(this.pointer,e),this.pointer+=8}getF64(){const e=this.dataView.getFloat64(this.pointer);return this.pointer+=8,e}setF64(e){this.dataView.setFloat64(this.pointer,e),this.pointer+=8}getBuffer(){const e=this.getU32(),t=this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+e);return this.pointer+=e,t}setBuffer(e){const t=e.length;this.setU32(t);this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+t).set(e),this.pointer+=t}getString(){return t.decode(this.getBuffer())}setString(e){const t=r.encode(e);this.setBuffer(t)}getSavedSize(){return this.pointer}}const o=e=>(new TextEncoder).encode(e).length;var n;!function(e){e.isString=e=>"string"==typeof e,e.isStringOrNull=e=>null===e||"string"==typeof e,e.isNumber=e=>"object"==typeof e&&null!==e&&"type"in e&&(e.type===g.I32||e.type===g.U32),e.isBigInt=e=>"object"==typeof e&&null!==e&&"type"in e&&(e.type===g.I64||e.type===g.U64)}(n||(n={}));const i=1,a=2,c=3,l=4,u=5,h=6,d=7,f=e=>{if("boolean"==typeof e)return 1;if(null===e)return 1;if("string"==typeof e)return 5+o(e);if(Array.isArray(e)){let t=5;for(const r of e)t+=f(r);return t}if("number"==typeof e)return 9;let t=3;for(const[r,s]of Object.entries(e))t+=4+o(r),t+=f(s);return t},p=e=>{const t=e.getByte();if(t===i)return!0;if(t===a)return!1;if(t===c)return null;if(t===l)return e.getString();if(t===u)return e.getF64();if(t===h){const t=[],r=e.getU32();for(let s=0;s{if(!0===e)return void t.setByte(i);if(!1===e)return void t.setByte(a);if(null===e)return void t.setByte(c);if("string"==typeof e)return t.setByte(l),void t.setString(e);if("number"==typeof e)return t.setByte(u),void t.setF64(e);if(Array.isArray(e)){t.setByte(h),t.setU32(e.length);for(const r of e)m(r,t);return}const r=[];for(const[t,s]of Object.entries(e))r.push([t,s]);t.setByte(d),t.setU16(r.length);for(const[e,s]of r)t.setString(e),m(s,t)},g={U32:1,I32:2,U64:3,I64:4,F64:5,True:6,False:7,Null:8,Undefined:9,Vec:10,String:11,List:12,Object:13,Json:14},y=e=>{const t=e.getByte();if(t===g.U32)return{type:g.U32,value:e.getU32()};if(t===g.I32)return{type:g.I32,value:e.getI32()};if(t===g.U64)return{type:g.U64,value:e.getU64()};if(t===g.I64)return{type:g.I64,value:e.getI64()};if(t===g.F64)return{type:g.F64,value:e.getF64()};if(t===g.True)return!0;if(t===g.False)return!1;if(t===g.Null)return null;if(t!==g.Undefined){if(t===g.Vec)return e.getBuffer();if(t===g.String)return e.getString();if(t===g.List){const t=[],r=e.getU32();for(let s=0;s{if(!0===t||!1===t||null==t)return 1;if(n.isString(t))return 5+o(t);if(Array.isArray(t)){let e=5;for(const r of t)e+=w(r);return e}if(t instanceof Uint8Array)return 5+t.length;if(t.type===g.I32||t.type===g.U32)return 5;if(t.type===g.I64||t.type===g.U64||t.type==g.F64)return 9;if(t.type===g.Object){let e=3;for(const[r,s]of Object.entries(t.value))e+=4+o(r),e+=w(s);return e}return t.type===g.Json?1+f(t.value):e()},v=(t,r)=>{if(!0!==t)if(!1!==t)if(null!==t)if(void 0!==t){if(t instanceof Uint8Array)return r.setByte(g.Vec),void r.setBuffer(t);if(n.isString(t))return r.setByte(g.String),void r.setString(t);if(Array.isArray(t)){r.setByte(g.List),r.setU32(t.length);for(const e of t)v(e,r)}else{if(t.type===g.U32)return r.setByte(g.U32),void r.setU32(t.value);if(t.type===g.I32)return r.setByte(g.I32),void r.setI32(t.value);if(t.type===g.U64)return r.setByte(g.U64),void r.setU64(t.value);if(t.type===g.I64)return r.setByte(g.I64),void r.setI64(t.value);if(t.type===g.F64)return r.setByte(g.F64),void r.setF64(t.value);if(t.type!==g.Object)return t.type===g.Json?(r.setByte(g.Json),void m(t.value,r)):e();{const e=[];for(const[r,s]of Object.entries(t.value))e.push([r,s]);r.setByte(g.Object),r.setU16(e.length);for(const[t,s]of e)r.setString(t),v(s,r)}}}else r.setByte(g.Undefined);else r.setByte(g.Null);else r.setByte(g.False);else r.setByte(g.True)},_=t=>{if(!0===t)return!0;if(!1===t)return!1;if(null===t)return null;if(void 0!==t){if(t instanceof Uint8Array)return t;if(n.isString(t))return t;if(Array.isArray(t)){const e=[];for(const r of t)e.push(_(r));return e}if(t.type===g.U32||t.type===g.I32)return t.value;if(t.type===g.U64||t.type===g.I64||t.type===g.F64)return t.value;if(t.type===g.Object){const e={};for(const[r,s]of Object.entries(t.value))e[r]=_(s);return e}return t.type===g.Json?t.value:e()}},b=e=>{if("string"==typeof e)return e;if(!0===e||!1===e||null==e)return e;if("number"==typeof e)return e===(0|e)?-(2**31)<=e&&e<2**31?{type:g.I32,value:e}:{type:g.I64,value:BigInt(e)}:{type:g.F64,value:e};if("bigint"==typeof e)return{type:g.I64,value:e};if(e instanceof Uint8Array)return e;if("object"==typeof e){try{const t=k(e);return{type:g.Json,value:t}}catch(e){}const t={};for(const[r,s]of Object.entries(e))t[r]=b(s);return{type:g.Object,value:t}}if(Array.isArray(e))try{const t=e.map(k);return{type:g.Json,value:t}}catch(t){return e.map(b)}throw console.warn("convertToJsValue",e),Error("It is not possible to convert this data to JsValue")},k=e=>{if("boolean"==typeof e||null===e||"number"==typeof e||"string"==typeof e)return e;if(Array.isArray(e))return e.map(k);if("object"==typeof e){const t={};for(const[r,s]of Object.entries(e))t[r]=k(s);return t}throw console.warn("convertToJsJson",e),Error("It is not possible to convert this data to JsJson")},U=async(e,t)=>{const r=await(async(e,t)=>{if("function"==typeof WebAssembly.instantiateStreaming){const r=fetch(e);try{return await WebAssembly.instantiateStreaming(r,t)}catch(e){console.warn("`WebAssembly.instantiateStreaming` failed. This could happen if your server does not serve wasm with `application/wasm` MIME type, but check the original error too. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}}console.info("fetchModule by WebAssembly.instantiate");const r=await fetch(e),s=await r.arrayBuffer();return await WebAssembly.instantiate(s,t)})(e,t);let o=new Uint8Array(1);const n=()=>{if(r.instance.exports.memory instanceof WebAssembly.Memory)return o.buffer!==r.instance.exports.memory.buffer&&(o=new Uint8Array(r.instance.exports.memory.buffer)),o;throw Error("Missing memory")},i=r.instance.exports,a=(e,t)=>((e,t,r)=>{try{const o=new s(e,t,r);return y(o)}catch(e){return console.error(e),[]}})(n,e,t),c=e=>((e,t,r)=>{if(void 0===r)return 0;const o=w(r),n=t(o),i=new s(e,n,o);if(v(r,i),o!==i.getSavedSize())throw console.error({size:o,savedSize:i.getSavedSize()}),Error("Mismatch between calculated and recorded size");return n})(n,i.alloc,e);return{exports:i,decodeArguments:a,getUint8Memory:n,wasm_callback:(e,t)=>{const r=c(t);let s=i.wasm_callback(e,r);if(0n===s)return;const o=s%2n**32n,n=s>>32n;n>=2n**32n&&console.error(`Overflow of a variable with a pointer result_ptr_and_size=${s}`);const l=a(Number(n),Number(o));return i.free(Number(n)),l},valueSaveToBuffer:c}};class x{constructor(){this.get=e=>{for(const t of document.cookie.split(";")){if(""===t)continue;const r=t.trim().split("=");if(2!==r.length){console.warn(`Cookies.get: Incorrect number of cookieChunk => ${r.length} in ${t}`);continue}const s=r[0],o=r[1];if(void 0!==s&&void 0!==o){if(s===e)return decodeURIComponent(o)}else console.warn(`Cookies.get: Broken cookie part => ${t}`)}return""},this.get_json=e=>{let t=this.get(e);if(0!==t.length)try{return JSON.parse(t)}catch(e){console.error("Error deserializing cookie",e)}return null},this.set=(e,t,r)=>{const s=null==t?"":encodeURIComponent(t),o=new Date;o.setTime(o.getTime()+1e3*Number(r));let n="expires="+o.toUTCString();document.cookie=`${e}=${s};${n};path=/;samesite=strict"`},this.set_json=(e,t,r)=>{let s=JSON.stringify(t);this.set(e,s,r)}}}class E{constructor(e){this.interval_set=(e,t)=>setInterval((()=>{this.getWasm().wasm_callback(t,void 0)}),e),this.interval_clear=e=>{clearInterval(e)},this.timeout_set=(e,t)=>setTimeout((()=>{this.getWasm().wasm_callback(t,void 0)}),e),this.timeout_clear=e=>{clearTimeout(e)},this.getWasm=e}}class A{constructor(e){this.trigger=()=>{for(const e of Array.from(this.callback.values()))e()},this.add=e=>{this.callback.set(e,(()=>{this.getWasm().wasm_callback(e,this.get())}))},this.remove=e=>{this.callback.delete(e)},this.push=e=>{this.get()!==e&&(location.hash=e,this.trigger())},this.getWasm=e,this.callback=new Map,window.addEventListener("hashchange",this.trigger)}get(){return decodeURIComponent(location.hash.substr(1))}}const S=async(e,t,r,s)=>{try{await s(r)}catch(s){console.error("fetch error (2) - json",s);const o=new String(s).toString();e.wasm_callback(t,[!1,{type:g.U32,value:r.status},o])}};class B{constructor(e){this.fetch_send_request=(e,t,r,s,o)=>{this.fetch_send_request_inner(e,t,r,s,o)},this.fetch_send_request_inner=async(e,t,r,s,o)=>{const n=this.getWasm(),[i,a]=((e,t)=>{const r=new Headers(e);return void 0===t?[r,void 0]:"string"==typeof t?(!1===r.has("content-type")&&r.set("content-type","text/plain; charset=utf-8"),[r,t]):t instanceof Uint8Array?(!1===r.has("content-type")&&r.set("content-type","application/octet-stream"),[r,t]):(!1===r.has("content-type")&&r.set("content-type","application/json; charset=utf-8"),[r,JSON.stringify(t)])})(s,o);try{const s=await fetch(r,{method:t,headers:i,body:a}),o=(e=>{if(null===e)return console.info("Missing header content-type"),"bin";const[t]=e.split(";");if(void 0===t)return console.error("Missing value for content-type"),"bin";const r=t.toLowerCase().trim();return"application/json"===r?"json":"text/plain"===r?"text":(console.error(`No match found for content-type=${e}`),"bin")})(s.headers.get("content-type"));if("json"===o)return void S(n,e,s,(async t=>{const r=await t.json();n.wasm_callback(e,[!0,{type:g.U32,value:t.status},{type:g.Json,value:r}])}));if("text"===o)return void S(n,e,s,(async t=>{const r=await t.text();n.wasm_callback(e,[!0,{type:g.U32,value:t.status},r])}));S(n,e,s,(async t=>{const r=await t.arrayBuffer(),s=new Uint8Array(r);n.wasm_callback(e,[!0,{type:g.U32,value:t.status},s])}))}catch(t){console.error("fetch error (1)",t);const r=new String(t).toString();n.wasm_callback(e,[!1,{type:g.U32,value:0},r])}},this.getWasm=e}}class I{constructor(){this.events=new Set}on(e){let t=!0;const r=r=>{t&&e(r)};return this.events.add(r),()=>{t=!1,this.events.delete(r)}}trigger(e){const t=Array.from(this.events.values());for(const r of t)try{r(e)}catch(e){console.error(e)}}get size(){return this.events.size}}class L{constructor(){this.promiseResolveReject=null,this.resolve=e=>{const t=this.promiseResolveReject;this.promiseResolveReject=null,null!==t&&t.resolve(e)},this.reject=e=>{const t=this.promiseResolveReject;this.promiseResolveReject=null,null!==t&&t.reject(e)},this.isFulfilled=()=>null===this.promiseResolveReject;const[e,t]=(()=>{let e=null,t=null;const r=new Promise(((r,s)=>{e=r,t=s}));if(null===e)throw Error("createPromiseValue - resolve is null");if(null===t)throw Error("createPromiseValue - reject is null");return[{resolve:e,reject:t},r]})();this.promiseResolveReject=e,this.promise=t}}const T=async(e,t)=>{console.info(`${e} wait ${t}ms`),await(async e=>new Promise((t=>{setTimeout(t,e)})))(t),console.info(`${e} go forth`)};class W{constructor(e){this.host=e,this.formatLog=e=>`Socket ${this.host} ==> ${e}`}}class ${constructor(e,t){this.eventMessage=new I,this.close=e,this.send=t}static connect(e,t,r){const s=new L,o=new L,n=new WebSocket(t);let i=!1;console.info(e.formatLog("starting ..."));const a=()=>{i||(console.info(e.formatLog("close")),i=!0,s.resolve(null),o.resolve(),n.close())},c=new $(a,(e=>{i||n.send(e)}));setTimeout((()=>{!1===s.isFulfilled()&&(console.error(e.formatLog(`timeout (${r}ms)`)),a())}),r);return n.addEventListener("open",(()=>{console.info(e.formatLog("open")),s.resolve(c)})),n.addEventListener("error",(t=>{console.error(e.formatLog("error"),t),a()})),n.addEventListener("close",a),n.addEventListener("message",(t=>{if(i)return;const r=t.data;"string"!=typeof r?console.error(e.formatLog("onMessage - expected string"),r):c.eventMessage.trigger(r)})),{socket:s.promise,done:o.promise}}static startSocket(e,t,r,s){let o=!0,n=null;const i=new W(e);return(async()=>{for(;o;){const a=$.connect(i,e,t),c=await a.socket;if(null!==c){if(n=c,s({type:"socket",socket:c}),c.eventMessage.on((e=>{s({type:"message",message:e})})),await a.done,s({type:"close"}),!o)return void console.info(i.formatLog("disconnect (1)"));await T(i.formatLog("reconnect after close"),r)}else await T(i.formatLog("reconnect after error"),r)}console.info(i.formatLog("disconnect (2)"))})().catch((e=>{console.error(e)})),{send:e=>{null===n?console.error("send fail - missing connection",e):n.send(e)},dispose:()=>{o=!1,n?.close()}}}}class j{constructor(e){this.websocket_register_callback=(e,t)=>{const r=this.getWasm();let s=$.startSocket(e,5e3,3e3,(e=>{if(!1!==this.controllerList.has(t)){if("socket"===e.type)return this.socket.set(t,e.socket),void r.wasm_callback(t,!0);if("message"!==e.type)return"close"===e.type?(this.socket.delete(t),void r.wasm_callback(t,!1)):(e=>{throw console.error(e),Error("unknown message")})(e);r.wasm_callback(t,e.message)}}));this.controllerList.set(t,s)},this.websocket_unregister_callback=e=>{const t=this.controllerList.get(e);void 0!==t?(t.dispose(),this.controllerList.delete(e)):console.error("Expected controller")},this.websocket_send_message=(e,t)=>{const r=this.socket.get(e);void 0===r?console.error(`Missing socket connection for callback_id=${e}`):r.send(t)},this.getWasm=e,this.controllerList=new Map,this.socket=new Map}}class M{constructor(){this.data=new Map}get_root_html(){return document.documentElement}get_root_head(){return document.head}get_root_body(){return document.body}set(e,t){1===e||2===e||3===e||this.data.set(e,t)}get_any_option(e){return 1===e?this.get_root_html():2===e?this.get_root_head():3===e?this.get_root_body():this.data.get(e)}get_any(e,t){const r=this.get_any_option(t);if(void 0===r)throw Error(`${e} -> item not found=${t}`);return r}get(e,t){const r=this.get_any_option(t);if(void 0===r)throw new Error(`${e}->get: Item id not found = ${t}`);return r}get_node_element(e,t){const r=this.get(e,t);if(r instanceof HTMLElement)return r;throw Error(`Expected id=${t} as HTMLElement`)}get_node(e,t){const r=this.get(e,t);if(r instanceof Element)return r;throw Error(`Expected id=${t} as Element`)}get_text(e,t){const r=this.get(e,t);if(r instanceof Text)return r;throw Error(`Expected id=${t} as Text`)}get_comment(e,t){const r=this.get(e,t);if(r instanceof Comment)return r;throw Error(`Expected id=${t} as Comment`)}delete(e,t){const r=this.get_any_option(t);if(this.data.delete(t),void 0===r)throw new Error(`${e}->delete: Item id not found = ${t}`);return r}}class N{constructor(e,t){this.get_node_to_clear=e=>{const t=[];return e.childNodes.forEach((e=>{t.push(e)})),t},this.get_to_clear=()=>!0===this.initBeforeFirstUpdate?[[],[]]:(this.initBeforeFirstUpdate=!0,[this.get_node_to_clear(this.nodes.get_root_head()),this.get_node_to_clear(this.nodes.get_root_body())]),this.dom_bulk_update=e=>{const[t,r]=this.get_to_clear(),s=new Set;for(const t of e){try{this.bulk_update_command(t)}catch(e){console.error("bulk_update - item",e,t)}"set_attr"===t.type&&"autofocus"===t.name.toLocaleLowerCase()&&s.add(t.id)}s.size>0&&setTimeout((()=>{for(const e of s){this.nodes.get_node_element(`set focus ${e}`,e).focus()}}),0);for(const e of r)e.remove();for(const e of t)e.remove()},this.historyLocation=e,this.getWasm=t,this.nodes=new M,this.callbacks=new Map,this.initBeforeFirstUpdate=!1,document.addEventListener("dragover",(e=>{e.preventDefault()}))}debugNodes(...e){const t={};for(const r of e){const e=this.nodes.get_any_option(r);t[r]=e}console.info("debug nodes",t)}create_node(e,t){const r=(e=>"path"==e||"svg"==e?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e))(t);this.nodes.set(e,r),"a"===t.toLowerCase().trim()&&r.addEventListener("click",(e=>{let t=r.getAttribute("href");null!==t&&(t.startsWith("#")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||(e.preventDefault(),this.historyLocation.push(t),window.scrollTo(0,0)))}))}set_attribute(e,t,r){const s=this.nodes.get_node("set_attribute",e);if(s.setAttribute(t,r),"value"==t){if(s instanceof HTMLInputElement)return void(s.value=r);if(s instanceof HTMLTextAreaElement)return s.value=r,void(s.defaultValue=r)}}remove_attribute(e,t){const r=this.nodes.get_node("remove_attribute",e);if(r.removeAttribute(t),"value"==t){if(r instanceof HTMLInputElement)return void(r.value="");if(r instanceof HTMLTextAreaElement)return r.value="",void(r.defaultValue="")}}remove_node(e){this.nodes.delete("remove_node",e).remove()}create_text(e,t){const r=document.createTextNode(t);this.nodes.set(e,r)}remove_text(e){this.nodes.delete("remove_node",e).remove()}update_text(e,t){this.nodes.get_text("set_attribute",e).textContent=t}insert_before(e,t,r){const s=this.nodes.get("insert_before",e),o=this.nodes.get_any("insert_before child",t);if(null==r)s.insertBefore(o,null);else{const e=this.nodes.get_any("insert_before ref",r);s.insertBefore(o,e)}}insert_css(e,t){const r=document.createElement("style"),s=document.createTextNode(`${e} { ${t} }`);r.appendChild(s),this.nodes.get_root_head().appendChild(r)}callback_click(e,t){e.preventDefault(),this.getWasm().wasm_callback(t,void 0)}callback_input(e,t){const r=e.target;r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement?this.getWasm().wasm_callback(t,r.value):console.warn("event input ignore",r)}callback_change(e,t){const r=e.target;r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement?this.getWasm().wasm_callback(t,r.value):console.warn("event input ignore",r)}callback_blur(e,t){this.getWasm().wasm_callback(t,void 0)}callback_mousedown(e,t){this.getWasm().wasm_callback(t,void 0)&&e.preventDefault()}callback_mouseup(e,t){this.getWasm().wasm_callback(t,void 0)&&e.preventDefault()}callback_mouseenter(e,t){this.getWasm().wasm_callback(t,void 0)}callback_mouseleave(e,t){this.getWasm().wasm_callback(t,void 0)}callback_drop(e,t){if(e.preventDefault(),e instanceof DragEvent)if(null===e.dataTransfer)console.error("dom -> drop -> dataTransfer null");else{const r=[];for(let t=0;t drop -> item - undefined");else{const e=s.getAsFile();null===e?console.error(`dom -> drop -> index:${t} -> It's not a file`):r.push(e.arrayBuffer().then((t=>({name:e.name,data:new Uint8Array(t)}))))}}r.length?Promise.all(r).then((e=>{const r=[];for(const t of e)r.push([t.name,t.data]);this.getWasm().wasm_callback(t,[r])})).catch((e=>{console.error("callback_drop -> promise.all -> ",e)})):console.error("No files to send")}else console.warn("event drop ignore",e)}callback_keydown(e,t){if(e instanceof KeyboardEvent){!0===this.getWasm().wasm_callback(t,[e.key,e.code,e.altKey,e.ctrlKey,e.shiftKey,e.metaKey])&&(e.preventDefault(),e.stopPropagation())}else console.warn("keydown ignore",e)}callback_load(e,t){e.preventDefault(),this.getWasm().wasm_callback(t,void 0)}callback_add(e,t,r){const s=e=>"click"===t?this.callback_click(e,r):"input"===t?this.callback_input(e,r):"change"===t?this.callback_change(e,r):"blur"===t?this.callback_blur(e,r):"mousedown"===t?this.callback_mousedown(e,r):"mouseup"===t?this.callback_mouseup(e,r):"mouseenter"===t?this.callback_mouseenter(e,r):"mouseleave"===t?this.callback_mouseleave(e,r):"keydown"===t||"hook_keydown"===t?this.callback_keydown(e,r):"drop"===t?this.callback_drop(e,r):"load"===t?this.callback_load(e,r):void console.error(`No support for the event ${t}`);if(this.callbacks.has(r))console.error(`There was already a callback added with the callback_id=${r}`);else if(this.callbacks.set(r,s),"hook_keydown"===t)document.addEventListener("keydown",s,!1);else{this.nodes.get("callback_add",e).addEventListener(t,s,!1)}}callback_remove(e,t,r){const s=this.callbacks.get(r);if(this.callbacks.delete(r),void 0!==s)if("hook_keydown"===t)document.removeEventListener("keydown",s);else{this.nodes.get("callback_remove",e).removeEventListener(t,s)}else console.error(`The callback is missing with the id=${r}`)}bulk_update_command(e){if("remove_node"!==e.type)if("insert_before"!==e.type)if("create_node"!==e.type)if("create_text"!==e.type)if("update_text"!==e.type)if("set_attr"!==e.type)if("remove_attr"!==e.type)if("remove_text"!==e.type)if("insert_css"!==e.type)if("create_comment"!==e.type)if("remove_comment"!==e.type)if("callback_add"!==e.type){if("callback_remove"!==e.type)return(e=>{throw console.error(e),Error("unknown command")})(e);this.callback_remove(e.id,e.event_name,BigInt(e.callback_id))}else this.callback_add(e.id,e.event_name,BigInt(e.callback_id));else{this.nodes.delete("remove_comment",e.id).remove()}else{const t=document.createComment(e.value);this.nodes.set(e.id,t)}else this.insert_css(e.selector,e.value);else this.remove_text(e.id);else this.remove_attribute(e.id,e.name);else this.set_attribute(e.id,e.name,e.value);else this.update_text(e.id,e.value);else this.create_text(e.id,e.value);else this.create_node(e.id,e.name);else this.insert_before(e.parent,e.child,null===e.ref_id?null:e.ref_id);else this.remove_node(e.id)}}class J{constructor(e){this.trigger=()=>{for(const e of Array.from(this.callback.values()))e()},this.add=e=>{this.callback.set(e,(()=>{this.getWasm().wasm_callback(e,this.get())}))},this.remove=e=>{this.callback.delete(e)},this.push=e=>{this.get()!==e&&(window.history.pushState(null,"",e),this.trigger())},this.replace=e=>{this.get()!==e&&(window.history.replaceState(null,"",e),this.trigger())},this.getWasm=e,this.callback=new Map,window.addEventListener("popstate",this.trigger)}get(){return window.location.pathname+window.location.search+window.location.hash}}class V{constructor(e){this.getRandom=(e,t)=>{const r=t-e+1;return e+Math.floor(Math.random()*r)},this.isBrowser=()=>!0,this.get_env=e=>document.documentElement.getAttribute(`data-env-${e}`),this.cookie=new x,this.interval=new E(e),this.hashRouter=new A(e),this.historyLocation=new J(e),this.fetch=new B(e),this.websocket=new j(e),this.dom=new N(this.historyLocation,e)}}class F{constructor(e,t,r){this.api=e,this.nodes=t,this.wsk=r}getByProperty(e,t){try{const e=this.wsk[t];return new F(this.api,this.nodes,e)}catch(r){return console.error("A problem with get",{path:e,property:t,error:r}),null}}toValue(){return b(this.wsk)}next(e,t){if(Array.isArray(t)){const[r,...s]=t;return"api"===r?this.nextApi(e,s):"root"===r?this.nextRoot(e,s):"get"===r?this.nextGet(e,s):"set"===r?this.nextSet(e,s):"call"===r?this.nextCall(e,s):"get_props"===r?this.nextGetProps(e,s):(console.error("JsNode.next - wrong commandName",r),null)}return console.error("JsNode.next - array was expected",{path:e,command:t}),null}nextApi(e,t){return 0===t.length?new F(this.api,this.nodes,this.api):(console.error("nextApi: wrong parameter",{path:e,args:t}),null)}nextRoot(e,t){const[r,...s]=t;if(n.isString(r)&&0===s.length)return"window"===r?new F(this.api,this.nodes,window):"document"===r?new F(this.api,this.nodes,document):(console.error(`JsNode.nextRoot: Global name not found -> ${r}`,{path:e,args:t}),null);if(n.isNumber(r)&&0===s.length){const s=r.value,o=this.nodes.get_any_option(s);return void 0!==o?new F(this.api,this.nodes,o):(console.error(`JsNode.nextRoot: No node with id=${s}`,{path:e,args:t}),null)}return console.error("JsNode.nextRoot: wrong parameter",{path:e,args:t}),null}nextGet(e,t){const[r,...s]=t;return n.isString(r)&&0===s.length?this.getByProperty(e,r):(console.error("JsNode.nextGet - wrong parameters",{path:e,args:t}),null)}nextSet(e,t){const[r,s,...o]=t;if(n.isString(r)&&0===o.length)try{return this.wsk[r]=_(s),new F(this.api,this.nodes,void 0)}catch(t){return console.error("A problem with set",{path:e,property:r,error:t}),null}return console.error("JsNode.nextSet - wrong parameters",{path:e,args:t}),null}nextCall(e,t){const[r,...s]=t;if(n.isString(r))try{let e=s.map(_);const t=this.wsk[r](...e);return new F(this.api,this.nodes,t)}catch(t){return console.error("A problem with call",{path:e,property:r,error:t}),null}return console.error("JsNode.nextCall - wrong parameters",{path:e,args:t}),null}nextGetProps(e,t){const r={};for(const s of t){if(!n.isString(s))return console.error("JsNode.nextGetProps - wrong parameters",{path:e,args:t,property:s}),null;{const t=this.getByProperty(e,s);if(null===t)return null;r[s]=t.toValue()}}return new F(this.api,this.nodes,r)}}class R{constructor(e){this.wasm=e}vertigo_entry_function(e,t){this.wasm.exports.vertigo_entry_function(e,t)}static async create(e){let t=null;const r=()=>{if(null===t)throw Error("Wasm is no initialized");return t},s=new V(r);return window.$vertigoApi=s,t=await U(e,{mod:{panic_message:(e,t)=>{const s=new TextDecoder("utf-8"),o=r().getUint8Memory().subarray(e,e+t),n=s.decode(o);console.error("PANIC",n)},dom_access:(e,t)=>{let o=r().decodeArguments(e,t);if(Array.isArray(o)){const e=o;let t=new F(s,s.dom.nodes,null);for(const r of e){const s=t.next(e,r);if(null===s)return 0;t=s}return r().valueSaveToBuffer(t.toValue())}return console.error("dom_access - wrong parameters",o),0}}}),new R(t)}}const O=new Set,C=async()=>{document.querySelectorAll("*[data-vertigo-run-wasm]").forEach((e=>{const t=e.getAttribute("data-vertigo-run-wasm");"string"==typeof t?(async e=>{if(O.has(e))return;if(O.size>0)return void console.error("Only one wasm module can be run",{moduleRun:O,wasm:e});O.add(e),console.info(`Wasm module: "${e}" -> start`);const t=await R.create(e);console.info(`Wasm module: "${e}" -> initialized`),t.vertigo_entry_function(0,6),console.info(`Wasm module: "${e}" -> launched vertigo_entry_function with version 0.6`)})(t):console.error("Run error",e)}))};window.addEventListener("load",C),setTimeout(C,3e3); +"use strict";const e=e=>{throw Error("assert never")},t=new TextDecoder("utf-8"),r=new TextEncoder;class s{constructor(e,t,r){this.getUint8Memory=e,this.ptr=t,this.size=r,this.pointer=0,this.dataView=new DataView(this.getUint8Memory().buffer,this.ptr,this.size)}getByte(){const e=this.dataView.getUint8(this.pointer);return this.pointer+=1,e}setByte(e){this.dataView.setUint8(this.pointer,e),this.pointer+=1}getU16(){const e=this.dataView.getUint16(this.pointer);return this.pointer+=2,e}setU16(e){this.dataView.setUint16(this.pointer,e),this.pointer+=2}getU32(){const e=this.dataView.getUint32(this.pointer);return this.pointer+=4,e}setU32(e){this.dataView.setUint32(this.pointer,e),this.pointer+=4}getI32(){const e=this.dataView.getInt32(this.pointer);return this.pointer+=4,e}setI32(e){this.dataView.setInt32(this.pointer,e),this.pointer+=4}getU64(){const e=this.dataView.getBigUint64(this.pointer);return this.pointer+=8,e}setU64(e){this.dataView.setBigUint64(this.pointer,e),this.pointer+=8}getI64(){const e=this.dataView.getBigInt64(this.pointer);return this.pointer+=8,e}setI64(e){this.dataView.setBigInt64(this.pointer,e),this.pointer+=8}getF64(){const e=this.dataView.getFloat64(this.pointer);return this.pointer+=8,e}setF64(e){this.dataView.setFloat64(this.pointer,e),this.pointer+=8}getBuffer(){const e=this.getU32(),t=this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+e);return this.pointer+=e,t}setBuffer(e){const t=e.length;this.setU32(t);this.getUint8Memory().subarray(this.ptr+this.pointer,this.ptr+this.pointer+t).set(e),this.pointer+=t}getString(){return t.decode(this.getBuffer())}setString(e){const t=r.encode(e);this.setBuffer(t)}getSavedSize(){return this.pointer}}const o=e=>(new TextEncoder).encode(e).length;var n;!function(e){e.isString=e=>"string"==typeof e,e.isStringOrNull=e=>null===e||"string"==typeof e,e.isNumber=e=>"object"==typeof e&&null!==e&&"type"in e&&(e.type===g.I32||e.type===g.U32),e.isBigInt=e=>"object"==typeof e&&null!==e&&"type"in e&&(e.type===g.I64||e.type===g.U64)}(n||(n={}));const i=1,a=2,c=3,l=4,u=5,h=6,d=7,f=e=>{if("boolean"==typeof e)return 1;if(null===e)return 1;if("string"==typeof e)return 5+o(e);if(Array.isArray(e)){let t=5;for(const r of e)t+=f(r);return t}if("number"==typeof e)return 9;let t=3;for(const[r,s]of Object.entries(e))t+=4+o(r),t+=f(s);return t},p=e=>{const t=e.getByte();if(t===i)return!0;if(t===a)return!1;if(t===c)return null;if(t===l)return e.getString();if(t===u)return e.getF64();if(t===h){const t=[],r=e.getU32();for(let s=0;s{if(!0===e)return void t.setByte(i);if(!1===e)return void t.setByte(a);if(null===e)return void t.setByte(c);if("string"==typeof e)return t.setByte(l),void t.setString(e);if("number"==typeof e)return t.setByte(u),void t.setF64(e);if(Array.isArray(e)){t.setByte(h),t.setU32(e.length);for(const r of e)m(r,t);return}const r=[];for(const[t,s]of Object.entries(e))r.push([t,s]);t.setByte(d),t.setU16(r.length);for(const[e,s]of r)t.setString(e),m(s,t)},g={U32:1,I32:2,U64:3,I64:4,F64:5,True:6,False:7,Null:8,Undefined:9,Vec:10,String:11,List:12,Object:13,Json:14},y=e=>{const t=e.getByte();if(t===g.U32)return{type:g.U32,value:e.getU32()};if(t===g.I32)return{type:g.I32,value:e.getI32()};if(t===g.U64)return{type:g.U64,value:e.getU64()};if(t===g.I64)return{type:g.I64,value:e.getI64()};if(t===g.F64)return{type:g.F64,value:e.getF64()};if(t===g.True)return!0;if(t===g.False)return!1;if(t===g.Null)return null;if(t!==g.Undefined){if(t===g.Vec)return e.getBuffer();if(t===g.String)return e.getString();if(t===g.List){const t=[],r=e.getU32();for(let s=0;s{if(!0===t||!1===t||null==t)return 1;if(n.isString(t))return 5+o(t);if(Array.isArray(t)){let e=5;for(const r of t)e+=w(r);return e}if(t instanceof Uint8Array)return 5+t.length;if(t.type===g.I32||t.type===g.U32)return 5;if(t.type===g.I64||t.type===g.U64||t.type==g.F64)return 9;if(t.type===g.Object){let e=3;for(const[r,s]of Object.entries(t.value))e+=4+o(r),e+=w(s);return e}return t.type===g.Json?1+f(t.value):e()},v=(t,r)=>{if(!0!==t)if(!1!==t)if(null!==t)if(void 0!==t){if(t instanceof Uint8Array)return r.setByte(g.Vec),void r.setBuffer(t);if(n.isString(t))return r.setByte(g.String),void r.setString(t);if(Array.isArray(t)){r.setByte(g.List),r.setU32(t.length);for(const e of t)v(e,r)}else{if(t.type===g.U32)return r.setByte(g.U32),void r.setU32(t.value);if(t.type===g.I32)return r.setByte(g.I32),void r.setI32(t.value);if(t.type===g.U64)return r.setByte(g.U64),void r.setU64(t.value);if(t.type===g.I64)return r.setByte(g.I64),void r.setI64(t.value);if(t.type===g.F64)return r.setByte(g.F64),void r.setF64(t.value);if(t.type!==g.Object)return t.type===g.Json?(r.setByte(g.Json),void m(t.value,r)):e();{const e=[];for(const[r,s]of Object.entries(t.value))e.push([r,s]);r.setByte(g.Object),r.setU16(e.length);for(const[t,s]of e)r.setString(t),v(s,r)}}}else r.setByte(g.Undefined);else r.setByte(g.Null);else r.setByte(g.False);else r.setByte(g.True)},_=t=>{if(!0===t)return!0;if(!1===t)return!1;if(null===t)return null;if(void 0!==t){if(t instanceof Uint8Array)return t;if(n.isString(t))return t;if(Array.isArray(t)){const e=[];for(const r of t)e.push(_(r));return e}if(t.type===g.U32||t.type===g.I32)return t.value;if(t.type===g.U64||t.type===g.I64||t.type===g.F64)return t.value;if(t.type===g.Object){const e={};for(const[r,s]of Object.entries(t.value))e[r]=_(s);return e}return t.type===g.Json?t.value:e()}},b=e=>{if("string"==typeof e)return e;if(!0===e||!1===e||null==e)return e;if("number"==typeof e)return e===(0|e)?-(2**31)<=e&&e<2**31?{type:g.I32,value:e}:{type:g.I64,value:BigInt(e)}:{type:g.F64,value:e};if("bigint"==typeof e)return{type:g.I64,value:e};if(e instanceof Uint8Array)return e;if("object"==typeof e){try{const t=k(e);return{type:g.Json,value:t}}catch(e){}const t={};for(const[r,s]of Object.entries(e))t[r]=b(s);return{type:g.Object,value:t}}if(Array.isArray(e))try{const t=e.map(k);return{type:g.Json,value:t}}catch(t){return e.map(b)}throw console.warn("convertToJsValue",e),Error("It is not possible to convert this data to JsValue")},k=e=>{if("boolean"==typeof e||null===e||"number"==typeof e||"string"==typeof e)return e;if(Array.isArray(e))return e.map(k);if("object"==typeof e){const t={};for(const[r,s]of Object.entries(e))t[r]=k(s);return t}throw console.warn("convertToJsJson",e),Error("It is not possible to convert this data to JsJson")},U=async(e,t)=>{const r=await(async(e,t)=>{if("function"==typeof WebAssembly.instantiateStreaming){const r=fetch(e);try{return await WebAssembly.instantiateStreaming(r,t)}catch(e){console.warn("`WebAssembly.instantiateStreaming` failed. This could happen if your server does not serve wasm with `application/wasm` MIME type, but check the original error too. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}}console.info("fetchModule by WebAssembly.instantiate");const r=await fetch(e),s=await r.arrayBuffer();return await WebAssembly.instantiate(s,t)})(e,t);let o=new Uint8Array(1);const n=()=>{if(r.instance.exports.memory instanceof WebAssembly.Memory)return o.buffer!==r.instance.exports.memory.buffer&&(o=new Uint8Array(r.instance.exports.memory.buffer)),o;throw Error("Missing memory")},i=r.instance.exports,a=(e,t)=>((e,t,r)=>{try{const o=new s(e,t,r);return y(o)}catch(e){return console.error(e),[]}})(n,e,t),c=e=>((e,t,r)=>{if(void 0===r)return 0;const o=w(r),n=t(o),i=new s(e,n,o);if(v(r,i),o!==i.getSavedSize())throw console.error({size:o,savedSize:i.getSavedSize()}),Error("Mismatch between calculated and recorded size");return n})(n,i.alloc,e);return{exports:i,decodeArguments:a,getUint8Memory:n,wasm_callback:(e,t)=>{const r=c(t);let s=i.wasm_callback(e,r);if(0n===s)return;const o=s%2n**32n,n=s>>32n;n>=2n**32n&&console.error(`Overflow of a variable with a pointer result_ptr_and_size=${s}`);const l=a(Number(n),Number(o));return i.free(Number(n)),l},valueSaveToBuffer:c}};class x{constructor(){this.get=e=>{for(const t of document.cookie.split(";")){if(""===t)continue;const r=t.trim().split("=");if(2!==r.length){console.warn(`Cookies.get: Incorrect number of cookieChunk => ${r.length} in ${t}`);continue}const s=r[0],o=r[1];if(void 0!==s&&void 0!==o){if(s===e)return decodeURIComponent(o)}else console.warn(`Cookies.get: Broken cookie part => ${t}`)}return""},this.get_json=e=>{let t=this.get(e);if(0!==t.length)try{return JSON.parse(t)}catch(e){console.error("Error deserializing cookie",e)}return null},this.set=(e,t,r)=>{const s=null==t?"":encodeURIComponent(t),o=new Date;o.setTime(o.getTime()+1e3*Number(r));let n="expires="+o.toUTCString();document.cookie=`${e}=${s};${n};path=/;samesite=strict"`},this.set_json=(e,t,r)=>{let s=JSON.stringify(t);this.set(e,s,r)}}}class E{constructor(e){this.interval_set=(e,t)=>setInterval((()=>{this.getWasm().wasm_callback(t,void 0)}),e),this.interval_clear=e=>{clearInterval(e)},this.timeout_set=(e,t)=>setTimeout((()=>{this.getWasm().wasm_callback(t,void 0)}),e),this.timeout_clear=e=>{clearTimeout(e)},this.getWasm=e}}class A{constructor(e){this.trigger=()=>{for(const e of Array.from(this.callback.values()))e()},this.add=e=>{this.callback.set(e,(()=>{this.getWasm().wasm_callback(e,this.get())}))},this.remove=e=>{this.callback.delete(e)},this.push=e=>{this.get()!==e&&(location.hash=e,this.trigger())},this.getWasm=e,this.callback=new Map,window.addEventListener("hashchange",this.trigger)}get(){return decodeURIComponent(location.hash.substr(1))}}const S=async(e,t,r,s)=>{try{await s(r)}catch(s){console.error("fetch error (2) - json",s);const o=new String(s).toString();e.wasm_callback(t,[!1,{type:g.U32,value:r.status},o])}};class B{constructor(e){this.fetch_send_request=(e,t,r,s,o)=>{this.fetch_send_request_inner(e,t,r,s,o)},this.fetch_send_request_inner=async(e,t,r,s,o)=>{const n=this.getWasm(),[i,a]=((e,t)=>{const r=new Headers(e);return void 0===t?[r,void 0]:"string"==typeof t?(!1===r.has("content-type")&&r.set("content-type","text/plain; charset=utf-8"),[r,t]):t instanceof Uint8Array?(!1===r.has("content-type")&&r.set("content-type","application/octet-stream"),[r,t]):(!1===r.has("content-type")&&r.set("content-type","application/json; charset=utf-8"),[r,JSON.stringify(t)])})(s,o);try{const s=await fetch(r,{method:t,headers:i,body:a}),o=(e=>{if(null===e)return console.info("Missing header content-type"),"bin";const[t]=e.split(";");if(void 0===t)return console.error("Missing value for content-type"),"bin";const r=t.toLowerCase().trim();return"application/json"===r?"json":"text/plain"===r?"text":(console.error(`No match found for content-type=${e}`),"bin")})(s.headers.get("content-type"));if("json"===o)return void S(n,e,s,(async t=>{const r=await t.json();n.wasm_callback(e,[!0,{type:g.U32,value:t.status},{type:g.Json,value:r}])}));if("text"===o)return void S(n,e,s,(async t=>{const r=await t.text();n.wasm_callback(e,[!0,{type:g.U32,value:t.status},r])}));S(n,e,s,(async t=>{const r=await t.arrayBuffer(),s=new Uint8Array(r);n.wasm_callback(e,[!0,{type:g.U32,value:t.status},s])}))}catch(t){console.error("fetch error (1)",t);const r=new String(t).toString();n.wasm_callback(e,[!1,{type:g.U32,value:0},r])}},this.getWasm=e}}class I{constructor(){this.events=new Set}on(e){let t=!0;const r=r=>{t&&e(r)};return this.events.add(r),()=>{t=!1,this.events.delete(r)}}trigger(e){const t=Array.from(this.events.values());for(const r of t)try{r(e)}catch(e){console.error(e)}}get size(){return this.events.size}}class L{constructor(){this.promiseResolveReject=null,this.resolve=e=>{const t=this.promiseResolveReject;this.promiseResolveReject=null,null!==t&&t.resolve(e)},this.reject=e=>{const t=this.promiseResolveReject;this.promiseResolveReject=null,null!==t&&t.reject(e)},this.isFulfilled=()=>null===this.promiseResolveReject;const[e,t]=(()=>{let e=null,t=null;const r=new Promise(((r,s)=>{e=r,t=s}));if(null===e)throw Error("createPromiseValue - resolve is null");if(null===t)throw Error("createPromiseValue - reject is null");return[{resolve:e,reject:t},r]})();this.promiseResolveReject=e,this.promise=t}}const T=async(e,t)=>{console.info(`${e} wait ${t}ms`),await(async e=>new Promise((t=>{setTimeout(t,e)})))(t),console.info(`${e} go forth`)};class W{constructor(e){this.host=e,this.formatLog=e=>`Socket ${this.host} ==> ${e}`}}class ${constructor(e,t){this.eventMessage=new I,this.close=e,this.send=t}static connect(e,t,r){const s=new L,o=new L,n=new WebSocket(t);let i=!1;console.info(e.formatLog("starting ..."));const a=()=>{i||(console.info(e.formatLog("close")),i=!0,s.resolve(null),o.resolve(),n.close())},c=new $(a,(e=>{i||n.send(e)}));setTimeout((()=>{!1===s.isFulfilled()&&(console.error(e.formatLog(`timeout (${r}ms)`)),a())}),r);return n.addEventListener("open",(()=>{console.info(e.formatLog("open")),s.resolve(c)})),n.addEventListener("error",(t=>{console.error(e.formatLog("error"),t),a()})),n.addEventListener("close",a),n.addEventListener("message",(t=>{if(i)return;const r=t.data;"string"!=typeof r?console.error(e.formatLog("onMessage - expected string"),r):c.eventMessage.trigger(r)})),{socket:s.promise,done:o.promise}}static startSocket(e,t,r,s){let o=!0,n=null;const i=new W(e);return(async()=>{for(;o;){const a=$.connect(i,e,t),c=await a.socket;if(null!==c){if(n=c,s({type:"socket",socket:c}),c.eventMessage.on((e=>{s({type:"message",message:e})})),await a.done,s({type:"close"}),!o)return void console.info(i.formatLog("disconnect (1)"));await T(i.formatLog("reconnect after close"),r)}else await T(i.formatLog("reconnect after error"),r)}console.info(i.formatLog("disconnect (2)"))})().catch((e=>{console.error(e)})),{send:e=>{null===n?console.error("send fail - missing connection",e):n.send(e)},dispose:()=>{o=!1,n?.close()}}}}class j{constructor(e){this.websocket_register_callback=(e,t)=>{const r=this.getWasm();let s=$.startSocket(e,5e3,3e3,(e=>{if(!1!==this.controllerList.has(t)){if("socket"===e.type)return this.socket.set(t,e.socket),void r.wasm_callback(t,!0);if("message"!==e.type)return"close"===e.type?(this.socket.delete(t),void r.wasm_callback(t,!1)):(e=>{throw console.error(e),Error("unknown message")})(e);r.wasm_callback(t,e.message)}}));this.controllerList.set(t,s)},this.websocket_unregister_callback=e=>{const t=this.controllerList.get(e);void 0!==t?(t.dispose(),this.controllerList.delete(e)):console.error("Expected controller")},this.websocket_send_message=(e,t)=>{const r=this.socket.get(e);void 0===r?console.error(`Missing socket connection for callback_id=${e}`):r.send(t)},this.getWasm=e,this.controllerList=new Map,this.socket=new Map}}class M{constructor(){this.data=new Map}get_root_html(){return document.documentElement}get_root_head(){return document.head}get_root_body(){return document.body}set(e,t){1===e||2===e||3===e||this.data.set(e,t)}get_any_option(e){return 1===e?this.get_root_html():2===e?this.get_root_head():3===e?this.get_root_body():this.data.get(e)}get_any(e,t){const r=this.get_any_option(t);if(void 0===r)throw Error(`${e} -> item not found=${t}`);return r}get(e,t){const r=this.get_any_option(t);if(void 0===r)throw new Error(`${e}->get: Item id not found = ${t}`);return r}get_node_element(e,t){const r=this.get(e,t);if(r instanceof HTMLElement)return r;throw Error(`Expected id=${t} as HTMLElement`)}get_node(e,t){const r=this.get(e,t);if(r instanceof Element)return r;throw Error(`Expected id=${t} as Element`)}get_text(e,t){const r=this.get(e,t);if(r instanceof Text)return r;throw Error(`Expected id=${t} as Text`)}get_comment(e,t){const r=this.get(e,t);if(r instanceof Comment)return r;throw Error(`Expected id=${t} as Comment`)}delete(e,t){const r=this.get_any_option(t);if(this.data.delete(t),void 0===r)throw new Error(`${e}->delete: Item id not found = ${t}`);return r}}class N{constructor(e,t){this.get_node_to_clear=e=>{const t=[];return e.childNodes.forEach((e=>{t.push(e)})),t},this.get_to_clear=()=>!0===this.initBeforeFirstUpdate?[[],[]]:(this.initBeforeFirstUpdate=!0,[this.get_node_to_clear(this.nodes.get_root_head()),this.get_node_to_clear(this.nodes.get_root_body())]),this.dom_bulk_update=e=>{const[t,r]=this.get_to_clear(),s=new Set;for(const t of e){try{this.bulk_update_command(t)}catch(e){console.error("bulk_update - item",e,t)}"set_attr"===t.type&&"autofocus"===t.name.toLocaleLowerCase()&&s.add(t.id)}s.size>0&&setTimeout((()=>{for(const e of s){this.nodes.get_node_element(`set focus ${e}`,e).focus()}}),0);for(const e of r)e.remove();for(const e of t)e.remove()},this.historyLocation=e,this.getWasm=t,this.nodes=new M,this.callbacks=new Map,this.initBeforeFirstUpdate=!1,document.addEventListener("dragover",(e=>{e.preventDefault()}))}debugNodes(...e){const t={};for(const r of e){const e=this.nodes.get_any_option(r);t[r]=e}console.info("debug nodes",t)}create_node(e,t){const r=(e=>"path"==e||"svg"==e?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e))(t);this.nodes.set(e,r),"a"===t.toLowerCase().trim()&&r.addEventListener("click",(e=>{let t=r.getAttribute("href");null!==t&&(t.startsWith("#")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||(e.preventDefault(),this.historyLocation.push(t),window.scrollTo(0,0)))}))}set_attribute(e,t,r){const s=this.nodes.get_node("set_attribute",e);if(s.setAttribute(t,r),"value"==t){if(s instanceof HTMLInputElement)return void(s.value=r);if(s instanceof HTMLTextAreaElement)return s.value=r,void(s.defaultValue=r)}}remove_attribute(e,t){const r=this.nodes.get_node("remove_attribute",e);if(r.removeAttribute(t),"value"==t){if(r instanceof HTMLInputElement)return void(r.value="");if(r instanceof HTMLTextAreaElement)return r.value="",void(r.defaultValue="")}}remove_node(e){this.nodes.delete("remove_node",e).remove()}create_text(e,t){const r=document.createTextNode(t);this.nodes.set(e,r)}remove_text(e){this.nodes.delete("remove_node",e).remove()}update_text(e,t){this.nodes.get_text("set_attribute",e).textContent=t}insert_before(e,t,r){const s=this.nodes.get("insert_before",e),o=this.nodes.get_any("insert_before child",t);if(null==r)s.insertBefore(o,null);else{const e=this.nodes.get_any("insert_before ref",r);s.insertBefore(o,e)}}insert_css(e,t){const r=document.createElement("style"),s=document.createTextNode(`${e} { ${t} }`);r.appendChild(s),this.nodes.get_root_head().appendChild(r)}callback_click(e,t){e.preventDefault(),this.getWasm().wasm_callback(t,void 0)}callback_input(e,t){const r=e.target;r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement?this.getWasm().wasm_callback(t,r.value):console.warn("event input ignore",r)}callback_change(e,t){const r=e.target;r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement?this.getWasm().wasm_callback(t,r.value):console.warn("event input ignore",r)}callback_blur(e,t){this.getWasm().wasm_callback(t,void 0)}callback_mousedown(e,t){this.getWasm().wasm_callback(t,void 0)&&e.preventDefault()}callback_mouseup(e,t){this.getWasm().wasm_callback(t,void 0)&&e.preventDefault()}callback_mouseenter(e,t){this.getWasm().wasm_callback(t,void 0)}callback_mouseleave(e,t){this.getWasm().wasm_callback(t,void 0)}callback_drop(e,t){if(e.preventDefault(),e instanceof DragEvent)if(null===e.dataTransfer)console.error("dom -> drop -> dataTransfer null");else{const r=[];for(let t=0;t drop -> item - undefined");else{const e=s.getAsFile();null===e?console.error(`dom -> drop -> index:${t} -> It's not a file`):r.push(e.arrayBuffer().then((t=>({name:e.name,data:new Uint8Array(t)}))))}}r.length?Promise.all(r).then((e=>{const r=[];for(const t of e)r.push([t.name,t.data]);this.getWasm().wasm_callback(t,[r])})).catch((e=>{console.error("callback_drop -> promise.all -> ",e)})):console.error("No files to send")}else console.warn("event drop ignore",e)}callback_keydown(e,t){if(e instanceof KeyboardEvent){!0===this.getWasm().wasm_callback(t,[e.key,e.code,e.altKey,e.ctrlKey,e.shiftKey,e.metaKey])&&(e.preventDefault(),e.stopPropagation())}else console.warn("keydown ignore",e)}callback_load(e,t){e.preventDefault(),this.getWasm().wasm_callback(t,void 0)}callback_add(e,t,r){const s=e=>"click"===t?this.callback_click(e,r):"input"===t?this.callback_input(e,r):"change"===t?this.callback_change(e,r):"blur"===t?this.callback_blur(e,r):"mousedown"===t?this.callback_mousedown(e,r):"mouseup"===t?this.callback_mouseup(e,r):"mouseenter"===t?this.callback_mouseenter(e,r):"mouseleave"===t?this.callback_mouseleave(e,r):"keydown"===t||"hook_keydown"===t?this.callback_keydown(e,r):"drop"===t?this.callback_drop(e,r):"load"===t?this.callback_load(e,r):void console.error(`No support for the event ${t}`);if(this.callbacks.has(r))console.error(`There was already a callback added with the callback_id=${r}`);else if(this.callbacks.set(r,s),"hook_keydown"===t)document.addEventListener("keydown",s,!1);else{this.nodes.get("callback_add",e).addEventListener(t,s,!1)}}callback_remove(e,t,r){const s=this.callbacks.get(r);if(this.callbacks.delete(r),void 0!==s)if("hook_keydown"===t)document.removeEventListener("keydown",s);else{this.nodes.get("callback_remove",e).removeEventListener(t,s)}else console.error(`The callback is missing with the id=${r}`)}bulk_update_command(e){if("remove_node"!==e.type)if("insert_before"!==e.type)if("create_node"!==e.type)if("create_text"!==e.type)if("update_text"!==e.type)if("set_attr"!==e.type)if("remove_attr"!==e.type)if("remove_text"!==e.type)if("insert_css"!==e.type)if("create_comment"!==e.type)if("remove_comment"!==e.type)if("callback_add"!==e.type){if("callback_remove"!==e.type)return(e=>{throw console.error(e),Error("unknown command")})(e);this.callback_remove(e.id,e.event_name,BigInt(e.callback_id))}else this.callback_add(e.id,e.event_name,BigInt(e.callback_id));else{this.nodes.delete("remove_comment",e.id).remove()}else{const t=document.createComment(e.value);this.nodes.set(e.id,t)}else this.insert_css(e.selector,e.value);else this.remove_text(e.id);else this.remove_attribute(e.id,e.name);else this.set_attribute(e.id,e.name,e.value);else this.update_text(e.id,e.value);else this.create_text(e.id,e.value);else this.create_node(e.id,e.name);else this.insert_before(e.parent,e.child,null===e.ref_id?null:e.ref_id);else this.remove_node(e.id)}}class J{constructor(e){this.trigger=()=>{for(const e of Array.from(this.callback.values()))e()},this.add=e=>{this.callback.set(e,(()=>{this.getWasm().wasm_callback(e,this.get())}))},this.remove=e=>{this.callback.delete(e)},this.push=e=>{this.get()!==e&&(window.history.pushState(null,"",e),this.trigger())},this.replace=e=>{this.get()!==e&&(window.history.replaceState(null,"",e),this.trigger())},this.getWasm=e,this.callback=new Map,window.addEventListener("popstate",this.trigger)}get(){return window.location.pathname+window.location.search+window.location.hash}}class V{constructor(e){this.getRandom=(e,t)=>{const r=t-e+1;return e+Math.floor(Math.random()*r)},this.isBrowser=()=>!0,this.get_env=e=>document.documentElement.getAttribute(`data-env-${e}`),this.getTimezoneOffset=()=>(new Date).getTimezoneOffset(),this.cookie=new x,this.interval=new E(e),this.hashRouter=new A(e),this.historyLocation=new J(e),this.fetch=new B(e),this.websocket=new j(e),this.dom=new N(this.historyLocation,e)}}class F{constructor(e,t,r){this.api=e,this.nodes=t,this.wsk=r}getByProperty(e,t){try{const e=this.wsk[t];return new F(this.api,this.nodes,e)}catch(r){return console.error("A problem with get",{path:e,property:t,error:r}),null}}toValue(){return b(this.wsk)}next(e,t){if(Array.isArray(t)){const[r,...s]=t;return"api"===r?this.nextApi(e,s):"root"===r?this.nextRoot(e,s):"get"===r?this.nextGet(e,s):"set"===r?this.nextSet(e,s):"call"===r?this.nextCall(e,s):"get_props"===r?this.nextGetProps(e,s):(console.error("JsNode.next - wrong commandName",r),null)}return console.error("JsNode.next - array was expected",{path:e,command:t}),null}nextApi(e,t){return 0===t.length?new F(this.api,this.nodes,this.api):(console.error("nextApi: wrong parameter",{path:e,args:t}),null)}nextRoot(e,t){const[r,...s]=t;if(n.isString(r)&&0===s.length)return"window"===r?new F(this.api,this.nodes,window):"document"===r?new F(this.api,this.nodes,document):(console.error(`JsNode.nextRoot: Global name not found -> ${r}`,{path:e,args:t}),null);if(n.isNumber(r)&&0===s.length){const s=r.value,o=this.nodes.get_any_option(s);return void 0!==o?new F(this.api,this.nodes,o):(console.error(`JsNode.nextRoot: No node with id=${s}`,{path:e,args:t}),null)}return console.error("JsNode.nextRoot: wrong parameter",{path:e,args:t}),null}nextGet(e,t){const[r,...s]=t;return n.isString(r)&&0===s.length?this.getByProperty(e,r):(console.error("JsNode.nextGet - wrong parameters",{path:e,args:t}),null)}nextSet(e,t){const[r,s,...o]=t;if(n.isString(r)&&0===o.length)try{return this.wsk[r]=_(s),new F(this.api,this.nodes,void 0)}catch(t){return console.error("A problem with set",{path:e,property:r,error:t}),null}return console.error("JsNode.nextSet - wrong parameters",{path:e,args:t}),null}nextCall(e,t){const[r,...s]=t;if(n.isString(r))try{let e=s.map(_);const t=this.wsk[r](...e);return new F(this.api,this.nodes,t)}catch(t){return console.error("A problem with call",{path:e,property:r,error:t}),null}return console.error("JsNode.nextCall - wrong parameters",{path:e,args:t}),null}nextGetProps(e,t){const r={};for(const s of t){if(!n.isString(s))return console.error("JsNode.nextGetProps - wrong parameters",{path:e,args:t,property:s}),null;{const t=this.getByProperty(e,s);if(null===t)return null;r[s]=t.toValue()}}return new F(this.api,this.nodes,r)}}class R{constructor(e){this.wasm=e}vertigo_entry_function(e,t){this.wasm.exports.vertigo_entry_function(e,t)}static async create(e){let t=null;const r=()=>{if(null===t)throw Error("Wasm is no initialized");return t},s=new V(r);return window.$vertigoApi=s,t=await U(e,{mod:{panic_message:(e,t)=>{const s=new TextDecoder("utf-8"),o=r().getUint8Memory().subarray(e,e+t),n=s.decode(o);console.error("PANIC",n)},dom_access:(e,t)=>{let o=r().decodeArguments(e,t);if(Array.isArray(o)){const e=o;let t=new F(s,s.dom.nodes,null);for(const r of e){const s=t.next(e,r);if(null===s)return 0;t=s}return r().valueSaveToBuffer(t.toValue())}return console.error("dom_access - wrong parameters",o),0}}}),new R(t)}}const O=new Set,C=async()=>{document.querySelectorAll("*[data-vertigo-run-wasm]").forEach((e=>{const t=e.getAttribute("data-vertigo-run-wasm");"string"==typeof t?(async e=>{if(O.has(e))return;if(O.size>0)return void console.error("Only one wasm module can be run",{moduleRun:O,wasm:e});O.add(e),console.info(`Wasm module: "${e}" -> start`);const t=await R.create(e);console.info(`Wasm module: "${e}" -> initialized`),t.vertigo_entry_function(0,6),console.info(`Wasm module: "${e}" -> launched vertigo_entry_function with version 0.6`)})(t):console.error("Run error",e)}))};window.addEventListener("load",C),setTimeout(C,3e3); //# sourceMappingURL=wasm_run.js.map diff --git a/crates/vertigo/src/driver_module/wasm_run.js.map b/crates/vertigo/src/driver_module/wasm_run.js.map index f9ebb393..5b1b1eeb 100644 --- a/crates/vertigo/src/driver_module/wasm_run.js.map +++ b/crates/vertigo/src/driver_module/wasm_run.js.map @@ -1 +1 @@ -{"version":3,"file":"wasm_run.js","sources":["src_js/assert_never.ts","src_js/buffer_cursor.ts","src_js/guard.ts","src_js/jsjson.ts","src_js/jsvalue.ts","src_js/wasm_init.ts","src_js/api_browser/cookies.ts","src_js/api_browser/interval.ts","src_js/api_browser/hashrouter.ts","src_js/api_browser/fetch.ts","src_js/api_browser/websocket/event_emiter.ts","src_js/api_browser/websocket/promise.ts","src_js/api_browser/websocket/connection.ts","src_js/api_browser/websocket/websocket.ts","src_js/api_browser/dom/map_nodes.ts","src_js/api_browser/dom/dom.ts","src_js/api_browser/historyLocation.ts","src_js/api_browser.ts","src_js/js_node.ts","src_js/wasm_module.ts","src_js/index.ts"],"sourcesContent":["\nexport const assertNever = (_value: never) => {\n throw Error(\"assert never\");\n}\n","///https://javascript.info/arraybuffer-binary-arrays#dataview\n\nconst decoder = new TextDecoder(\"utf-8\");\nconst encoder = new TextEncoder();\n\nexport class BufferCursor {\n private dataView: DataView;\n private pointer: number = 0;\n\n constructor(\n private getUint8Memory: () => Uint8Array,\n private ptr: number,\n private size: number,\n ) {\n this.dataView = new DataView(\n this.getUint8Memory().buffer,\n this.ptr,\n this.size\n );\n }\n\n public getByte(): number {\n const value = this.dataView.getUint8(this.pointer);\n this.pointer += 1;\n return value;\n }\n\n public setByte(byte: number) {\n this.dataView.setUint8(this.pointer, byte);\n this.pointer += 1;\n }\n\n public getU16(): number {\n const value = this.dataView.getUint16(this.pointer);\n this.pointer += 2;\n return value;\n }\n\n public setU16(value: number) {\n this.dataView.setUint16(this.pointer, value);\n this.pointer += 2;\n }\n\n public getU32(): number {\n const value = this.dataView.getUint32(this.pointer);\n this.pointer += 4;\n return value;\n }\n\n public setU32(value: number) {\n this.dataView.setUint32(this.pointer, value);\n this.pointer += 4;\n }\n\n public getI32(): number {\n const value = this.dataView.getInt32(this.pointer);\n this.pointer += 4;\n return value;\n }\n\n public setI32(value: number) {\n this.dataView.setInt32(this.pointer, value);\n this.pointer += 4;\n }\n\n public getU64(): bigint {\n const value = this.dataView.getBigUint64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setU64(value: bigint) {\n this.dataView.setBigUint64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getI64(): bigint {\n const value = this.dataView.getBigInt64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setI64(value: bigint) {\n this.dataView.setBigInt64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getF64(): number {\n const value = this.dataView.getFloat64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setF64(value: number) {\n this.dataView.setFloat64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getBuffer(): Uint8Array {\n const size = this.getU32();\n const result = this\n .getUint8Memory()\n .subarray(\n this.ptr + this.pointer,\n this.ptr + this.pointer + size\n );\n\n this.pointer += size;\n return result;\n }\n\n public setBuffer(buffer: Uint8Array) {\n const size = buffer.length;\n this.setU32(size);\n\n const sub_buffer = this\n .getUint8Memory()\n .subarray(\n this.ptr + this.pointer,\n this.ptr + this.pointer + size\n );\n\n sub_buffer.set(buffer);\n\n this.pointer += size;\n }\n\n public getString(): string {\n return decoder.decode(this.getBuffer());\n }\n\n public setString(value: string) {\n const buffer = encoder.encode(value);\n this.setBuffer(buffer);\n }\n\n public getSavedSize(): number {\n return this.pointer;\n }\n}\n\nexport const getStringSize = (value: string): number => {\n return new TextEncoder().encode(value).length;\n};\n\n","import { JsValueType, JsValueConst } from \"./jsvalue\";\n\nexport namespace GuardJsValue {\n export const isString = (value: JsValueType): value is string => {\n return typeof value === 'string';\n }\n\n export const isStringOrNull = (value: JsValueType): value is string | null => {\n return value === null || typeof value === 'string';\n }\n\n export const isNumber = (value: JsValueType): value is { type: typeof JsValueConst.U32, value: number } | { type: typeof JsValueConst.I32, value: number } => {\n if (typeof value === 'object' && value !== null && 'type' in value) {\n return value.type === JsValueConst.I32 || value.type === JsValueConst.U32\n }\n\n return false;\n }\n\n export const isBigInt = (value: JsValueType): value is { type: typeof JsValueConst.U64, value: bigint } | { type: typeof JsValueConst.I64, value: bigint } => {\n if (typeof value === 'object' && value !== null && 'type' in value) {\n return value.type === JsValueConst.I64 || value.type === JsValueConst.U64\n }\n\n return false;\n }\n}\n","import { BufferCursor, getStringSize } from \"./buffer_cursor\";\n\nconst JsJsonConst = {\n True: 1,\n False: 2,\n Null: 3,\n\n String: 4,\n Number: 5,\n List: 6,\n Object: 7,\n} as const;\n\nexport type JsJsonType\n = boolean\n | null\n | number\n | string\n | Array\n | JsJsonMapType;\n\ninterface JsJsonMapType {\n [key: string]: JsJsonType\n}\n\nexport const jsJsonGetSize = (value: JsJsonType): number => {\n\n if (typeof value === 'boolean') {\n return 1;\n }\n\n if (value === null) {\n return 1;\n }\n\n if (typeof value === 'string') {\n return 1 + 4 + getStringSize(value);\n }\n\n if (Array.isArray(value)) {\n let sum = 1 + 4;\n\n for (const item of value) {\n sum += jsJsonGetSize(item);\n }\n\n return sum;\n }\n\n if (typeof value === 'number') {\n return 9; //1 + 8\n }\n\n //object\n let sum = 1 + 2;\n\n for (const [key, propertyValue] of Object.entries(value)) {\n sum += 4 + getStringSize(key);\n sum += jsJsonGetSize(propertyValue);\n }\n\n return sum;\n};\n\nexport const jsJsonDecodeItem = (cursor: BufferCursor): JsJsonType => {\n const typeParam = cursor.getByte();\n\n if (typeParam === JsJsonConst.True) {\n return true;\n }\n\n if (typeParam === JsJsonConst.False) {\n return false;\n }\n\n if (typeParam === JsJsonConst.Null) {\n return null;\n }\n\n if (typeParam === JsJsonConst.String) {\n return cursor.getString();\n }\n\n if (typeParam === JsJsonConst.Number) {\n return cursor.getF64();\n }\n\n if (typeParam === JsJsonConst.List) {\n const out: Array = [];\n\n const listSize = cursor.getU32();\n\n for (let i=0; i = {};\n\n const listSize = cursor.getU16();\n\n for (let i=0; i {\n if (value === true) {\n cursor.setByte(JsJsonConst.True);\n return;\n }\n\n if (value === false) {\n cursor.setByte(JsJsonConst.False);\n return;\n }\n\n if (value === null) {\n cursor.setByte(JsJsonConst.Null);\n return;\n }\n\n if (typeof value === 'string') {\n cursor.setByte(JsJsonConst.String);\n cursor.setString(value);\n return;\n }\n\n if (typeof value === 'number') {\n cursor.setByte(JsJsonConst.Number);\n cursor.setF64(value);\n return;\n }\n\n if (Array.isArray(value)) {\n cursor.setByte(JsJsonConst.List);\n cursor.setU32(value.length);\n\n for (const item of value) {\n saveJsJsonToBufferItem(item, cursor);\n }\n\n return;\n }\n\n //object\n const list: Array<[string, JsJsonType]> = [];\n\n for (const [key, propertyValue] of Object.entries(value)) {\n list.push([key, propertyValue]);\n }\n\n cursor.setByte(JsJsonConst.Object);\n cursor.setU16(list.length);\n\n for (const [key, propertyValue] of list) {\n cursor.setString(key);\n saveJsJsonToBufferItem(propertyValue, cursor);\n }\n};\n","import { assertNever } from \"./assert_never\";\nimport { BufferCursor, getStringSize } from \"./buffer_cursor\";\nimport { GuardJsValue } from \"./guard\";\nimport { jsJsonDecodeItem, jsJsonGetSize, JsJsonType, saveJsJsonToBufferItem } from \"./jsjson\";\n\nexport const JsValueConst = {\n U32: 1,\n I32: 2,\n U64: 3,\n I64: 4,\n F64: 5,\n\n True: 6,\n False: 7,\n Null: 8,\n Undefined: 9,\n\n Vec: 10,\n String: 11,\n List: 12,\n Object: 13,\n Json: 14,\n} as const;\n\nexport type JsValueType\n = { type: typeof JsValueConst.U32, value: number, }\n | { type: typeof JsValueConst.I32, value: number, }\n | { type: typeof JsValueConst.U64, value: bigint, }\n | { type: typeof JsValueConst.I64, value: bigint, }\n | { type: typeof JsValueConst.F64, value: number, }\n | boolean\n | null\n | undefined\n | string\n | Array\n | Uint8Array\n | { type: typeof JsValueConst.Object, value: JsValueMapType }\n | { type: typeof JsValueConst.Json, value: JsJsonType };\n\ninterface JsValueMapType {\n [key: string]: JsValueType\n}\n\n//https://github.com/unsplash/unsplash-js/pull/174\n// export type AnyJson = boolean | number | string | null | JsonArray | JsonMap;\n// export interface JsonMap { [key: string]: AnyJson }\n// export interface JsonArray extends Array {}\n\n\nconst jsValueDecodeItem = (cursor: BufferCursor): JsValueType => {\n const typeParam = cursor.getByte();\n\n if (typeParam === JsValueConst.U32) {\n return {\n type: JsValueConst.U32,\n value: cursor.getU32()\n };\n }\n\n if (typeParam === JsValueConst.I32) {\n return {\n type: JsValueConst.I32,\n value: cursor.getI32()\n };\n }\n\n if (typeParam === JsValueConst.U64) {\n return {\n type: JsValueConst.U64,\n value: cursor.getU64()\n };\n }\n\n if (typeParam === JsValueConst.I64) {\n return {\n type: JsValueConst.I64,\n value: cursor.getI64()\n };\n }\n\n if (typeParam === JsValueConst.F64) {\n return {\n type: JsValueConst.F64,\n value: cursor.getF64()\n };\n }\n\n if (typeParam === JsValueConst.True) {\n return true;\n }\n\n if (typeParam === JsValueConst.False) {\n return false;\n }\n\n if (typeParam === JsValueConst.Null) {\n return null;\n }\n\n if (typeParam === JsValueConst.Undefined) {\n return undefined;\n }\n\n if (typeParam === JsValueConst.Vec) {\n return cursor.getBuffer();\n }\n\n if (typeParam === JsValueConst.String) {\n return cursor.getString();\n }\n\n if (typeParam === JsValueConst.List) {\n const out: Array = [];\n\n const listSize = cursor.getU32();\n\n for (let i=0; i = {};\n\n const listSize = cursor.getU16();\n\n for (let i=0; i Uint8Array, ptr: number, size: number): JsValueType => {\n try {\n const cursor = new BufferCursor(getUint8Memory, ptr, size);\n return jsValueDecodeItem(cursor);\n } catch (err) {\n console.error(err);\n return [];\n }\n};\n\nconst getSize = (value: JsValueType): number => {\n if (\n value === true ||\n value === false ||\n value === null ||\n value === undefined\n ) {\n return 1;\n }\n\n if (GuardJsValue.isString(value)) {\n return 1 + 4 + getStringSize(value);\n }\n\n if (Array.isArray(value)) {\n let sum = 1 + 4;\n\n for (const item of value) {\n sum += getSize(item);\n }\n\n return sum;\n }\n\n if (value instanceof Uint8Array) {\n return 1 + 4 + value.length;\n }\n\n if (value.type === JsValueConst.I32 || value.type === JsValueConst.U32) {\n return 5; // 1 + 4\n }\n\n if (value.type === JsValueConst.I64 || value.type === JsValueConst.U64 || value.type == JsValueConst.F64) {\n return 9; // 1 + 8\n }\n\n if (value.type === JsValueConst.Object) {\n let sum = 1 + 2;\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n sum += 4 + getStringSize(key);\n sum += getSize(propertyValue);\n }\n\n return sum;\n }\n\n if (value.type === JsValueConst.Json) {\n return 1 + jsJsonGetSize(value.value);\n }\n\n return assertNever(value);\n};\n\nconst saveToBufferItem = (value: JsValueType, cursor: BufferCursor) => {\n if (value === true) {\n cursor.setByte(JsValueConst.True);\n return;\n }\n\n if (value === false) {\n cursor.setByte(JsValueConst.False);\n return;\n }\n\n if (value === null) {\n cursor.setByte(JsValueConst.Null);\n return;\n }\n\n if (value === undefined) {\n cursor.setByte(JsValueConst.Undefined);\n return;\n }\n\n if (value instanceof Uint8Array) {\n cursor.setByte(JsValueConst.Vec);\n cursor.setBuffer(value);\n return;\n }\n\n if (GuardJsValue.isString(value)) {\n cursor.setByte(JsValueConst.String);\n cursor.setString(value);\n return;\n }\n\n if (Array.isArray(value)) {\n cursor.setByte(JsValueConst.List);\n cursor.setU32(value.length);\n\n for (const item of value) {\n saveToBufferItem(item, cursor);\n }\n\n return;\n }\n\n if (value.type === JsValueConst.U32) {\n cursor.setByte(JsValueConst.U32);\n cursor.setU32(value.value);\n return;\n }\n\n if (value.type === JsValueConst.I32) {\n cursor.setByte(JsValueConst.I32);\n cursor.setI32(value.value);\n return;\n }\n\n if (value.type === JsValueConst.U64) {\n cursor.setByte(JsValueConst.U64);\n cursor.setU64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.I64) {\n cursor.setByte(JsValueConst.I64);\n cursor.setI64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.F64) {\n cursor.setByte(JsValueConst.F64);\n cursor.setF64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.Object) {\n const list: Array<[string, JsValueType]> = [];\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n list.push([key, propertyValue]);\n }\n\n cursor.setByte(JsValueConst.Object);\n cursor.setU16(list.length);\n\n for (const [key, propertyValue] of list) {\n cursor.setString(key);\n saveToBufferItem(propertyValue, cursor);\n }\n return;\n }\n\n if (value.type === JsValueConst.Json) {\n cursor.setByte(JsValueConst.Json);\n saveJsJsonToBufferItem(value.value, cursor);\n return;\n }\n\n return assertNever(value);\n};\n\nexport const saveToBuffer = (\n getUint8Memory: () => Uint8Array,\n alloc: (size: number) => number,\n value: JsValueType,\n): number => {\n if (value === undefined) {\n return 0;\n }\n\n const size = getSize(value);\n const ptr = alloc(size);\n\n const cursor = new BufferCursor(getUint8Memory, ptr, size);\n saveToBufferItem(value, cursor);\n\n if (size !== cursor.getSavedSize()) {\n console.error({\n size,\n savedSize: cursor.getSavedSize(),\n });\n\n throw Error('Mismatch between calculated and recorded size');\n }\n\n return ptr;\n};\n\nexport const convertFromJsValue = (value: JsValueType): unknown => {\n if (value === true) {\n return true;\n }\n\n if (value === false) {\n return false;\n }\n\n if (value === null) {\n return null;\n }\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value instanceof Uint8Array) {\n return value;\n }\n\n if (GuardJsValue.isString(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n const newList = [];\n\n for (const item of value) {\n newList.push(convertFromJsValue(item));\n }\n\n return newList;\n }\n\n if (value.type === JsValueConst.U32 || value.type === JsValueConst.I32) {\n return value.value;\n }\n\n if (value.type === JsValueConst.U64 || value.type === JsValueConst.I64 || value.type === JsValueConst.F64) {\n return value.value;\n }\n\n if (value.type === JsValueConst.Object) {\n const result: Record = {};\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n result[key] = convertFromJsValue(propertyValue);\n }\n\n return result;\n }\n\n if (value.type === JsValueConst.Json) {\n return value.value;\n }\n\n return assertNever(value);\n};\n\n//throws an exception when it fails to convert to JsValue\nexport const convertToJsValue = (value: unknown): JsValueType => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === true || value === false || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'number') {\n if (value === (value | 0)) {\n // is integer\n if (-(2 ** 31) <= value && value < 2 ** 31) {\n return {\n type: JsValueConst.I32,\n value\n };\n }\n\n return {\n type: JsValueConst.I64,\n value: BigInt(value)\n };\n } else {\n // is float\n return {\n type: JsValueConst.F64,\n value: value,\n }\n }\n }\n\n if (typeof value === 'bigint') {\n return {\n type: JsValueConst.I64,\n value\n };\n }\n\n if (value instanceof Uint8Array) {\n return value;\n }\n\n if (typeof value === 'object') {\n try {\n const json = convertToJsJson(value);\n return {\n type: JsValueConst.Json,\n value: json\n };\n } catch (_error) {\n }\n\n const result: Record = {};\n\n for (const [propName, propValue] of Object.entries(value)) {\n result[propName] = convertToJsValue(propValue);\n }\n\n return {\n type: JsValueConst.Object,\n value: result\n };\n }\n\n if (Array.isArray(value)) {\n try {\n const list = value.map(convertToJsJson);\n return {\n type: JsValueConst.Json,\n value: list\n };\n } catch (_error) {\n return value.map(convertToJsValue);\n }\n }\n\n console.warn('convertToJsValue', value);\n throw Error('It is not possible to convert this data to JsValue');\n};\n\n//throws an exception when it fails to convert to JsJson\nexport const convertToJsJson = (value: unknown): JsJsonType => {\n if (typeof value === 'boolean' || value === null || typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(convertToJsJson);\n }\n\n if (typeof value === 'object') {\n const result: Record = {};\n\n for (const [propName, propValue] of Object.entries(value)) {\n result[propName] = convertToJsJson(propValue);\n }\n\n return result;\n }\n\n console.warn('convertToJsJson', value);\n throw Error('It is not possible to convert this data to JsJson');\n};\n","import { jsValueDecode, JsValueType, saveToBuffer } from './jsvalue';\n\nexport interface BaseExportType {\n alloc: (size: number) => number,\n free: (pointer: number) => void,\n wasm_callback: (callback_id: bigint, value_ptr: number) => bigint, //result => pointer: 32bit, size: 32bit\n};\n\nexport interface ModuleControllerType {\n exports: ExportType,\n decodeArguments: (ptr: number, size: number) => JsValueType,\n getUint8Memory: () => Uint8Array,\n wasm_callback: (callback_id: bigint, params: JsValueType) => JsValueType,\n valueSaveToBuffer: (value: JsValueType) => number,\n}\n\nconst fetchModule = async (wasmBinPath: string, imports: Record): Promise => {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n const stream = fetch(wasmBinPath);\n try {\n const module = await WebAssembly.instantiateStreaming(stream, imports);\n return module;\n } catch (err) {\n console.warn(\"`WebAssembly.instantiateStreaming` failed. This could happen if your server does not serve wasm with `application/wasm` MIME type, but check the original error too. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", err);\n }\n }\n\n console.info('fetchModule by WebAssembly.instantiate');\n\n const resp = await fetch(wasmBinPath);\n const binary = await resp.arrayBuffer();\n const module_instance = await WebAssembly.instantiate(binary, imports);\n return module_instance;\n};\n\nexport const wasmInit = async , ExportType extends BaseExportType>(\n wasmBinPath: string,\n imports: { mod: ImportType },\n): Promise> => {\n const module_instance = await fetchModule(wasmBinPath, imports);\n\n let cacheGetUint8Memory: Uint8Array = new Uint8Array(1);\n\n const getUint8Memory = () => {\n if (module_instance.instance.exports.memory instanceof WebAssembly.Memory) {\n if (cacheGetUint8Memory.buffer !== module_instance.instance.exports.memory.buffer) {\n cacheGetUint8Memory = new Uint8Array(module_instance.instance.exports.memory.buffer);\n }\n return cacheGetUint8Memory;\n } else {\n throw Error('Missing memory');\n }\n };\n\n //@ts-expect-error\n const exports: ExportType = module_instance.instance.exports;\n\n const decodeArguments = (ptr: number, size: number) => jsValueDecode(getUint8Memory, ptr, size);\n\n const valueSaveToBuffer = (value: JsValueType): number => saveToBuffer(getUint8Memory, exports.alloc, value);\n\n const wasm_callback = (callback_id: bigint, value: JsValueType): JsValueType => {\n const value_ptr = valueSaveToBuffer(value);\n let result_ptr_and_size = exports.wasm_callback(callback_id, value_ptr);\n\n if (result_ptr_and_size === 0n) {\n return undefined;\n }\n\n const size = result_ptr_and_size % (2n ** 32n);\n const ptr = result_ptr_and_size >> 32n;\n\n if (ptr >= 2n ** 32n) {\n console.error(`Overflow of a variable with a pointer result_ptr_and_size=${result_ptr_and_size}`);\n }\n\n const response = decodeArguments(Number(ptr), Number(size));\n exports.free(Number(ptr));\n\n return response;\n };\n\n return {\n exports,\n decodeArguments,\n getUint8Memory,\n wasm_callback,\n valueSaveToBuffer,\n };\n};\n","import { JsJsonType } from \"../jsjson\";\n\nexport class Cookies {\n public get = (cname: string): string => {\n for (const cookie of document.cookie.split(';')) {\n if (cookie === \"\") continue;\n\n const cookieChunk = cookie.trim().split('=');\n\n if (cookieChunk.length !== 2) {\n console.warn(`Cookies.get: Incorrect number of cookieChunk => ${cookieChunk.length} in ${cookie}`);\n continue;\n }\n\n const cookieName = cookieChunk[0];\n const cookieValue = cookieChunk[1];\n\n if (cookieName === undefined || cookieValue === undefined) {\n console.warn(`Cookies.get: Broken cookie part => ${cookie}`);\n continue;\n }\n\n if (cookieName === cname) {\n return decodeURIComponent(cookieValue);\n }\n }\n\n return '';\n }\n\n public get_json = (cname: string): JsJsonType => {\n let cvalue_str = this.get(cname);\n\n if (cvalue_str.length !== 0) {\n try {\n let cookie_value = JSON.parse(cvalue_str);\n return cookie_value;\n } catch (e) {\n console.error!(\"Error deserializing cookie\", e);\n }\n }\n return null\n }\n\n public set = (\n cname: string,\n cvalue: string,\n expires_in: bigint,\n ) => {\n const cvalueEncoded = cvalue == null ? \"\" : encodeURIComponent(cvalue);\n\n const d = new Date();\n d.setTime(d.getTime() + (Number(expires_in) * 1000));\n let expires = \"expires=\"+ d.toUTCString();\n\n document.cookie = `${cname}=${cvalueEncoded};${expires};path=/;samesite=strict\"`;\n }\n\n public set_json = (\n cname: string,\n cvalue: JsJsonType,\n expires_in: bigint,\n ) => {\n let cvalue_str = JSON.stringify(cvalue);\n\n this.set(cname, cvalue_str, expires_in);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nexport class Interval {\n private readonly getWasm: () => ModuleControllerType;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n }\n\n public interval_set = (duration: number, callback_id: bigint): ReturnType => {\n const timer_id = setInterval(() => {\n this.getWasm().wasm_callback(callback_id, undefined);\n }, duration);\n\n return timer_id;\n }\n\n public interval_clear = (timer_id: number) => {\n clearInterval(timer_id);\n }\n\n timeout_set = (duration: number, callback_id: bigint): ReturnType => {\n const timeout_id = setTimeout(() => {\n this.getWasm().wasm_callback(callback_id, undefined);\n }, duration);\n\n return timeout_id;\n }\n\n timeout_clear = (timer_id: number): void => {\n clearTimeout(timer_id);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nexport class HashRouter {\n private getWasm: () => ModuleControllerType;\n private callback: Map void>;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.callback = new Map();\n\n window.addEventListener(\"hashchange\", this.trigger);\n }\n\n private trigger = () => {\n for (const callback of Array.from(this.callback.values())) {\n callback();\n }\n }\n\n public add = (callback_id: bigint) => {\n this.callback.set(callback_id, () => {\n this.getWasm().wasm_callback(callback_id, this.get());\n });\n }\n\n public remove = (callback_id: bigint) => {\n this.callback.delete(callback_id);\n }\n\n public push = (new_hash: string) => {\n if (this.get() === new_hash) {\n return;\n }\n\n location.hash = new_hash;\n this.trigger();\n }\n\n public get(): string {\n return decodeURIComponent(location.hash.substr(1));\n }\n}\n","import { JsJsonType } from \"../jsjson\";\nimport { JsValueConst } from \"../jsvalue\";\nimport { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nconst getTypeResponse = (contentType: string | null): 'json' | 'text' | 'bin' => {\n if (contentType === null) {\n console.info('Missing header content-type');\n return 'bin';\n }\n\n const [type] = contentType.split(\";\");\n\n if (type === undefined) {\n console.error('Missing value for content-type');\n return 'bin';\n }\n\n const typeClear = type.toLowerCase().trim();\n\n if (typeClear === 'application/json') {\n return 'json';\n }\n\n if (typeClear === 'text/plain') {\n return 'text';\n }\n\n console.error(`No match found for content-type=${contentType}`);\n return 'bin';\n}\n\nconst catchError = async (\n wasm: ModuleControllerType,\n callback_id: bigint,\n response: Response,\n callbackSuccess: (response: Response) => Promise\n) => {\n try {\n await callbackSuccess(response);\n } catch (error) {\n console.error('fetch error (2) - json', error);\n const responseMessage = new String(error).toString();\n\n wasm.wasm_callback(callback_id, [\n false, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n responseMessage //body (string)\n ]);\n }\n};\n\nconst getHeadersAndBody = (headersRecord: Record, body: undefined | string | Uint8Array | JsJsonType | undefined): [Headers, string | ArrayBuffer | undefined] => {\n const headers = new Headers(headersRecord);\n\n if (body === undefined) {\n return [\n headers,\n undefined\n ]\n }\n\n if (typeof body === 'string') {\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'text/plain; charset=utf-8');\n }\n\n return [\n headers,\n body\n ];\n }\n\n\n if (body instanceof Uint8Array) {\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'application/octet-stream');\n }\n\n return [\n headers,\n body\n ];\n }\n\n //JsJsonType\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n\n return [\n headers,\n JSON.stringify(body),\n ];\n};\n\nexport class Fetch {\n private readonly getWasm: () => ModuleControllerType;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n }\n\n public fetch_send_request = (\n callback_id: bigint,\n method: string,\n url: string,\n headers: Record,\n body: string | Uint8Array | JsJsonType | undefined,\n ) => {\n this.fetch_send_request_inner(callback_id, method, url, headers, body);\n }\n\n private fetch_send_request_inner = async (\n callback_id: bigint,\n method: string,\n url: string,\n headers: Record,\n body: string | Uint8Array | JsJsonType | undefined,\n ): Promise => {\n const wasm = this.getWasm();\n\n const [fetchHeaders, fetchBody] = getHeadersAndBody(headers, body);\n\n try {\n const response = await fetch(url, {\n method,\n headers: fetchHeaders,\n body: fetchBody,\n });\n\n const contentType = response.headers.get('content-type');\n const responseType = getTypeResponse(contentType);\n\n if (responseType === 'json') {\n catchError(wasm, callback_id, response, async (response) => {\n const json = await response.json();\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n { //body (json)\n type: JsValueConst.Json,\n value: json\n }\n ]);\n });\n return;\n }\n\n if (responseType === 'text') {\n catchError(wasm, callback_id, response, async (response) => {\n const text = await response.text();\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n text //body (text)\n ]);\n });\n return;\n }\n\n catchError(wasm, callback_id, response, async (response) => {\n const text = await response.arrayBuffer();\n const textUint8Array = new Uint8Array(text);\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n textUint8Array //body (text)\n ]);\n });\n } catch (err) {\n console.error('fetch error (1)', err);\n const responseMessage = new String(err).toString();\n\n wasm.wasm_callback(callback_id, [\n false, //ok\n { type: JsValueConst.U32, value: 0 }, //http code\n responseMessage //body (string)\n ]);\n }\n }\n}\n","export class EventEmitter {\n private events: Set<(param: T) => void>;\n\n constructor() {\n this.events = new Set()\n }\n\n on(callback: (param: T) => void) {\n let isActive = true;\n\n const onExec = (param: T) => {\n if (isActive) {\n callback(param);\n }\n };\n\n this.events.add(onExec);\n\n return () => {\n isActive = false;\n this.events.delete(onExec);\n };\n }\n\n trigger(param: T) {\n const eventsCopy = Array.from(this.events.values())\n\n for (const itemCallbackToRun of eventsCopy) {\n try {\n itemCallbackToRun(param);\n } catch (err) {\n console.error(err);\n }\n }\n }\n\n get size(): number {\n return this.events.size;\n }\n}\n","type ResolveFn = (data: T) => void;\ntype RejectFn = (err: unknown) => void;\n\ninterface PromiseResolveReject {\n readonly resolve: (value: T) => void,\n readonly reject: (err: unknown) => void,\n};\n\nconst createPromiseValue = (): [PromiseResolveReject, Promise] => {\n let resolve: ResolveFn | null = null;\n let reject: RejectFn | null = null;\n\n const promise: Promise = new Promise((localResolve: ResolveFn, localReject: RejectFn) => {\n resolve = localResolve;\n reject = localReject;\n });\n\n if (resolve === null) {\n throw Error('createPromiseValue - resolve is null');\n }\n\n if (reject === null) {\n throw Error('createPromiseValue - reject is null');\n }\n\n const promiseValue = {\n resolve,\n reject,\n };\n\n return [promiseValue, promise];\n};\n\nexport class PromiseBoxRace {\n private promiseResolveReject: PromiseResolveReject | null = null;\n readonly promise: Promise;\n\n constructor() {\n const [promiseResolveReject, promise] = createPromiseValue();\n\n this.promiseResolveReject = promiseResolveReject;\n this.promise = promise;\n }\n\n resolve = (value: T) => {\n const promiseResolveReject = this.promiseResolveReject;\n this.promiseResolveReject = null;\n\n if (promiseResolveReject === null) {\n return;\n }\n\n promiseResolveReject.resolve(value);\n }\n\n reject = (err?: unknown) => {\n const promiseResolveReject = this.promiseResolveReject;\n this.promiseResolveReject = null;\n\n if (promiseResolveReject === null) {\n return;\n }\n\n promiseResolveReject.reject(err);\n }\n\n isFulfilled = (): boolean => {\n return this.promiseResolveReject === null;\n }\n}\n","import { EventEmitter } from \"./event_emiter\";\nimport { PromiseBoxRace } from \"./promise\";\n\nconst timeout = async (timeout: number): Promise => {\n return new Promise((resolve: (data: void) => void) => {\n setTimeout(resolve, timeout);\n });\n};\n\n\nconst reconnectDelay = async (label: string, timeout_retry: number): Promise => {\n console.info(`${label} wait ${timeout_retry}ms`);\n await timeout(timeout_retry);\n console.info(`${label} go forth`);\n};\n\nexport type SocketEventType = {\n type: 'message',\n message: string,\n} | {\n type: 'socket',\n socket: SocketConnection\n} | {\n type: 'close',\n};\n\nexport type OnMessageType = (message: SocketEventType) => void;\nexport type UnsubscribeFnType = () => void;\n\ninterface OpenSocketResult {\n socket: Promise,\n done: Promise,\n}\n\nexport interface SocketConnectionController {\n send: (message: string) => void,\n dispose: UnsubscribeFnType\n}\n\nclass LogContext {\n public constructor(private host: string) {}\n public formatLog = (message: string): string => `Socket ${this.host} ==> ${message}`;\n}\nexport class SocketConnection {\n private readonly eventMessage: EventEmitter;\n public readonly close: () => void;\n public readonly send: (message: string) => void;\n\n private constructor(\n close: () => void,\n send: (message: string) => void,\n ) {\n this.eventMessage = new EventEmitter();\n this.close = close;\n this.send = send;\n }\n\n private static connect(\n log: LogContext,\n host: string,\n timeout: number,\n ): OpenSocketResult {\n const result = new PromiseBoxRace();\n const done = new PromiseBoxRace();\n const socket = new WebSocket(host);\n let isClose: boolean = false;\n\n console.info(log.formatLog('starting ...'));\n\n const closeSocket = (): void => {\n if (isClose) {\n return;\n }\n\n console.info(log.formatLog('close'));\n\n isClose = true;\n result.resolve(null);\n done.resolve();\n socket.close();\n };\n\n\n const socketConnection = new SocketConnection(\n closeSocket,\n (message: string) => {\n if (isClose) {\n return;\n }\n socket.send(message);\n }\n );\n\n setTimeout(() => {\n if (result.isFulfilled() === false) {\n console.error(log.formatLog(`timeout (${timeout}ms)`));\n closeSocket();\n }\n }, timeout);\n\n const onOpen = (): void => {\n console.info(log.formatLog('open'));\n result.resolve(socketConnection);\n };\n\n const onError = (error: Event): void => {\n console.error(log.formatLog('error'), error);\n closeSocket();\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (isClose) {\n return;\n }\n\n const dataRaw = event.data;\n\n if (typeof dataRaw === 'string') {\n socketConnection.eventMessage.trigger(dataRaw);\n return;\n }\n\n console.error(log.formatLog('onMessage - expected string'), dataRaw);\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('error', onError);\n socket.addEventListener('close', closeSocket);\n socket.addEventListener('message', onMessage);\n\n return {\n socket: result.promise,\n done: done.promise\n };\n }\n\n public static startSocket(\n host: string,\n timeout_connection: number,\n timeout_retry: number,\n onMessage: OnMessageType,\n ): SocketConnectionController {\n let isConnect: boolean = true;\n let socketConnection: SocketConnection | null = null;\n\n const log = new LogContext(host);\n\n (async (): Promise => {\n while (isConnect) {\n const openSocketResult = SocketConnection.connect(log, host, timeout_connection);\n\n const socket = await openSocketResult.socket;\n\n if (socket === null) {\n await reconnectDelay(log.formatLog('reconnect after error'), timeout_retry);\n continue;\n }\n\n socketConnection = socket;\n onMessage({\n type: 'socket',\n socket\n });\n\n socket.eventMessage.on(message => {\n onMessage({\n type: 'message',\n message\n });\n });\n\n await openSocketResult.done;\n\n onMessage({\n type: 'close'\n });\n\n if (!isConnect) {\n console.info(log.formatLog('disconnect (1)'));\n return;\n }\n\n await reconnectDelay(log.formatLog('reconnect after close'), timeout_retry);\n }\n\n console.info(log.formatLog('disconnect (2)'));\n })().catch((error) => {\n console.error(error);\n });\n\n return {\n send: (message: string): void => {\n if (socketConnection === null) {\n console.error('send fail - missing connection', message);\n } else {\n socketConnection.send(message);\n }\n },\n dispose: (): void => {\n isConnect = false;\n socketConnection?.close();\n }\n };\n }\n}\n","import { ModuleControllerType } from \"../../wasm_init\";\nimport { ExportType } from \"../../wasm_module\";\nimport { SocketConnection, SocketConnectionController } from \"./connection\";\n\n\nconst assertNeverMessage = (data: never): never => {\n console.error(data);\n throw Error('unknown message');\n};\n\nexport class DriverWebsocket {\n private getWasm: () => ModuleControllerType;\n private readonly controllerList: Map;\n private readonly socket: Map;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.controllerList = new Map();\n this.socket = new Map();\n }\n\n public websocket_register_callback = (\n host: string,\n callback_id: bigint,\n ) => {\n const wasm = this.getWasm();\n\n let controller = SocketConnection.startSocket(\n host,\n 5000, //timeout connection\n 3000, //timeout reconnection\n (message) => {\n\n if (this.controllerList.has(callback_id) === false) {\n return;\n }\n\n if (message.type === 'socket') {\n this.socket.set(callback_id, message.socket);\n wasm.wasm_callback(callback_id, true);\n return;\n }\n\n if (message.type === 'message') {\n wasm.wasm_callback(callback_id, message.message);\n return;\n }\n\n if (message.type === 'close') {\n this.socket.delete(callback_id);\n wasm.wasm_callback(callback_id, false);\n return;\n }\n\n return assertNeverMessage(message);\n }\n );\n\n this.controllerList.set(callback_id, controller);\n }\n\n public websocket_unregister_callback = (callback_id: bigint) => {\n const controller = this.controllerList.get(callback_id);\n\n if (controller === undefined) {\n console.error('Expected controller');\n return;\n }\n\n controller.dispose();\n this.controllerList.delete(callback_id);\n }\n\n public websocket_send_message = (\n callback_id: bigint,\n message: string,\n ) => {\n const socket = this.socket.get(callback_id);\n\n if (socket === undefined) {\n console.error(`Missing socket connection for callback_id=${callback_id}`);\n } else {\n socket.send(message);\n }\n }\n}\n","type NodeType = Element | Comment | Text;\nexport class MapNodes {\n private data: Map;\n\n constructor() {\n this.data = new Map();\n }\n\n public get_root_html(): Element {\n return document.documentElement;\n }\n\n public get_root_head(): Element {\n return document.head;\n }\n\n public get_root_body(): Element {\n return document.body;\n }\n\n public set(id: number, value: NodeType) {\n if (id === 1 || id === 2 || id === 3) {\n //ignore\n } else {\n this.data.set(id, value);\n }\n }\n\n public get_any_option(id: number): NodeType | undefined {\n if (id === 1) {\n return this.get_root_html();\n }\n\n if (id === 2) {\n return this.get_root_head();\n }\n\n if (id === 3) {\n return this.get_root_body();\n }\n\n return this.data.get(id);\n }\n\n public get_any(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n\n if (item === undefined) {\n throw Error(`${label} -> item not found=${id}`);\n }\n\n return item;\n }\n\n public get(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n\n if (item === undefined) {\n throw new Error(`${label}->get: Item id not found = ${id}`);\n }\n return item;\n }\n\n public get_node_element(label: string, id: number): HTMLElement {\n const node = this.get(label, id);\n if (node instanceof HTMLElement) {\n return node;\n } else {\n throw Error(`Expected id=${id} as HTMLElement`);\n }\n }\n\n public get_node(label: string, id: number): Element {\n const node = this.get(label, id);\n if (node instanceof Element) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Element`);\n }\n }\n\n public get_text(label: string, id: number): Text {\n const node = this.get(label, id);\n if (node instanceof Text) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Text`);\n }\n }\n\n public get_comment(label: string, id: number): Comment {\n const node = this.get(label, id);\n if (node instanceof Comment) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Comment`);\n }\n }\n\n public delete(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n this.data.delete(id);\n\n if (item === undefined) {\n throw new Error(`${label}->delete: Item id not found = ${id}`);\n }\n\n return item;\n }\n}\n","import { ModuleControllerType } from \"../../wasm_init\";\nimport { ExportType } from \"../../wasm_module\";\nimport { HistoryLocation } from \"../historyLocation\";\nimport { MapNodes } from \"./map_nodes\";\n\ninterface FileItemType {\n name: string,\n data: Uint8Array,\n}\n\nconst createElement = (name: string): Element => {\n if (name == \"path\" || name == \"svg\") {\n return document.createElementNS(\"http://www.w3.org/2000/svg\", name);\n } else {\n return document.createElement(name);\n }\n}\n\ntype CommandType = {\n type: 'create_node',\n id: number,\n name: string,\n} | {\n type: 'create_text',\n id: number,\n value: string\n} | {\n type: 'update_text',\n id: number,\n value: string\n} | {\n type: 'set_attr',\n id: number,\n name: string,\n value: string\n} | {\n type: 'remove_attr',\n id: number,\n name: string\n} | {\n type: 'remove_node',\n id: number,\n} | {\n type: 'remove_text',\n id: number,\n} | {\n type: 'insert_before',\n parent: number,\n child: number,\n ref_id: number | null,\n} | {\n type: 'insert_css',\n selector: string,\n value: string\n} | {\n type: 'create_comment',\n id: number,\n value: string\n} | {\n type: 'remove_comment',\n id: number,\n} | {\n type: 'callback_add',\n id: number,\n event_name: string,\n callback_id: number,\n} | {\n type: 'callback_remove',\n id: number,\n event_name: string,\n callback_id: number,\n};\n\nconst assertNeverCommand = (data: never): never => {\n console.error(data);\n throw Error('unknown command');\n};\n\nexport class DriverDom {\n private historyLocation: HistoryLocation;\n private readonly getWasm: () => ModuleControllerType;\n public readonly nodes: MapNodes;\n private callbacks: Map void>;\n private initBeforeFirstUpdate: boolean;\n\n public constructor(historyLocation: HistoryLocation, getWasm: () => ModuleControllerType) {\n this.historyLocation = historyLocation;\n this.getWasm = getWasm;\n this.nodes = new MapNodes();\n this.callbacks = new Map();\n this.initBeforeFirstUpdate = false;\n\n document.addEventListener('dragover', (ev): void => {\n // console.log('File(s) in drop zone');\n ev.preventDefault();\n });\n }\n\n public debugNodes(...ids: Array) {\n const result: Record = {};\n for (const id of ids) {\n const value = this.nodes.get_any_option(id);\n result[id] = value;\n }\n console.info('debug nodes', result);\n }\n\n private create_node(id: number, name: string) {\n const node = createElement(name);\n this.nodes.set(id, node);\n\n if (name.toLowerCase().trim() === 'a') {\n node.addEventListener('click', (e) => {\n let href = node.getAttribute('href');\n if (href === null) {\n return;\n }\n\n if (href.startsWith('#') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//')) {\n return;\n }\n\n e.preventDefault();\n this.historyLocation.push(href);\n window.scrollTo(0, 0);\n })\n }\n }\n\n private set_attribute(id: number, name: string, value: string) {\n const node = this.nodes.get_node(\"set_attribute\", id);\n node.setAttribute(name, value);\n\n if (name == \"value\") {\n if (node instanceof HTMLInputElement) {\n node.value = value;\n return;\n }\n\n if (node instanceof HTMLTextAreaElement) {\n node.value = value;\n node.defaultValue = value;\n return;\n }\n }\n }\n\n private remove_attribute(id: number, name: string) {\n const node = this.nodes.get_node(\"remove_attribute\", id);\n node.removeAttribute(name);\n\n if (name == \"value\") {\n if (node instanceof HTMLInputElement) {\n node.value = \"\";\n return;\n }\n\n if (node instanceof HTMLTextAreaElement) {\n node.value = \"\";\n node.defaultValue = \"\";\n return;\n }\n }\n }\n\n private remove_node(id: number) {\n const node = this.nodes.delete(\"remove_node\", id);\n node.remove();\n }\n\n private create_text(id: number, value: string) {\n const text = document.createTextNode(value);\n this.nodes.set(id, text);\n }\n\n private remove_text(id: number) {\n const text = this.nodes.delete(\"remove_node\", id);\n text.remove();\n }\n\n private update_text(id: number, value: string) {\n const text = this.nodes.get_text(\"set_attribute\", id);\n text.textContent = value;\n }\n\n private insert_before(parent: number, child: number, ref_id: number | null | undefined) {\n const parentNode = this.nodes.get(\"insert_before\", parent);\n const childNode = this.nodes.get_any(\"insert_before child\", child);\n\n if (ref_id === null || ref_id === undefined) {\n parentNode.insertBefore(childNode, null);\n } else {\n const ref_node = this.nodes.get_any('insert_before ref', ref_id);\n parentNode.insertBefore(childNode, ref_node);\n }\n }\n\n private insert_css(selector: string, value: string) {\n const style = document.createElement('style');\n const content = document.createTextNode(`${selector} { ${value} }`);\n style.appendChild(content);\n\n this.nodes.get_root_head().appendChild(style);\n }\n\n private callback_click(event: Event, callback_id: bigint) {\n event.preventDefault();\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_input(event: Event, callback_id: bigint) {\n const target = event.target;\n\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n this.getWasm().wasm_callback(callback_id, target.value);\n return;\n }\n\n console.warn('event input ignore', target);\n }\n\n private callback_change(event: Event, callback_id: bigint) {\n const target = event.target;\n\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {\n this.getWasm().wasm_callback(callback_id, target.value);\n return;\n }\n\n console.warn('event input ignore', target);\n }\n\n private callback_blur(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_mousedown(event: Event, callback_id: bigint) {\n if (this.getWasm().wasm_callback(callback_id, undefined)) {\n event.preventDefault()\n }\n }\n\n private callback_mouseup(event: Event, callback_id: bigint) {\n if (this.getWasm().wasm_callback(callback_id, undefined)) {\n event.preventDefault()\n }\n }\n\n private callback_mouseenter(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_mouseleave(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_drop(event: Event, callback_id: bigint) {\n event.preventDefault();\n\n if (event instanceof DragEvent) {\n if (event.dataTransfer === null) {\n console.error('dom -> drop -> dataTransfer null');\n } else {\n const files: Array> = [];\n\n for (let i = 0; i < event.dataTransfer.items.length; i++) {\n const item = event.dataTransfer.items[i];\n\n if (item === undefined) {\n console.error('dom -> drop -> item - undefined');\n } else {\n const file = item.getAsFile();\n\n if (file === null) {\n console.error(`dom -> drop -> index:${i} -> It's not a file`);\n } else {\n files.push(file\n .arrayBuffer()\n .then((data): FileItemType => ({\n name: file.name,\n data: new Uint8Array(data),\n }))\n );\n }\n }\n }\n\n if (files.length) {\n Promise.all(files).then((files) => {\n const params = [];\n\n for (const file of files) {\n params.push([\n file.name,\n file.data,\n ]);\n }\n\n this.getWasm().wasm_callback(callback_id, [params]);\n }).catch((error) => {\n console.error('callback_drop -> promise.all -> ', error);\n });\n } else {\n console.error('No files to send');\n }\n }\n } else {\n console.warn('event drop ignore', event);\n }\n }\n\n private callback_keydown(event: Event, callback_id: bigint) {\n if (event instanceof KeyboardEvent) {\n const result = this.getWasm().wasm_callback(callback_id, [\n event.key,\n event.code,\n event.altKey,\n event.ctrlKey,\n event.shiftKey,\n event.metaKey\n ]);\n\n if (result === true) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n return;\n }\n\n console.warn('keydown ignore', event);\n }\n\n private callback_load(event: Event, callback_id: bigint) {\n event.preventDefault();\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_add(id: number, event_name: string, callback_id: bigint) {\n const callback = (event: Event) => {\n if (event_name === 'click') {\n return this.callback_click(event, callback_id);\n }\n\n if (event_name === 'input') {\n return this.callback_input(event, callback_id);\n }\n\n if (event_name === 'change') {\n return this.callback_change(event, callback_id);\n }\n\n if (event_name === 'blur') {\n return this.callback_blur(event, callback_id);\n }\n\n if (event_name === 'mousedown') {\n return this.callback_mousedown(event, callback_id);\n }\n\n if (event_name === 'mouseup') {\n return this.callback_mouseup(event, callback_id);\n }\n\n if (event_name === 'mouseenter') {\n return this.callback_mouseenter(event, callback_id);\n }\n\n if (event_name === 'mouseleave') {\n return this.callback_mouseleave(event, callback_id);\n }\n\n if (event_name === 'keydown') {\n return this.callback_keydown(event, callback_id);\n }\n\n if (event_name === 'hook_keydown') {\n return this.callback_keydown(event, callback_id);\n }\n\n if (event_name === 'drop') {\n return this.callback_drop(event, callback_id);\n }\n\n if (event_name === 'load') {\n return this.callback_load(event, callback_id);\n }\n\n console.error(`No support for the event ${event_name}`);\n };\n\n if (this.callbacks.has(callback_id)) {\n console.error(`There was already a callback added with the callback_id=${callback_id}`);\n return;\n }\n\n this.callbacks.set(callback_id, callback);\n\n if (event_name === 'hook_keydown') {\n document.addEventListener('keydown', callback, false);\n } else {\n const node = this.nodes.get('callback_add', id);\n node.addEventListener(event_name, callback, false);\n }\n }\n\n private callback_remove(id: number, event_name: string, callback_id: bigint) {\n const callback = this.callbacks.get(callback_id);\n this.callbacks.delete(callback_id);\n\n if (callback === undefined) {\n console.error(`The callback is missing with the id=${callback_id}`);\n return;\n }\n\n if (event_name === 'hook_keydown') {\n document.removeEventListener('keydown', callback);\n } else {\n const node = this.nodes.get('callback_remove', id);\n node.removeEventListener(event_name, callback);\n }\n }\n\n private get_node_to_clear = (element: Element): Array => {\n const list: Array = [];\n element.childNodes.forEach((item: ChildNode) => {\n list.push(item);\n });\n return list;\n };\n\n private get_to_clear = (): [Array, Array] => {\n if (this.initBeforeFirstUpdate === true) {\n return [[], []];\n }\n\n this.initBeforeFirstUpdate = true;\n\n return [\n this.get_node_to_clear(this.nodes.get_root_head()),\n this.get_node_to_clear(this.nodes.get_root_body())\n ];\n }\n\n public dom_bulk_update = (commands: Array) => {\n const [node_head, node_body] = this.get_to_clear();\n\n const setFocus: Set = new Set();\n\n for (const command of commands) {\n try {\n this.bulk_update_command(command);\n } catch (error) {\n console.error('bulk_update - item', error, command);\n }\n\n if (command.type === 'set_attr' && command.name.toLocaleLowerCase() === 'autofocus') {\n setFocus.add(command.id);\n }\n }\n\n if (setFocus.size > 0) {\n setTimeout(() => {\n for (const id of setFocus) {\n const node = this.nodes.get_node_element(`set focus ${id}`, id);\n node.focus();\n }\n }, 0);\n }\n\n for (const node of node_body) {\n node.remove();\n }\n \n for (const node of node_head) {\n node.remove();\n }\n }\n\n private bulk_update_command(command: CommandType) {\n if (command.type === 'remove_node') {\n this.remove_node(command.id);\n return;\n }\n\n if (command.type === 'insert_before') {\n this.insert_before(command.parent, command.child, command.ref_id === null ? null : command.ref_id);\n return;\n }\n\n if (command.type === 'create_node') {\n this.create_node(command.id, command.name);\n return;\n }\n\n if (command.type === 'create_text') {\n this.create_text(command.id, command.value);\n return;\n }\n\n if (command.type === 'update_text') {\n this.update_text(command.id, command.value);\n return;\n }\n\n if (command.type === 'set_attr') {\n this.set_attribute(command.id, command.name, command.value);\n return;\n }\n\n if (command.type === 'remove_attr') {\n this.remove_attribute(command.id, command.name);\n return;\n }\n\n if (command.type === 'remove_text') {\n this.remove_text(command.id);\n return;\n }\n\n if (command.type === 'insert_css') {\n this.insert_css(command.selector, command.value);\n return;\n }\n\n if (command.type === 'create_comment') {\n const comment = document.createComment(command.value);\n this.nodes.set(command.id, comment);\n return;\n }\n\n if (command.type === 'remove_comment') {\n const comment = this.nodes.delete(\"remove_comment\", command.id);\n comment.remove();\n return;\n }\n\n if (command.type === 'callback_add') {\n this.callback_add(command.id, command.event_name, BigInt(command.callback_id));\n return;\n }\n\n if (command.type === 'callback_remove') {\n this.callback_remove(command.id, command.event_name, BigInt(command.callback_id));\n return;\n }\n\n return assertNeverCommand(command);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\nexport class HistoryLocation {\n private getWasm: () => ModuleControllerType;\n private callback: Map void>;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.callback = new Map();\n\n window.addEventListener(\"popstate\", this.trigger);\n }\n\n private trigger = () => {\n for (const callback of Array.from(this.callback.values())) {\n callback();\n }\n }\n\n public add = (callback_id: bigint) => {\n this.callback.set(callback_id, () => {\n this.getWasm().wasm_callback(callback_id, this.get());\n });\n }\n\n public remove = (callback_id: bigint) => {\n this.callback.delete(callback_id);\n }\n\n public push = (url: string) => {\n if (this.get() === url) {\n return;\n }\n\n window.history.pushState(null, '', url);\n this.trigger();\n }\n\n public replace = (url: string) => {\n if (this.get() === url) {\n return;\n }\n\n window.history.replaceState(null, '', url);\n this.trigger();\n }\n\n public get(): string {\n return window.location.pathname + window.location.search + window.location.hash;\n }\n}\n","import { ModuleControllerType } from \"./wasm_init\";\nimport { ExportType } from \"./wasm_module\";\nimport { Cookies } from \"./api_browser/cookies\";\nimport { Interval } from \"./api_browser/interval\";\nimport { HashRouter } from \"./api_browser/hashrouter\";\nimport { Fetch } from \"./api_browser/fetch\";\nimport { DriverWebsocket } from \"./api_browser/websocket/websocket\";\nimport { DriverDom } from \"./api_browser/dom/dom\";\nimport { HistoryLocation } from \"./api_browser/historyLocation\";\n\nexport class ApiBrowser {\n public readonly cookie: Cookies;\n public readonly interval: Interval;\n public readonly hashRouter: HashRouter;\n public readonly historyLocation: HistoryLocation;\n public readonly fetch: Fetch;\n public readonly websocket: DriverWebsocket;\n public readonly dom: DriverDom;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.cookie = new Cookies();\n this.interval = new Interval(getWasm);\n this.hashRouter = new HashRouter(getWasm);\n this.historyLocation = new HistoryLocation(getWasm);\n this.fetch = new Fetch(getWasm);\n this.websocket = new DriverWebsocket(getWasm);\n this.dom = new DriverDom(this.historyLocation, getWasm);\n }\n\n public getRandom = (min: number, max: number): number => {\n const range = max - min + 1;\n let result = Math.floor(Math.random() * range);\n return min + result;\n }\n\n public isBrowser = (): boolean => {\n return true;\n }\n\n public get_env = (name: string): string | null => {\n return document.documentElement.getAttribute(`data-env-${name}`);\n }\n}\n","import { ApiBrowser } from \"./api_browser\";\nimport { convertFromJsValue, convertToJsValue, JsValueType } from \"./jsvalue\";\nimport { GuardJsValue } from './guard';\nimport { MapNodes } from \"./api_browser/dom/map_nodes\";\n\nexport class JsNode {\n private api: ApiBrowser;\n private nodes: MapNodes;\n private wsk: unknown;\n\n public constructor(\n api: ApiBrowser,\n nodes: MapNodes,\n wsk: unknown\n ) {\n this.api = api;\n this.nodes = nodes;\n this.wsk = wsk;\n }\n\n getByProperty(path: Array, property: string): JsNode | null {\n try {\n //@ts-expect-error\n const nextCurrentPointer = this.wsk[property];\n return new JsNode(this.api, this.nodes, nextCurrentPointer);\n } catch (error) {\n console.error('A problem with get', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n public toValue(): JsValueType {\n return convertToJsValue(this.wsk);\n }\n\n public next(path: Array, command: JsValueType): JsNode | null {\n if (Array.isArray(command)) {\n const [commandName, ...args] = command;\n\n if (commandName === 'api') {\n return this.nextApi(path, args);\n }\n\n if (commandName === 'root') {\n return this.nextRoot(path, args);\n }\n\n if (commandName === 'get') {\n return this.nextGet(path, args);\n }\n\n if (commandName === 'set') {\n return this.nextSet(path, args);\n }\n\n if (commandName === 'call') {\n return this.nextCall(path, args);\n }\n\n if (commandName === 'get_props') {\n return this.nextGetProps(path, args);\n }\n\n console.error('JsNode.next - wrong commandName', commandName);\n return null;\n }\n\n console.error('JsNode.next - array was expected', { path, command });\n return null;\n }\n\n nextApi(path: Array, args: Array): JsNode | null {\n if (args.length === 0) {\n return new JsNode(this.api, this.nodes, this.api);\n }\n\n console.error('nextApi: wrong parameter', {path, args});\n return null;\n }\n\n nextRoot(path: Array, args: Array): JsNode | null {\n const [firstName, ...rest] = args;\n\n if (GuardJsValue.isString(firstName) && rest.length === 0) {\n if (firstName === 'window') {\n return new JsNode(this.api, this.nodes, window);\n }\n\n if (firstName === 'document') {\n return new JsNode(this.api, this.nodes, document);\n }\n\n console.error(`JsNode.nextRoot: Global name not found -> ${firstName}`, {path, args});\n return null;\n }\n\n if (GuardJsValue.isNumber(firstName) && rest.length === 0) {\n const domId = firstName.value;\n\n const node = this.nodes.get_any_option(domId);\n\n if (node !== undefined) {\n return new JsNode(this.api, this.nodes, node);\n }\n\n console.error(`JsNode.nextRoot: No node with id=${domId}`, {path, args});\n return null;\n }\n\n console.error('JsNode.nextRoot: wrong parameter', {path, args});\n return null;\n }\n\n nextGet(path: Array, args: Array): JsNode | null {\n const [property, ...getArgs] = args;\n\n if (GuardJsValue.isString(property) && getArgs.length === 0) {\n return this.getByProperty(path, property);\n }\n\n console.error('JsNode.nextGet - wrong parameters', { path, args });\n return null;\n }\n\n nextSet(path: Array, args: Array): JsNode | null {\n const [property, value, ...setArgs] = args;\n\n if (GuardJsValue.isString(property) && setArgs.length === 0) {\n try {\n //@ts-expect-error\n this.wsk[property] = convertFromJsValue(value);\n return new JsNode(this.api, this.nodes, undefined);\n } catch (error) {\n console.error('A problem with set', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n console.error('JsNode.nextSet - wrong parameters', { path, args });\n return null;\n }\n\n nextCall(path: Array, args: Array): JsNode | null {\n const [property, ...callArgs] = args;\n\n if (GuardJsValue.isString(property)) {\n try {\n let paramsJs = callArgs.map(convertFromJsValue);\n //@ts-expect-error\n const result = this.wsk[property](...paramsJs);\n return new JsNode(this.api, this.nodes, result);\n } catch (error) {\n console.error('A problem with call', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n console.error('JsNode.nextCall - wrong parameters', { path, args });\n return null;\n }\n\n nextGetProps(path: Array, args: Array): JsNode | null {\n const result: Record = {};\n\n for (const property of args) {\n if (GuardJsValue.isString(property)) {\n const value = this.getByProperty(path, property);\n if (value === null) {\n return null;\n }\n\n result[property] = value.toValue();\n } else {\n console.error('JsNode.nextGetProps - wrong parameters', { path, args, property });\n return null;\n }\n }\n\n return new JsNode(this.api, this.nodes, result);\n }\n}\n","import { wasmInit, ModuleControllerType } from './wasm_init';\nimport { ApiBrowser as ApiBrowser } from './api_browser';\nimport { JsNode } from './js_node';\n\n//Number -> u32 or i32\n//BigInt -> u64 or i64\n\nexport type ImportType = {\n panic_message: (ptr: number, length: number) => void,\n //call from rust\n dom_access: (ptr: number, size: number) => number,\n}\n\nexport type ExportType = {\n alloc: (size: number) => number,\n free: (pointer: number) => void,\n wasm_callback: (callback_id: bigint, value_ptr: number) => bigint, //result => pointer: 32bit, size: 32bit\n vertigo_entry_function: (major: number, minor: number) => void,\n}\n\nexport class WasmModule {\n private readonly wasm: ModuleControllerType;\n\n private constructor(\n wasm: ModuleControllerType,\n ) {\n this.wasm = wasm;\n }\n\n public vertigo_entry_function(major: number, minor: number) {\n this.wasm.exports.vertigo_entry_function(major, minor);\n }\n\n public static async create(wasmBinPath: string): Promise {\n let wasmModule: ModuleControllerType | null = null;\n\n const getWasm = (): ModuleControllerType => {\n if (wasmModule === null) {\n throw Error('Wasm is no initialized');\n }\n\n return wasmModule;\n };\n\n const apiBrowser = new ApiBrowser(getWasm);\n\n //@ts-expect-error\n window.$vertigoApi = apiBrowser;\n\n wasmModule = await wasmInit(wasmBinPath, {\n mod: {\n panic_message: (ptr: number, size: number) => {\n const decoder = new TextDecoder(\"utf-8\");\n const m = getWasm().getUint8Memory().subarray(ptr, ptr + size);\n const message = decoder.decode(m);\n console.error('PANIC', message);\n },\n dom_access: (ptr: number, size: number): number => {\n let args = getWasm().decodeArguments(ptr, size);\n if (Array.isArray(args)) {\n const path = args;\n let wsk = new JsNode(apiBrowser, apiBrowser.dom.nodes, null);\n\n for (const pathItem of path) {\n const newWsk = wsk.next(path, pathItem);\n\n if (newWsk === null) {\n return 0;\n }\n\n wsk = newWsk;\n }\n\n return getWasm().valueSaveToBuffer(wsk.toValue());\n }\n\n console.error('dom_access - wrong parameters', args);\n return 0;\n },\n }\n });\n\n return new WasmModule(wasmModule);\n }\n}\n","import { WasmModule } from \"./wasm_module\";\n\n// vertigo-cli compatibility version, change together with package version.\nconst VERTIGO_COMPAT_VERSION_MAJOR = 0;\nconst VERTIGO_COMPAT_VERSION_MINOR = 6;\n\nconst moduleRun: Set = new Set();\n\nconst runModule = async (wasm: string) => {\n if (moduleRun.has(wasm)) {\n //ok, module is run\n return;\n }\n\n if (moduleRun.size > 0) {\n console.error('Only one wasm module can be run', { moduleRun, wasm });\n return;\n }\n\n moduleRun.add(wasm);\n\n console.info(`Wasm module: \"${wasm}\" -> start`);\n const wasmModule = await WasmModule.create(wasm);\n console.info(`Wasm module: \"${wasm}\" -> initialized`);\n wasmModule.vertigo_entry_function(VERTIGO_COMPAT_VERSION_MAJOR, VERTIGO_COMPAT_VERSION_MINOR);\n console.info(`Wasm module: \"${wasm}\" -> launched vertigo_entry_function with version ${VERTIGO_COMPAT_VERSION_MAJOR}.${VERTIGO_COMPAT_VERSION_MINOR}`);\n};\n\nconst findAndRunModule = async () => {\n document.querySelectorAll('*[data-vertigo-run-wasm]').forEach((node) => {\n const wasm = node.getAttribute('data-vertigo-run-wasm');\n\n if (typeof wasm === 'string') {\n runModule(wasm);\n } else {\n console.error('Run error', node);\n }\n });\n};\n\n(() => {\n window.addEventListener('load', findAndRunModule);\n setTimeout(findAndRunModule, 3000);\n})();\n"],"names":["assertNever","_value","Error","decoder","TextDecoder","encoder","TextEncoder","BufferCursor","constructor","getUint8Memory","ptr","size","this","pointer","dataView","DataView","buffer","getByte","value","getUint8","setByte","byte","setUint8","getU16","getUint16","setU16","setUint16","getU32","getUint32","setU32","setUint32","getI32","getInt32","setI32","setInt32","getU64","getBigUint64","setU64","setBigUint64","getI64","getBigInt64","setI64","setBigInt64","getF64","getFloat64","setF64","setFloat64","getBuffer","result","subarray","setBuffer","length","set","getString","decode","setString","encode","getSavedSize","getStringSize","GuardJsValue","isString","isStringOrNull","isNumber","type","JsValueConst","I32","U32","isBigInt","I64","U64","JsJsonConst","jsJsonGetSize","Array","isArray","sum","item","key","propertyValue","Object","entries","jsJsonDecodeItem","cursor","typeParam","out","listSize","i","push","saveJsJsonToBufferItem","list","F64","True","False","Null","Undefined","Vec","String","List","Json","jsValueDecodeItem","json","console","error","getSize","Uint8Array","saveToBufferItem","undefined","convertFromJsValue","newList","convertToJsValue","BigInt","convertToJsJson","_error","propName","propValue","map","warn","wasmInit","async","wasmBinPath","imports","module_instance","WebAssembly","instantiateStreaming","stream","fetch","err","info","resp","binary","arrayBuffer","instantiate","fetchModule","cacheGetUint8Memory","instance","exports","memory","Memory","decodeArguments","jsValueDecode","valueSaveToBuffer","alloc","savedSize","saveToBuffer","wasm_callback","callback_id","value_ptr","result_ptr_and_size","response","Number","free","Cookies","get","cname","cookie","document","split","cookieChunk","trim","cookieName","cookieValue","decodeURIComponent","get_json","cvalue_str","JSON","parse","e","cvalue","expires_in","cvalueEncoded","encodeURIComponent","d","Date","setTime","getTime","expires","toUTCString","set_json","stringify","Interval","getWasm","interval_set","duration","setInterval","interval_clear","timer_id","clearInterval","timeout_set","setTimeout","timeout_clear","clearTimeout","HashRouter","trigger","callback","from","values","add","remove","delete","new_hash","location","hash","Map","window","addEventListener","substr","catchError","wasm","callbackSuccess","responseMessage","toString","status","Fetch","fetch_send_request","method","url","headers","body","fetch_send_request_inner","fetchHeaders","fetchBody","headersRecord","Headers","has","getHeadersAndBody","responseType","contentType","typeClear","toLowerCase","getTypeResponse","text","textUint8Array","EventEmitter","events","Set","on","isActive","onExec","param","eventsCopy","itemCallbackToRun","PromiseBoxRace","promiseResolveReject","resolve","reject","isFulfilled","promise","Promise","localResolve","localReject","createPromiseValue","reconnectDelay","label","timeout_retry","timeout","LogContext","host","formatLog","message","SocketConnection","close","send","eventMessage","connect","log","done","socket","WebSocket","isClose","closeSocket","socketConnection","event","dataRaw","data","startSocket","timeout_connection","onMessage","isConnect","openSocketResult","catch","dispose","DriverWebsocket","websocket_register_callback","controller","controllerList","assertNeverMessage","websocket_unregister_callback","websocket_send_message","MapNodes","get_root_html","documentElement","get_root_head","head","get_root_body","id","get_any_option","get_any","get_node_element","node","HTMLElement","get_node","Element","get_text","Text","get_comment","Comment","DriverDom","historyLocation","get_node_to_clear","element","childNodes","forEach","get_to_clear","initBeforeFirstUpdate","nodes","dom_bulk_update","commands","node_head","node_body","setFocus","command","bulk_update_command","name","toLocaleLowerCase","focus","callbacks","ev","preventDefault","debugNodes","ids","create_node","createElementNS","createElement","href","getAttribute","startsWith","scrollTo","set_attribute","setAttribute","HTMLInputElement","HTMLTextAreaElement","defaultValue","remove_attribute","removeAttribute","remove_node","create_text","createTextNode","remove_text","update_text","textContent","insert_before","parent","child","ref_id","parentNode","childNode","insertBefore","ref_node","insert_css","selector","style","content","appendChild","callback_click","callback_input","target","callback_change","HTMLSelectElement","callback_blur","_event","callback_mousedown","callback_mouseup","callback_mouseenter","callback_mouseleave","callback_drop","DragEvent","dataTransfer","files","items","file","getAsFile","then","all","params","callback_keydown","KeyboardEvent","code","altKey","ctrlKey","shiftKey","metaKey","stopPropagation","callback_load","callback_add","event_name","callback_remove","removeEventListener","assertNeverCommand","comment","createComment","HistoryLocation","history","pushState","replace","replaceState","pathname","search","ApiBrowser","getRandom","min","max","range","Math","floor","random","isBrowser","get_env","interval","hashRouter","websocket","dom","JsNode","api","wsk","getByProperty","path","property","nextCurrentPointer","toValue","next","commandName","args","nextApi","nextRoot","nextGet","nextSet","nextCall","nextGetProps","firstName","rest","domId","getArgs","setArgs","callArgs","paramsJs","WasmModule","vertigo_entry_function","major","minor","create","wasmModule","apiBrowser","$vertigoApi","mod","panic_message","m","dom_access","pathItem","newWsk","moduleRun","findAndRunModule","querySelectorAll","runModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"wasm_run.js","sources":["src_js/assert_never.ts","src_js/buffer_cursor.ts","src_js/guard.ts","src_js/jsjson.ts","src_js/jsvalue.ts","src_js/wasm_init.ts","src_js/api_browser/cookies.ts","src_js/api_browser/interval.ts","src_js/api_browser/hashrouter.ts","src_js/api_browser/fetch.ts","src_js/api_browser/websocket/event_emiter.ts","src_js/api_browser/websocket/promise.ts","src_js/api_browser/websocket/connection.ts","src_js/api_browser/websocket/websocket.ts","src_js/api_browser/dom/map_nodes.ts","src_js/api_browser/dom/dom.ts","src_js/api_browser/historyLocation.ts","src_js/api_browser.ts","src_js/js_node.ts","src_js/wasm_module.ts","src_js/index.ts"],"sourcesContent":["\nexport const assertNever = (_value: never) => {\n throw Error(\"assert never\");\n}\n","///https://javascript.info/arraybuffer-binary-arrays#dataview\n\nconst decoder = new TextDecoder(\"utf-8\");\nconst encoder = new TextEncoder();\n\nexport class BufferCursor {\n private dataView: DataView;\n private pointer: number = 0;\n\n constructor(\n private getUint8Memory: () => Uint8Array,\n private ptr: number,\n private size: number,\n ) {\n this.dataView = new DataView(\n this.getUint8Memory().buffer,\n this.ptr,\n this.size\n );\n }\n\n public getByte(): number {\n const value = this.dataView.getUint8(this.pointer);\n this.pointer += 1;\n return value;\n }\n\n public setByte(byte: number) {\n this.dataView.setUint8(this.pointer, byte);\n this.pointer += 1;\n }\n\n public getU16(): number {\n const value = this.dataView.getUint16(this.pointer);\n this.pointer += 2;\n return value;\n }\n\n public setU16(value: number) {\n this.dataView.setUint16(this.pointer, value);\n this.pointer += 2;\n }\n\n public getU32(): number {\n const value = this.dataView.getUint32(this.pointer);\n this.pointer += 4;\n return value;\n }\n\n public setU32(value: number) {\n this.dataView.setUint32(this.pointer, value);\n this.pointer += 4;\n }\n\n public getI32(): number {\n const value = this.dataView.getInt32(this.pointer);\n this.pointer += 4;\n return value;\n }\n\n public setI32(value: number) {\n this.dataView.setInt32(this.pointer, value);\n this.pointer += 4;\n }\n\n public getU64(): bigint {\n const value = this.dataView.getBigUint64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setU64(value: bigint) {\n this.dataView.setBigUint64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getI64(): bigint {\n const value = this.dataView.getBigInt64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setI64(value: bigint) {\n this.dataView.setBigInt64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getF64(): number {\n const value = this.dataView.getFloat64(this.pointer);\n this.pointer += 8;\n return value;\n }\n\n public setF64(value: number) {\n this.dataView.setFloat64(this.pointer, value);\n this.pointer += 8;\n }\n\n public getBuffer(): Uint8Array {\n const size = this.getU32();\n const result = this\n .getUint8Memory()\n .subarray(\n this.ptr + this.pointer,\n this.ptr + this.pointer + size\n );\n\n this.pointer += size;\n return result;\n }\n\n public setBuffer(buffer: Uint8Array) {\n const size = buffer.length;\n this.setU32(size);\n\n const sub_buffer = this\n .getUint8Memory()\n .subarray(\n this.ptr + this.pointer,\n this.ptr + this.pointer + size\n );\n\n sub_buffer.set(buffer);\n\n this.pointer += size;\n }\n\n public getString(): string {\n return decoder.decode(this.getBuffer());\n }\n\n public setString(value: string) {\n const buffer = encoder.encode(value);\n this.setBuffer(buffer);\n }\n\n public getSavedSize(): number {\n return this.pointer;\n }\n}\n\nexport const getStringSize = (value: string): number => {\n return new TextEncoder().encode(value).length;\n};\n\n","import { JsValueType, JsValueConst } from \"./jsvalue\";\n\nexport namespace GuardJsValue {\n export const isString = (value: JsValueType): value is string => {\n return typeof value === 'string';\n }\n\n export const isStringOrNull = (value: JsValueType): value is string | null => {\n return value === null || typeof value === 'string';\n }\n\n export const isNumber = (value: JsValueType): value is { type: typeof JsValueConst.U32, value: number } | { type: typeof JsValueConst.I32, value: number } => {\n if (typeof value === 'object' && value !== null && 'type' in value) {\n return value.type === JsValueConst.I32 || value.type === JsValueConst.U32\n }\n\n return false;\n }\n\n export const isBigInt = (value: JsValueType): value is { type: typeof JsValueConst.U64, value: bigint } | { type: typeof JsValueConst.I64, value: bigint } => {\n if (typeof value === 'object' && value !== null && 'type' in value) {\n return value.type === JsValueConst.I64 || value.type === JsValueConst.U64\n }\n\n return false;\n }\n}\n","import { BufferCursor, getStringSize } from \"./buffer_cursor\";\n\nconst JsJsonConst = {\n True: 1,\n False: 2,\n Null: 3,\n\n String: 4,\n Number: 5,\n List: 6,\n Object: 7,\n} as const;\n\nexport type JsJsonType\n = boolean\n | null\n | number\n | string\n | Array\n | JsJsonMapType;\n\ninterface JsJsonMapType {\n [key: string]: JsJsonType\n}\n\nexport const jsJsonGetSize = (value: JsJsonType): number => {\n\n if (typeof value === 'boolean') {\n return 1;\n }\n\n if (value === null) {\n return 1;\n }\n\n if (typeof value === 'string') {\n return 1 + 4 + getStringSize(value);\n }\n\n if (Array.isArray(value)) {\n let sum = 1 + 4;\n\n for (const item of value) {\n sum += jsJsonGetSize(item);\n }\n\n return sum;\n }\n\n if (typeof value === 'number') {\n return 9; //1 + 8\n }\n\n //object\n let sum = 1 + 2;\n\n for (const [key, propertyValue] of Object.entries(value)) {\n sum += 4 + getStringSize(key);\n sum += jsJsonGetSize(propertyValue);\n }\n\n return sum;\n};\n\nexport const jsJsonDecodeItem = (cursor: BufferCursor): JsJsonType => {\n const typeParam = cursor.getByte();\n\n if (typeParam === JsJsonConst.True) {\n return true;\n }\n\n if (typeParam === JsJsonConst.False) {\n return false;\n }\n\n if (typeParam === JsJsonConst.Null) {\n return null;\n }\n\n if (typeParam === JsJsonConst.String) {\n return cursor.getString();\n }\n\n if (typeParam === JsJsonConst.Number) {\n return cursor.getF64();\n }\n\n if (typeParam === JsJsonConst.List) {\n const out: Array = [];\n\n const listSize = cursor.getU32();\n\n for (let i=0; i = {};\n\n const listSize = cursor.getU16();\n\n for (let i=0; i {\n if (value === true) {\n cursor.setByte(JsJsonConst.True);\n return;\n }\n\n if (value === false) {\n cursor.setByte(JsJsonConst.False);\n return;\n }\n\n if (value === null) {\n cursor.setByte(JsJsonConst.Null);\n return;\n }\n\n if (typeof value === 'string') {\n cursor.setByte(JsJsonConst.String);\n cursor.setString(value);\n return;\n }\n\n if (typeof value === 'number') {\n cursor.setByte(JsJsonConst.Number);\n cursor.setF64(value);\n return;\n }\n\n if (Array.isArray(value)) {\n cursor.setByte(JsJsonConst.List);\n cursor.setU32(value.length);\n\n for (const item of value) {\n saveJsJsonToBufferItem(item, cursor);\n }\n\n return;\n }\n\n //object\n const list: Array<[string, JsJsonType]> = [];\n\n for (const [key, propertyValue] of Object.entries(value)) {\n list.push([key, propertyValue]);\n }\n\n cursor.setByte(JsJsonConst.Object);\n cursor.setU16(list.length);\n\n for (const [key, propertyValue] of list) {\n cursor.setString(key);\n saveJsJsonToBufferItem(propertyValue, cursor);\n }\n};\n","import { assertNever } from \"./assert_never\";\nimport { BufferCursor, getStringSize } from \"./buffer_cursor\";\nimport { GuardJsValue } from \"./guard\";\nimport { jsJsonDecodeItem, jsJsonGetSize, JsJsonType, saveJsJsonToBufferItem } from \"./jsjson\";\n\nexport const JsValueConst = {\n U32: 1,\n I32: 2,\n U64: 3,\n I64: 4,\n F64: 5,\n\n True: 6,\n False: 7,\n Null: 8,\n Undefined: 9,\n\n Vec: 10,\n String: 11,\n List: 12,\n Object: 13,\n Json: 14,\n} as const;\n\nexport type JsValueType\n = { type: typeof JsValueConst.U32, value: number, }\n | { type: typeof JsValueConst.I32, value: number, }\n | { type: typeof JsValueConst.U64, value: bigint, }\n | { type: typeof JsValueConst.I64, value: bigint, }\n | { type: typeof JsValueConst.F64, value: number, }\n | boolean\n | null\n | undefined\n | string\n | Array\n | Uint8Array\n | { type: typeof JsValueConst.Object, value: JsValueMapType }\n | { type: typeof JsValueConst.Json, value: JsJsonType };\n\ninterface JsValueMapType {\n [key: string]: JsValueType\n}\n\n//https://github.com/unsplash/unsplash-js/pull/174\n// export type AnyJson = boolean | number | string | null | JsonArray | JsonMap;\n// export interface JsonMap { [key: string]: AnyJson }\n// export interface JsonArray extends Array {}\n\n\nconst jsValueDecodeItem = (cursor: BufferCursor): JsValueType => {\n const typeParam = cursor.getByte();\n\n if (typeParam === JsValueConst.U32) {\n return {\n type: JsValueConst.U32,\n value: cursor.getU32()\n };\n }\n\n if (typeParam === JsValueConst.I32) {\n return {\n type: JsValueConst.I32,\n value: cursor.getI32()\n };\n }\n\n if (typeParam === JsValueConst.U64) {\n return {\n type: JsValueConst.U64,\n value: cursor.getU64()\n };\n }\n\n if (typeParam === JsValueConst.I64) {\n return {\n type: JsValueConst.I64,\n value: cursor.getI64()\n };\n }\n\n if (typeParam === JsValueConst.F64) {\n return {\n type: JsValueConst.F64,\n value: cursor.getF64()\n };\n }\n\n if (typeParam === JsValueConst.True) {\n return true;\n }\n\n if (typeParam === JsValueConst.False) {\n return false;\n }\n\n if (typeParam === JsValueConst.Null) {\n return null;\n }\n\n if (typeParam === JsValueConst.Undefined) {\n return undefined;\n }\n\n if (typeParam === JsValueConst.Vec) {\n return cursor.getBuffer();\n }\n\n if (typeParam === JsValueConst.String) {\n return cursor.getString();\n }\n\n if (typeParam === JsValueConst.List) {\n const out: Array = [];\n\n const listSize = cursor.getU32();\n\n for (let i=0; i = {};\n\n const listSize = cursor.getU16();\n\n for (let i=0; i Uint8Array, ptr: number, size: number): JsValueType => {\n try {\n const cursor = new BufferCursor(getUint8Memory, ptr, size);\n return jsValueDecodeItem(cursor);\n } catch (err) {\n console.error(err);\n return [];\n }\n};\n\nconst getSize = (value: JsValueType): number => {\n if (\n value === true ||\n value === false ||\n value === null ||\n value === undefined\n ) {\n return 1;\n }\n\n if (GuardJsValue.isString(value)) {\n return 1 + 4 + getStringSize(value);\n }\n\n if (Array.isArray(value)) {\n let sum = 1 + 4;\n\n for (const item of value) {\n sum += getSize(item);\n }\n\n return sum;\n }\n\n if (value instanceof Uint8Array) {\n return 1 + 4 + value.length;\n }\n\n if (value.type === JsValueConst.I32 || value.type === JsValueConst.U32) {\n return 5; // 1 + 4\n }\n\n if (value.type === JsValueConst.I64 || value.type === JsValueConst.U64 || value.type == JsValueConst.F64) {\n return 9; // 1 + 8\n }\n\n if (value.type === JsValueConst.Object) {\n let sum = 1 + 2;\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n sum += 4 + getStringSize(key);\n sum += getSize(propertyValue);\n }\n\n return sum;\n }\n\n if (value.type === JsValueConst.Json) {\n return 1 + jsJsonGetSize(value.value);\n }\n\n return assertNever(value);\n};\n\nconst saveToBufferItem = (value: JsValueType, cursor: BufferCursor) => {\n if (value === true) {\n cursor.setByte(JsValueConst.True);\n return;\n }\n\n if (value === false) {\n cursor.setByte(JsValueConst.False);\n return;\n }\n\n if (value === null) {\n cursor.setByte(JsValueConst.Null);\n return;\n }\n\n if (value === undefined) {\n cursor.setByte(JsValueConst.Undefined);\n return;\n }\n\n if (value instanceof Uint8Array) {\n cursor.setByte(JsValueConst.Vec);\n cursor.setBuffer(value);\n return;\n }\n\n if (GuardJsValue.isString(value)) {\n cursor.setByte(JsValueConst.String);\n cursor.setString(value);\n return;\n }\n\n if (Array.isArray(value)) {\n cursor.setByte(JsValueConst.List);\n cursor.setU32(value.length);\n\n for (const item of value) {\n saveToBufferItem(item, cursor);\n }\n\n return;\n }\n\n if (value.type === JsValueConst.U32) {\n cursor.setByte(JsValueConst.U32);\n cursor.setU32(value.value);\n return;\n }\n\n if (value.type === JsValueConst.I32) {\n cursor.setByte(JsValueConst.I32);\n cursor.setI32(value.value);\n return;\n }\n\n if (value.type === JsValueConst.U64) {\n cursor.setByte(JsValueConst.U64);\n cursor.setU64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.I64) {\n cursor.setByte(JsValueConst.I64);\n cursor.setI64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.F64) {\n cursor.setByte(JsValueConst.F64);\n cursor.setF64(value.value);\n return;\n }\n\n if (value.type === JsValueConst.Object) {\n const list: Array<[string, JsValueType]> = [];\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n list.push([key, propertyValue]);\n }\n\n cursor.setByte(JsValueConst.Object);\n cursor.setU16(list.length);\n\n for (const [key, propertyValue] of list) {\n cursor.setString(key);\n saveToBufferItem(propertyValue, cursor);\n }\n return;\n }\n\n if (value.type === JsValueConst.Json) {\n cursor.setByte(JsValueConst.Json);\n saveJsJsonToBufferItem(value.value, cursor);\n return;\n }\n\n return assertNever(value);\n};\n\nexport const saveToBuffer = (\n getUint8Memory: () => Uint8Array,\n alloc: (size: number) => number,\n value: JsValueType,\n): number => {\n if (value === undefined) {\n return 0;\n }\n\n const size = getSize(value);\n const ptr = alloc(size);\n\n const cursor = new BufferCursor(getUint8Memory, ptr, size);\n saveToBufferItem(value, cursor);\n\n if (size !== cursor.getSavedSize()) {\n console.error({\n size,\n savedSize: cursor.getSavedSize(),\n });\n\n throw Error('Mismatch between calculated and recorded size');\n }\n\n return ptr;\n};\n\nexport const convertFromJsValue = (value: JsValueType): unknown => {\n if (value === true) {\n return true;\n }\n\n if (value === false) {\n return false;\n }\n\n if (value === null) {\n return null;\n }\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value instanceof Uint8Array) {\n return value;\n }\n\n if (GuardJsValue.isString(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n const newList = [];\n\n for (const item of value) {\n newList.push(convertFromJsValue(item));\n }\n\n return newList;\n }\n\n if (value.type === JsValueConst.U32 || value.type === JsValueConst.I32) {\n return value.value;\n }\n\n if (value.type === JsValueConst.U64 || value.type === JsValueConst.I64 || value.type === JsValueConst.F64) {\n return value.value;\n }\n\n if (value.type === JsValueConst.Object) {\n const result: Record = {};\n\n for (const [key, propertyValue] of Object.entries(value.value)) {\n result[key] = convertFromJsValue(propertyValue);\n }\n\n return result;\n }\n\n if (value.type === JsValueConst.Json) {\n return value.value;\n }\n\n return assertNever(value);\n};\n\n//throws an exception when it fails to convert to JsValue\nexport const convertToJsValue = (value: unknown): JsValueType => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === true || value === false || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === 'number') {\n if (value === (value | 0)) {\n // is integer\n if (-(2 ** 31) <= value && value < 2 ** 31) {\n return {\n type: JsValueConst.I32,\n value\n };\n }\n\n return {\n type: JsValueConst.I64,\n value: BigInt(value)\n };\n } else {\n // is float\n return {\n type: JsValueConst.F64,\n value: value,\n }\n }\n }\n\n if (typeof value === 'bigint') {\n return {\n type: JsValueConst.I64,\n value\n };\n }\n\n if (value instanceof Uint8Array) {\n return value;\n }\n\n if (typeof value === 'object') {\n try {\n const json = convertToJsJson(value);\n return {\n type: JsValueConst.Json,\n value: json\n };\n } catch (_error) {\n }\n\n const result: Record = {};\n\n for (const [propName, propValue] of Object.entries(value)) {\n result[propName] = convertToJsValue(propValue);\n }\n\n return {\n type: JsValueConst.Object,\n value: result\n };\n }\n\n if (Array.isArray(value)) {\n try {\n const list = value.map(convertToJsJson);\n return {\n type: JsValueConst.Json,\n value: list\n };\n } catch (_error) {\n return value.map(convertToJsValue);\n }\n }\n\n console.warn('convertToJsValue', value);\n throw Error('It is not possible to convert this data to JsValue');\n};\n\n//throws an exception when it fails to convert to JsJson\nexport const convertToJsJson = (value: unknown): JsJsonType => {\n if (typeof value === 'boolean' || value === null || typeof value === 'number' || typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(convertToJsJson);\n }\n\n if (typeof value === 'object') {\n const result: Record = {};\n\n for (const [propName, propValue] of Object.entries(value)) {\n result[propName] = convertToJsJson(propValue);\n }\n\n return result;\n }\n\n console.warn('convertToJsJson', value);\n throw Error('It is not possible to convert this data to JsJson');\n};\n","import { jsValueDecode, JsValueType, saveToBuffer } from './jsvalue';\n\nexport interface BaseExportType {\n alloc: (size: number) => number,\n free: (pointer: number) => void,\n wasm_callback: (callback_id: bigint, value_ptr: number) => bigint, //result => pointer: 32bit, size: 32bit\n};\n\nexport interface ModuleControllerType {\n exports: ExportType,\n decodeArguments: (ptr: number, size: number) => JsValueType,\n getUint8Memory: () => Uint8Array,\n wasm_callback: (callback_id: bigint, params: JsValueType) => JsValueType,\n valueSaveToBuffer: (value: JsValueType) => number,\n}\n\nconst fetchModule = async (wasmBinPath: string, imports: Record): Promise => {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n const stream = fetch(wasmBinPath);\n try {\n const module = await WebAssembly.instantiateStreaming(stream, imports);\n return module;\n } catch (err) {\n console.warn(\"`WebAssembly.instantiateStreaming` failed. This could happen if your server does not serve wasm with `application/wasm` MIME type, but check the original error too. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", err);\n }\n }\n\n console.info('fetchModule by WebAssembly.instantiate');\n\n const resp = await fetch(wasmBinPath);\n const binary = await resp.arrayBuffer();\n const module_instance = await WebAssembly.instantiate(binary, imports);\n return module_instance;\n};\n\nexport const wasmInit = async , ExportType extends BaseExportType>(\n wasmBinPath: string,\n imports: { mod: ImportType },\n): Promise> => {\n const module_instance = await fetchModule(wasmBinPath, imports);\n\n let cacheGetUint8Memory: Uint8Array = new Uint8Array(1);\n\n const getUint8Memory = () => {\n if (module_instance.instance.exports.memory instanceof WebAssembly.Memory) {\n if (cacheGetUint8Memory.buffer !== module_instance.instance.exports.memory.buffer) {\n cacheGetUint8Memory = new Uint8Array(module_instance.instance.exports.memory.buffer);\n }\n return cacheGetUint8Memory;\n } else {\n throw Error('Missing memory');\n }\n };\n\n //@ts-expect-error\n const exports: ExportType = module_instance.instance.exports;\n\n const decodeArguments = (ptr: number, size: number) => jsValueDecode(getUint8Memory, ptr, size);\n\n const valueSaveToBuffer = (value: JsValueType): number => saveToBuffer(getUint8Memory, exports.alloc, value);\n\n const wasm_callback = (callback_id: bigint, value: JsValueType): JsValueType => {\n const value_ptr = valueSaveToBuffer(value);\n let result_ptr_and_size = exports.wasm_callback(callback_id, value_ptr);\n\n if (result_ptr_and_size === 0n) {\n return undefined;\n }\n\n const size = result_ptr_and_size % (2n ** 32n);\n const ptr = result_ptr_and_size >> 32n;\n\n if (ptr >= 2n ** 32n) {\n console.error(`Overflow of a variable with a pointer result_ptr_and_size=${result_ptr_and_size}`);\n }\n\n const response = decodeArguments(Number(ptr), Number(size));\n exports.free(Number(ptr));\n\n return response;\n };\n\n return {\n exports,\n decodeArguments,\n getUint8Memory,\n wasm_callback,\n valueSaveToBuffer,\n };\n};\n","import { JsJsonType } from \"../jsjson\";\n\nexport class Cookies {\n public get = (cname: string): string => {\n for (const cookie of document.cookie.split(';')) {\n if (cookie === \"\") continue;\n\n const cookieChunk = cookie.trim().split('=');\n\n if (cookieChunk.length !== 2) {\n console.warn(`Cookies.get: Incorrect number of cookieChunk => ${cookieChunk.length} in ${cookie}`);\n continue;\n }\n\n const cookieName = cookieChunk[0];\n const cookieValue = cookieChunk[1];\n\n if (cookieName === undefined || cookieValue === undefined) {\n console.warn(`Cookies.get: Broken cookie part => ${cookie}`);\n continue;\n }\n\n if (cookieName === cname) {\n return decodeURIComponent(cookieValue);\n }\n }\n\n return '';\n }\n\n public get_json = (cname: string): JsJsonType => {\n let cvalue_str = this.get(cname);\n\n if (cvalue_str.length !== 0) {\n try {\n let cookie_value = JSON.parse(cvalue_str);\n return cookie_value;\n } catch (e) {\n console.error!(\"Error deserializing cookie\", e);\n }\n }\n return null\n }\n\n public set = (\n cname: string,\n cvalue: string,\n expires_in: bigint,\n ) => {\n const cvalueEncoded = cvalue == null ? \"\" : encodeURIComponent(cvalue);\n\n const d = new Date();\n d.setTime(d.getTime() + (Number(expires_in) * 1000));\n let expires = \"expires=\"+ d.toUTCString();\n\n document.cookie = `${cname}=${cvalueEncoded};${expires};path=/;samesite=strict\"`;\n }\n\n public set_json = (\n cname: string,\n cvalue: JsJsonType,\n expires_in: bigint,\n ) => {\n let cvalue_str = JSON.stringify(cvalue);\n\n this.set(cname, cvalue_str, expires_in);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nexport class Interval {\n private readonly getWasm: () => ModuleControllerType;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n }\n\n public interval_set = (duration: number, callback_id: bigint): ReturnType => {\n const timer_id = setInterval(() => {\n this.getWasm().wasm_callback(callback_id, undefined);\n }, duration);\n\n return timer_id;\n }\n\n public interval_clear = (timer_id: number) => {\n clearInterval(timer_id);\n }\n\n timeout_set = (duration: number, callback_id: bigint): ReturnType => {\n const timeout_id = setTimeout(() => {\n this.getWasm().wasm_callback(callback_id, undefined);\n }, duration);\n\n return timeout_id;\n }\n\n timeout_clear = (timer_id: number): void => {\n clearTimeout(timer_id);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nexport class HashRouter {\n private getWasm: () => ModuleControllerType;\n private callback: Map void>;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.callback = new Map();\n\n window.addEventListener(\"hashchange\", this.trigger);\n }\n\n private trigger = () => {\n for (const callback of Array.from(this.callback.values())) {\n callback();\n }\n }\n\n public add = (callback_id: bigint) => {\n this.callback.set(callback_id, () => {\n this.getWasm().wasm_callback(callback_id, this.get());\n });\n }\n\n public remove = (callback_id: bigint) => {\n this.callback.delete(callback_id);\n }\n\n public push = (new_hash: string) => {\n if (this.get() === new_hash) {\n return;\n }\n\n location.hash = new_hash;\n this.trigger();\n }\n\n public get(): string {\n return decodeURIComponent(location.hash.substr(1));\n }\n}\n","import { JsJsonType } from \"../jsjson\";\nimport { JsValueConst } from \"../jsvalue\";\nimport { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\n\nconst getTypeResponse = (contentType: string | null): 'json' | 'text' | 'bin' => {\n if (contentType === null) {\n console.info('Missing header content-type');\n return 'bin';\n }\n\n const [type] = contentType.split(\";\");\n\n if (type === undefined) {\n console.error('Missing value for content-type');\n return 'bin';\n }\n\n const typeClear = type.toLowerCase().trim();\n\n if (typeClear === 'application/json') {\n return 'json';\n }\n\n if (typeClear === 'text/plain') {\n return 'text';\n }\n\n console.error(`No match found for content-type=${contentType}`);\n return 'bin';\n}\n\nconst catchError = async (\n wasm: ModuleControllerType,\n callback_id: bigint,\n response: Response,\n callbackSuccess: (response: Response) => Promise\n) => {\n try {\n await callbackSuccess(response);\n } catch (error) {\n console.error('fetch error (2) - json', error);\n const responseMessage = new String(error).toString();\n\n wasm.wasm_callback(callback_id, [\n false, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n responseMessage //body (string)\n ]);\n }\n};\n\nconst getHeadersAndBody = (headersRecord: Record, body: undefined | string | Uint8Array | JsJsonType | undefined): [Headers, string | ArrayBuffer | undefined] => {\n const headers = new Headers(headersRecord);\n\n if (body === undefined) {\n return [\n headers,\n undefined\n ]\n }\n\n if (typeof body === 'string') {\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'text/plain; charset=utf-8');\n }\n\n return [\n headers,\n body\n ];\n }\n\n\n if (body instanceof Uint8Array) {\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'application/octet-stream');\n }\n\n return [\n headers,\n body\n ];\n }\n\n //JsJsonType\n if (headers.has('content-type') === false) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n\n return [\n headers,\n JSON.stringify(body),\n ];\n};\n\nexport class Fetch {\n private readonly getWasm: () => ModuleControllerType;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n }\n\n public fetch_send_request = (\n callback_id: bigint,\n method: string,\n url: string,\n headers: Record,\n body: string | Uint8Array | JsJsonType | undefined,\n ) => {\n this.fetch_send_request_inner(callback_id, method, url, headers, body);\n }\n\n private fetch_send_request_inner = async (\n callback_id: bigint,\n method: string,\n url: string,\n headers: Record,\n body: string | Uint8Array | JsJsonType | undefined,\n ): Promise => {\n const wasm = this.getWasm();\n\n const [fetchHeaders, fetchBody] = getHeadersAndBody(headers, body);\n\n try {\n const response = await fetch(url, {\n method,\n headers: fetchHeaders,\n body: fetchBody,\n });\n\n const contentType = response.headers.get('content-type');\n const responseType = getTypeResponse(contentType);\n\n if (responseType === 'json') {\n catchError(wasm, callback_id, response, async (response) => {\n const json = await response.json();\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n { //body (json)\n type: JsValueConst.Json,\n value: json\n }\n ]);\n });\n return;\n }\n\n if (responseType === 'text') {\n catchError(wasm, callback_id, response, async (response) => {\n const text = await response.text();\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n text //body (text)\n ]);\n });\n return;\n }\n\n catchError(wasm, callback_id, response, async (response) => {\n const text = await response.arrayBuffer();\n const textUint8Array = new Uint8Array(text);\n\n wasm.wasm_callback(callback_id, [\n true, //ok\n { type: JsValueConst.U32, value: response.status }, //http code\n textUint8Array //body (text)\n ]);\n });\n } catch (err) {\n console.error('fetch error (1)', err);\n const responseMessage = new String(err).toString();\n\n wasm.wasm_callback(callback_id, [\n false, //ok\n { type: JsValueConst.U32, value: 0 }, //http code\n responseMessage //body (string)\n ]);\n }\n }\n}\n","export class EventEmitter {\n private events: Set<(param: T) => void>;\n\n constructor() {\n this.events = new Set()\n }\n\n on(callback: (param: T) => void) {\n let isActive = true;\n\n const onExec = (param: T) => {\n if (isActive) {\n callback(param);\n }\n };\n\n this.events.add(onExec);\n\n return () => {\n isActive = false;\n this.events.delete(onExec);\n };\n }\n\n trigger(param: T) {\n const eventsCopy = Array.from(this.events.values())\n\n for (const itemCallbackToRun of eventsCopy) {\n try {\n itemCallbackToRun(param);\n } catch (err) {\n console.error(err);\n }\n }\n }\n\n get size(): number {\n return this.events.size;\n }\n}\n","type ResolveFn = (data: T) => void;\ntype RejectFn = (err: unknown) => void;\n\ninterface PromiseResolveReject {\n readonly resolve: (value: T) => void,\n readonly reject: (err: unknown) => void,\n};\n\nconst createPromiseValue = (): [PromiseResolveReject, Promise] => {\n let resolve: ResolveFn | null = null;\n let reject: RejectFn | null = null;\n\n const promise: Promise = new Promise((localResolve: ResolveFn, localReject: RejectFn) => {\n resolve = localResolve;\n reject = localReject;\n });\n\n if (resolve === null) {\n throw Error('createPromiseValue - resolve is null');\n }\n\n if (reject === null) {\n throw Error('createPromiseValue - reject is null');\n }\n\n const promiseValue = {\n resolve,\n reject,\n };\n\n return [promiseValue, promise];\n};\n\nexport class PromiseBoxRace {\n private promiseResolveReject: PromiseResolveReject | null = null;\n readonly promise: Promise;\n\n constructor() {\n const [promiseResolveReject, promise] = createPromiseValue();\n\n this.promiseResolveReject = promiseResolveReject;\n this.promise = promise;\n }\n\n resolve = (value: T) => {\n const promiseResolveReject = this.promiseResolveReject;\n this.promiseResolveReject = null;\n\n if (promiseResolveReject === null) {\n return;\n }\n\n promiseResolveReject.resolve(value);\n }\n\n reject = (err?: unknown) => {\n const promiseResolveReject = this.promiseResolveReject;\n this.promiseResolveReject = null;\n\n if (promiseResolveReject === null) {\n return;\n }\n\n promiseResolveReject.reject(err);\n }\n\n isFulfilled = (): boolean => {\n return this.promiseResolveReject === null;\n }\n}\n","import { EventEmitter } from \"./event_emiter\";\nimport { PromiseBoxRace } from \"./promise\";\n\nconst timeout = async (timeout: number): Promise => {\n return new Promise((resolve: (data: void) => void) => {\n setTimeout(resolve, timeout);\n });\n};\n\n\nconst reconnectDelay = async (label: string, timeout_retry: number): Promise => {\n console.info(`${label} wait ${timeout_retry}ms`);\n await timeout(timeout_retry);\n console.info(`${label} go forth`);\n};\n\nexport type SocketEventType = {\n type: 'message',\n message: string,\n} | {\n type: 'socket',\n socket: SocketConnection\n} | {\n type: 'close',\n};\n\nexport type OnMessageType = (message: SocketEventType) => void;\nexport type UnsubscribeFnType = () => void;\n\ninterface OpenSocketResult {\n socket: Promise,\n done: Promise,\n}\n\nexport interface SocketConnectionController {\n send: (message: string) => void,\n dispose: UnsubscribeFnType\n}\n\nclass LogContext {\n public constructor(private host: string) {}\n public formatLog = (message: string): string => `Socket ${this.host} ==> ${message}`;\n}\nexport class SocketConnection {\n private readonly eventMessage: EventEmitter;\n public readonly close: () => void;\n public readonly send: (message: string) => void;\n\n private constructor(\n close: () => void,\n send: (message: string) => void,\n ) {\n this.eventMessage = new EventEmitter();\n this.close = close;\n this.send = send;\n }\n\n private static connect(\n log: LogContext,\n host: string,\n timeout: number,\n ): OpenSocketResult {\n const result = new PromiseBoxRace();\n const done = new PromiseBoxRace();\n const socket = new WebSocket(host);\n let isClose: boolean = false;\n\n console.info(log.formatLog('starting ...'));\n\n const closeSocket = (): void => {\n if (isClose) {\n return;\n }\n\n console.info(log.formatLog('close'));\n\n isClose = true;\n result.resolve(null);\n done.resolve();\n socket.close();\n };\n\n\n const socketConnection = new SocketConnection(\n closeSocket,\n (message: string) => {\n if (isClose) {\n return;\n }\n socket.send(message);\n }\n );\n\n setTimeout(() => {\n if (result.isFulfilled() === false) {\n console.error(log.formatLog(`timeout (${timeout}ms)`));\n closeSocket();\n }\n }, timeout);\n\n const onOpen = (): void => {\n console.info(log.formatLog('open'));\n result.resolve(socketConnection);\n };\n\n const onError = (error: Event): void => {\n console.error(log.formatLog('error'), error);\n closeSocket();\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (isClose) {\n return;\n }\n\n const dataRaw = event.data;\n\n if (typeof dataRaw === 'string') {\n socketConnection.eventMessage.trigger(dataRaw);\n return;\n }\n\n console.error(log.formatLog('onMessage - expected string'), dataRaw);\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('error', onError);\n socket.addEventListener('close', closeSocket);\n socket.addEventListener('message', onMessage);\n\n return {\n socket: result.promise,\n done: done.promise\n };\n }\n\n public static startSocket(\n host: string,\n timeout_connection: number,\n timeout_retry: number,\n onMessage: OnMessageType,\n ): SocketConnectionController {\n let isConnect: boolean = true;\n let socketConnection: SocketConnection | null = null;\n\n const log = new LogContext(host);\n\n (async (): Promise => {\n while (isConnect) {\n const openSocketResult = SocketConnection.connect(log, host, timeout_connection);\n\n const socket = await openSocketResult.socket;\n\n if (socket === null) {\n await reconnectDelay(log.formatLog('reconnect after error'), timeout_retry);\n continue;\n }\n\n socketConnection = socket;\n onMessage({\n type: 'socket',\n socket\n });\n\n socket.eventMessage.on(message => {\n onMessage({\n type: 'message',\n message\n });\n });\n\n await openSocketResult.done;\n\n onMessage({\n type: 'close'\n });\n\n if (!isConnect) {\n console.info(log.formatLog('disconnect (1)'));\n return;\n }\n\n await reconnectDelay(log.formatLog('reconnect after close'), timeout_retry);\n }\n\n console.info(log.formatLog('disconnect (2)'));\n })().catch((error) => {\n console.error(error);\n });\n\n return {\n send: (message: string): void => {\n if (socketConnection === null) {\n console.error('send fail - missing connection', message);\n } else {\n socketConnection.send(message);\n }\n },\n dispose: (): void => {\n isConnect = false;\n socketConnection?.close();\n }\n };\n }\n}\n","import { ModuleControllerType } from \"../../wasm_init\";\nimport { ExportType } from \"../../wasm_module\";\nimport { SocketConnection, SocketConnectionController } from \"./connection\";\n\n\nconst assertNeverMessage = (data: never): never => {\n console.error(data);\n throw Error('unknown message');\n};\n\nexport class DriverWebsocket {\n private getWasm: () => ModuleControllerType;\n private readonly controllerList: Map;\n private readonly socket: Map;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.controllerList = new Map();\n this.socket = new Map();\n }\n\n public websocket_register_callback = (\n host: string,\n callback_id: bigint,\n ) => {\n const wasm = this.getWasm();\n\n let controller = SocketConnection.startSocket(\n host,\n 5000, //timeout connection\n 3000, //timeout reconnection\n (message) => {\n\n if (this.controllerList.has(callback_id) === false) {\n return;\n }\n\n if (message.type === 'socket') {\n this.socket.set(callback_id, message.socket);\n wasm.wasm_callback(callback_id, true);\n return;\n }\n\n if (message.type === 'message') {\n wasm.wasm_callback(callback_id, message.message);\n return;\n }\n\n if (message.type === 'close') {\n this.socket.delete(callback_id);\n wasm.wasm_callback(callback_id, false);\n return;\n }\n\n return assertNeverMessage(message);\n }\n );\n\n this.controllerList.set(callback_id, controller);\n }\n\n public websocket_unregister_callback = (callback_id: bigint) => {\n const controller = this.controllerList.get(callback_id);\n\n if (controller === undefined) {\n console.error('Expected controller');\n return;\n }\n\n controller.dispose();\n this.controllerList.delete(callback_id);\n }\n\n public websocket_send_message = (\n callback_id: bigint,\n message: string,\n ) => {\n const socket = this.socket.get(callback_id);\n\n if (socket === undefined) {\n console.error(`Missing socket connection for callback_id=${callback_id}`);\n } else {\n socket.send(message);\n }\n }\n}\n","type NodeType = Element | Comment | Text;\nexport class MapNodes {\n private data: Map;\n\n constructor() {\n this.data = new Map();\n }\n\n public get_root_html(): Element {\n return document.documentElement;\n }\n\n public get_root_head(): Element {\n return document.head;\n }\n\n public get_root_body(): Element {\n return document.body;\n }\n\n public set(id: number, value: NodeType) {\n if (id === 1 || id === 2 || id === 3) {\n //ignore\n } else {\n this.data.set(id, value);\n }\n }\n\n public get_any_option(id: number): NodeType | undefined {\n if (id === 1) {\n return this.get_root_html();\n }\n\n if (id === 2) {\n return this.get_root_head();\n }\n\n if (id === 3) {\n return this.get_root_body();\n }\n\n return this.data.get(id);\n }\n\n public get_any(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n\n if (item === undefined) {\n throw Error(`${label} -> item not found=${id}`);\n }\n\n return item;\n }\n\n public get(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n\n if (item === undefined) {\n throw new Error(`${label}->get: Item id not found = ${id}`);\n }\n return item;\n }\n\n public get_node_element(label: string, id: number): HTMLElement {\n const node = this.get(label, id);\n if (node instanceof HTMLElement) {\n return node;\n } else {\n throw Error(`Expected id=${id} as HTMLElement`);\n }\n }\n\n public get_node(label: string, id: number): Element {\n const node = this.get(label, id);\n if (node instanceof Element) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Element`);\n }\n }\n\n public get_text(label: string, id: number): Text {\n const node = this.get(label, id);\n if (node instanceof Text) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Text`);\n }\n }\n\n public get_comment(label: string, id: number): Comment {\n const node = this.get(label, id);\n if (node instanceof Comment) {\n return node;\n } else {\n throw Error(`Expected id=${id} as Comment`);\n }\n }\n\n public delete(label: string, id: number): NodeType {\n const item = this.get_any_option(id);\n this.data.delete(id);\n\n if (item === undefined) {\n throw new Error(`${label}->delete: Item id not found = ${id}`);\n }\n\n return item;\n }\n}\n","import { ModuleControllerType } from \"../../wasm_init\";\nimport { ExportType } from \"../../wasm_module\";\nimport { HistoryLocation } from \"../historyLocation\";\nimport { MapNodes } from \"./map_nodes\";\n\ninterface FileItemType {\n name: string,\n data: Uint8Array,\n}\n\nconst createElement = (name: string): Element => {\n if (name == \"path\" || name == \"svg\") {\n return document.createElementNS(\"http://www.w3.org/2000/svg\", name);\n } else {\n return document.createElement(name);\n }\n}\n\ntype CommandType = {\n type: 'create_node',\n id: number,\n name: string,\n} | {\n type: 'create_text',\n id: number,\n value: string\n} | {\n type: 'update_text',\n id: number,\n value: string\n} | {\n type: 'set_attr',\n id: number,\n name: string,\n value: string\n} | {\n type: 'remove_attr',\n id: number,\n name: string\n} | {\n type: 'remove_node',\n id: number,\n} | {\n type: 'remove_text',\n id: number,\n} | {\n type: 'insert_before',\n parent: number,\n child: number,\n ref_id: number | null,\n} | {\n type: 'insert_css',\n selector: string,\n value: string\n} | {\n type: 'create_comment',\n id: number,\n value: string\n} | {\n type: 'remove_comment',\n id: number,\n} | {\n type: 'callback_add',\n id: number,\n event_name: string,\n callback_id: number,\n} | {\n type: 'callback_remove',\n id: number,\n event_name: string,\n callback_id: number,\n};\n\nconst assertNeverCommand = (data: never): never => {\n console.error(data);\n throw Error('unknown command');\n};\n\nexport class DriverDom {\n private historyLocation: HistoryLocation;\n private readonly getWasm: () => ModuleControllerType;\n public readonly nodes: MapNodes;\n private callbacks: Map void>;\n private initBeforeFirstUpdate: boolean;\n\n public constructor(historyLocation: HistoryLocation, getWasm: () => ModuleControllerType) {\n this.historyLocation = historyLocation;\n this.getWasm = getWasm;\n this.nodes = new MapNodes();\n this.callbacks = new Map();\n this.initBeforeFirstUpdate = false;\n\n document.addEventListener('dragover', (ev): void => {\n // console.log('File(s) in drop zone');\n ev.preventDefault();\n });\n }\n\n public debugNodes(...ids: Array) {\n const result: Record = {};\n for (const id of ids) {\n const value = this.nodes.get_any_option(id);\n result[id] = value;\n }\n console.info('debug nodes', result);\n }\n\n private create_node(id: number, name: string) {\n const node = createElement(name);\n this.nodes.set(id, node);\n\n if (name.toLowerCase().trim() === 'a') {\n node.addEventListener('click', (e) => {\n let href = node.getAttribute('href');\n if (href === null) {\n return;\n }\n\n if (href.startsWith('#') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//')) {\n return;\n }\n\n e.preventDefault();\n this.historyLocation.push(href);\n window.scrollTo(0, 0);\n })\n }\n }\n\n private set_attribute(id: number, name: string, value: string) {\n const node = this.nodes.get_node(\"set_attribute\", id);\n node.setAttribute(name, value);\n\n if (name == \"value\") {\n if (node instanceof HTMLInputElement) {\n node.value = value;\n return;\n }\n\n if (node instanceof HTMLTextAreaElement) {\n node.value = value;\n node.defaultValue = value;\n return;\n }\n }\n }\n\n private remove_attribute(id: number, name: string) {\n const node = this.nodes.get_node(\"remove_attribute\", id);\n node.removeAttribute(name);\n\n if (name == \"value\") {\n if (node instanceof HTMLInputElement) {\n node.value = \"\";\n return;\n }\n\n if (node instanceof HTMLTextAreaElement) {\n node.value = \"\";\n node.defaultValue = \"\";\n return;\n }\n }\n }\n\n private remove_node(id: number) {\n const node = this.nodes.delete(\"remove_node\", id);\n node.remove();\n }\n\n private create_text(id: number, value: string) {\n const text = document.createTextNode(value);\n this.nodes.set(id, text);\n }\n\n private remove_text(id: number) {\n const text = this.nodes.delete(\"remove_node\", id);\n text.remove();\n }\n\n private update_text(id: number, value: string) {\n const text = this.nodes.get_text(\"set_attribute\", id);\n text.textContent = value;\n }\n\n private insert_before(parent: number, child: number, ref_id: number | null | undefined) {\n const parentNode = this.nodes.get(\"insert_before\", parent);\n const childNode = this.nodes.get_any(\"insert_before child\", child);\n\n if (ref_id === null || ref_id === undefined) {\n parentNode.insertBefore(childNode, null);\n } else {\n const ref_node = this.nodes.get_any('insert_before ref', ref_id);\n parentNode.insertBefore(childNode, ref_node);\n }\n }\n\n private insert_css(selector: string, value: string) {\n const style = document.createElement('style');\n const content = document.createTextNode(`${selector} { ${value} }`);\n style.appendChild(content);\n\n this.nodes.get_root_head().appendChild(style);\n }\n\n private callback_click(event: Event, callback_id: bigint) {\n event.preventDefault();\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_input(event: Event, callback_id: bigint) {\n const target = event.target;\n\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n this.getWasm().wasm_callback(callback_id, target.value);\n return;\n }\n\n console.warn('event input ignore', target);\n }\n\n private callback_change(event: Event, callback_id: bigint) {\n const target = event.target;\n\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {\n this.getWasm().wasm_callback(callback_id, target.value);\n return;\n }\n\n console.warn('event input ignore', target);\n }\n\n private callback_blur(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_mousedown(event: Event, callback_id: bigint) {\n if (this.getWasm().wasm_callback(callback_id, undefined)) {\n event.preventDefault()\n }\n }\n\n private callback_mouseup(event: Event, callback_id: bigint) {\n if (this.getWasm().wasm_callback(callback_id, undefined)) {\n event.preventDefault()\n }\n }\n\n private callback_mouseenter(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_mouseleave(_event: Event, callback_id: bigint) {\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_drop(event: Event, callback_id: bigint) {\n event.preventDefault();\n\n if (event instanceof DragEvent) {\n if (event.dataTransfer === null) {\n console.error('dom -> drop -> dataTransfer null');\n } else {\n const files: Array> = [];\n\n for (let i = 0; i < event.dataTransfer.items.length; i++) {\n const item = event.dataTransfer.items[i];\n\n if (item === undefined) {\n console.error('dom -> drop -> item - undefined');\n } else {\n const file = item.getAsFile();\n\n if (file === null) {\n console.error(`dom -> drop -> index:${i} -> It's not a file`);\n } else {\n files.push(file\n .arrayBuffer()\n .then((data): FileItemType => ({\n name: file.name,\n data: new Uint8Array(data),\n }))\n );\n }\n }\n }\n\n if (files.length) {\n Promise.all(files).then((files) => {\n const params = [];\n\n for (const file of files) {\n params.push([\n file.name,\n file.data,\n ]);\n }\n\n this.getWasm().wasm_callback(callback_id, [params]);\n }).catch((error) => {\n console.error('callback_drop -> promise.all -> ', error);\n });\n } else {\n console.error('No files to send');\n }\n }\n } else {\n console.warn('event drop ignore', event);\n }\n }\n\n private callback_keydown(event: Event, callback_id: bigint) {\n if (event instanceof KeyboardEvent) {\n const result = this.getWasm().wasm_callback(callback_id, [\n event.key,\n event.code,\n event.altKey,\n event.ctrlKey,\n event.shiftKey,\n event.metaKey\n ]);\n\n if (result === true) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n return;\n }\n\n console.warn('keydown ignore', event);\n }\n\n private callback_load(event: Event, callback_id: bigint) {\n event.preventDefault();\n this.getWasm().wasm_callback(callback_id, undefined);\n }\n\n private callback_add(id: number, event_name: string, callback_id: bigint) {\n const callback = (event: Event) => {\n if (event_name === 'click') {\n return this.callback_click(event, callback_id);\n }\n\n if (event_name === 'input') {\n return this.callback_input(event, callback_id);\n }\n\n if (event_name === 'change') {\n return this.callback_change(event, callback_id);\n }\n\n if (event_name === 'blur') {\n return this.callback_blur(event, callback_id);\n }\n\n if (event_name === 'mousedown') {\n return this.callback_mousedown(event, callback_id);\n }\n\n if (event_name === 'mouseup') {\n return this.callback_mouseup(event, callback_id);\n }\n\n if (event_name === 'mouseenter') {\n return this.callback_mouseenter(event, callback_id);\n }\n\n if (event_name === 'mouseleave') {\n return this.callback_mouseleave(event, callback_id);\n }\n\n if (event_name === 'keydown') {\n return this.callback_keydown(event, callback_id);\n }\n\n if (event_name === 'hook_keydown') {\n return this.callback_keydown(event, callback_id);\n }\n\n if (event_name === 'drop') {\n return this.callback_drop(event, callback_id);\n }\n\n if (event_name === 'load') {\n return this.callback_load(event, callback_id);\n }\n\n console.error(`No support for the event ${event_name}`);\n };\n\n if (this.callbacks.has(callback_id)) {\n console.error(`There was already a callback added with the callback_id=${callback_id}`);\n return;\n }\n\n this.callbacks.set(callback_id, callback);\n\n if (event_name === 'hook_keydown') {\n document.addEventListener('keydown', callback, false);\n } else {\n const node = this.nodes.get('callback_add', id);\n node.addEventListener(event_name, callback, false);\n }\n }\n\n private callback_remove(id: number, event_name: string, callback_id: bigint) {\n const callback = this.callbacks.get(callback_id);\n this.callbacks.delete(callback_id);\n\n if (callback === undefined) {\n console.error(`The callback is missing with the id=${callback_id}`);\n return;\n }\n\n if (event_name === 'hook_keydown') {\n document.removeEventListener('keydown', callback);\n } else {\n const node = this.nodes.get('callback_remove', id);\n node.removeEventListener(event_name, callback);\n }\n }\n\n private get_node_to_clear = (element: Element): Array => {\n const list: Array = [];\n element.childNodes.forEach((item: ChildNode) => {\n list.push(item);\n });\n return list;\n };\n\n private get_to_clear = (): [Array, Array] => {\n if (this.initBeforeFirstUpdate === true) {\n return [[], []];\n }\n\n this.initBeforeFirstUpdate = true;\n\n return [\n this.get_node_to_clear(this.nodes.get_root_head()),\n this.get_node_to_clear(this.nodes.get_root_body())\n ];\n }\n\n public dom_bulk_update = (commands: Array) => {\n const [node_head, node_body] = this.get_to_clear();\n\n const setFocus: Set = new Set();\n\n for (const command of commands) {\n try {\n this.bulk_update_command(command);\n } catch (error) {\n console.error('bulk_update - item', error, command);\n }\n\n if (command.type === 'set_attr' && command.name.toLocaleLowerCase() === 'autofocus') {\n setFocus.add(command.id);\n }\n }\n\n if (setFocus.size > 0) {\n setTimeout(() => {\n for (const id of setFocus) {\n const node = this.nodes.get_node_element(`set focus ${id}`, id);\n node.focus();\n }\n }, 0);\n }\n\n for (const node of node_body) {\n node.remove();\n }\n \n for (const node of node_head) {\n node.remove();\n }\n }\n\n private bulk_update_command(command: CommandType) {\n if (command.type === 'remove_node') {\n this.remove_node(command.id);\n return;\n }\n\n if (command.type === 'insert_before') {\n this.insert_before(command.parent, command.child, command.ref_id === null ? null : command.ref_id);\n return;\n }\n\n if (command.type === 'create_node') {\n this.create_node(command.id, command.name);\n return;\n }\n\n if (command.type === 'create_text') {\n this.create_text(command.id, command.value);\n return;\n }\n\n if (command.type === 'update_text') {\n this.update_text(command.id, command.value);\n return;\n }\n\n if (command.type === 'set_attr') {\n this.set_attribute(command.id, command.name, command.value);\n return;\n }\n\n if (command.type === 'remove_attr') {\n this.remove_attribute(command.id, command.name);\n return;\n }\n\n if (command.type === 'remove_text') {\n this.remove_text(command.id);\n return;\n }\n\n if (command.type === 'insert_css') {\n this.insert_css(command.selector, command.value);\n return;\n }\n\n if (command.type === 'create_comment') {\n const comment = document.createComment(command.value);\n this.nodes.set(command.id, comment);\n return;\n }\n\n if (command.type === 'remove_comment') {\n const comment = this.nodes.delete(\"remove_comment\", command.id);\n comment.remove();\n return;\n }\n\n if (command.type === 'callback_add') {\n this.callback_add(command.id, command.event_name, BigInt(command.callback_id));\n return;\n }\n\n if (command.type === 'callback_remove') {\n this.callback_remove(command.id, command.event_name, BigInt(command.callback_id));\n return;\n }\n\n return assertNeverCommand(command);\n }\n}\n","import { ModuleControllerType } from \"../wasm_init\";\nimport { ExportType } from \"../wasm_module\";\nexport class HistoryLocation {\n private getWasm: () => ModuleControllerType;\n private callback: Map void>;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.getWasm = getWasm;\n this.callback = new Map();\n\n window.addEventListener(\"popstate\", this.trigger);\n }\n\n private trigger = () => {\n for (const callback of Array.from(this.callback.values())) {\n callback();\n }\n }\n\n public add = (callback_id: bigint) => {\n this.callback.set(callback_id, () => {\n this.getWasm().wasm_callback(callback_id, this.get());\n });\n }\n\n public remove = (callback_id: bigint) => {\n this.callback.delete(callback_id);\n }\n\n public push = (url: string) => {\n if (this.get() === url) {\n return;\n }\n\n window.history.pushState(null, '', url);\n this.trigger();\n }\n\n public replace = (url: string) => {\n if (this.get() === url) {\n return;\n }\n\n window.history.replaceState(null, '', url);\n this.trigger();\n }\n\n public get(): string {\n return window.location.pathname + window.location.search + window.location.hash;\n }\n}\n","import { ModuleControllerType } from \"./wasm_init\";\nimport { ExportType } from \"./wasm_module\";\nimport { Cookies } from \"./api_browser/cookies\";\nimport { Interval } from \"./api_browser/interval\";\nimport { HashRouter } from \"./api_browser/hashrouter\";\nimport { Fetch } from \"./api_browser/fetch\";\nimport { DriverWebsocket } from \"./api_browser/websocket/websocket\";\nimport { DriverDom } from \"./api_browser/dom/dom\";\nimport { HistoryLocation } from \"./api_browser/historyLocation\";\n\nexport class ApiBrowser {\n public readonly cookie: Cookies;\n public readonly interval: Interval;\n public readonly hashRouter: HashRouter;\n public readonly historyLocation: HistoryLocation;\n public readonly fetch: Fetch;\n public readonly websocket: DriverWebsocket;\n public readonly dom: DriverDom;\n\n constructor(getWasm: () => ModuleControllerType) {\n this.cookie = new Cookies();\n this.interval = new Interval(getWasm);\n this.hashRouter = new HashRouter(getWasm);\n this.historyLocation = new HistoryLocation(getWasm);\n this.fetch = new Fetch(getWasm);\n this.websocket = new DriverWebsocket(getWasm);\n this.dom = new DriverDom(this.historyLocation, getWasm);\n }\n\n public getRandom = (min: number, max: number): number => {\n const range = max - min + 1;\n let result = Math.floor(Math.random() * range);\n return min + result;\n }\n\n public isBrowser = (): boolean => {\n return true;\n }\n\n public get_env = (name: string): string | null => {\n return document.documentElement.getAttribute(`data-env-${name}`);\n }\n\n public getTimezoneOffset = (): number => {\n return new Date().getTimezoneOffset()\n }\n}\n","import { ApiBrowser } from \"./api_browser\";\nimport { convertFromJsValue, convertToJsValue, JsValueType } from \"./jsvalue\";\nimport { GuardJsValue } from './guard';\nimport { MapNodes } from \"./api_browser/dom/map_nodes\";\n\nexport class JsNode {\n private api: ApiBrowser;\n private nodes: MapNodes;\n private wsk: unknown;\n\n public constructor(\n api: ApiBrowser,\n nodes: MapNodes,\n wsk: unknown\n ) {\n this.api = api;\n this.nodes = nodes;\n this.wsk = wsk;\n }\n\n getByProperty(path: Array, property: string): JsNode | null {\n try {\n //@ts-expect-error\n const nextCurrentPointer = this.wsk[property];\n return new JsNode(this.api, this.nodes, nextCurrentPointer);\n } catch (error) {\n console.error('A problem with get', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n public toValue(): JsValueType {\n return convertToJsValue(this.wsk);\n }\n\n public next(path: Array, command: JsValueType): JsNode | null {\n if (Array.isArray(command)) {\n const [commandName, ...args] = command;\n\n if (commandName === 'api') {\n return this.nextApi(path, args);\n }\n\n if (commandName === 'root') {\n return this.nextRoot(path, args);\n }\n\n if (commandName === 'get') {\n return this.nextGet(path, args);\n }\n\n if (commandName === 'set') {\n return this.nextSet(path, args);\n }\n\n if (commandName === 'call') {\n return this.nextCall(path, args);\n }\n\n if (commandName === 'get_props') {\n return this.nextGetProps(path, args);\n }\n\n console.error('JsNode.next - wrong commandName', commandName);\n return null;\n }\n\n console.error('JsNode.next - array was expected', { path, command });\n return null;\n }\n\n nextApi(path: Array, args: Array): JsNode | null {\n if (args.length === 0) {\n return new JsNode(this.api, this.nodes, this.api);\n }\n\n console.error('nextApi: wrong parameter', {path, args});\n return null;\n }\n\n nextRoot(path: Array, args: Array): JsNode | null {\n const [firstName, ...rest] = args;\n\n if (GuardJsValue.isString(firstName) && rest.length === 0) {\n if (firstName === 'window') {\n return new JsNode(this.api, this.nodes, window);\n }\n\n if (firstName === 'document') {\n return new JsNode(this.api, this.nodes, document);\n }\n\n console.error(`JsNode.nextRoot: Global name not found -> ${firstName}`, {path, args});\n return null;\n }\n\n if (GuardJsValue.isNumber(firstName) && rest.length === 0) {\n const domId = firstName.value;\n\n const node = this.nodes.get_any_option(domId);\n\n if (node !== undefined) {\n return new JsNode(this.api, this.nodes, node);\n }\n\n console.error(`JsNode.nextRoot: No node with id=${domId}`, {path, args});\n return null;\n }\n\n console.error('JsNode.nextRoot: wrong parameter', {path, args});\n return null;\n }\n\n nextGet(path: Array, args: Array): JsNode | null {\n const [property, ...getArgs] = args;\n\n if (GuardJsValue.isString(property) && getArgs.length === 0) {\n return this.getByProperty(path, property);\n }\n\n console.error('JsNode.nextGet - wrong parameters', { path, args });\n return null;\n }\n\n nextSet(path: Array, args: Array): JsNode | null {\n const [property, value, ...setArgs] = args;\n\n if (GuardJsValue.isString(property) && setArgs.length === 0) {\n try {\n //@ts-expect-error\n this.wsk[property] = convertFromJsValue(value);\n return new JsNode(this.api, this.nodes, undefined);\n } catch (error) {\n console.error('A problem with set', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n console.error('JsNode.nextSet - wrong parameters', { path, args });\n return null;\n }\n\n nextCall(path: Array, args: Array): JsNode | null {\n const [property, ...callArgs] = args;\n\n if (GuardJsValue.isString(property)) {\n try {\n let paramsJs = callArgs.map(convertFromJsValue);\n //@ts-expect-error\n const result = this.wsk[property](...paramsJs);\n return new JsNode(this.api, this.nodes, result);\n } catch (error) {\n console.error('A problem with call', {\n path,\n property,\n error\n });\n return null;\n }\n }\n\n console.error('JsNode.nextCall - wrong parameters', { path, args });\n return null;\n }\n\n nextGetProps(path: Array, args: Array): JsNode | null {\n const result: Record = {};\n\n for (const property of args) {\n if (GuardJsValue.isString(property)) {\n const value = this.getByProperty(path, property);\n if (value === null) {\n return null;\n }\n\n result[property] = value.toValue();\n } else {\n console.error('JsNode.nextGetProps - wrong parameters', { path, args, property });\n return null;\n }\n }\n\n return new JsNode(this.api, this.nodes, result);\n }\n}\n","import { wasmInit, ModuleControllerType } from './wasm_init';\nimport { ApiBrowser as ApiBrowser } from './api_browser';\nimport { JsNode } from './js_node';\n\n//Number -> u32 or i32\n//BigInt -> u64 or i64\n\nexport type ImportType = {\n panic_message: (ptr: number, length: number) => void,\n //call from rust\n dom_access: (ptr: number, size: number) => number,\n}\n\nexport type ExportType = {\n alloc: (size: number) => number,\n free: (pointer: number) => void,\n wasm_callback: (callback_id: bigint, value_ptr: number) => bigint, //result => pointer: 32bit, size: 32bit\n vertigo_entry_function: (major: number, minor: number) => void,\n}\n\nexport class WasmModule {\n private readonly wasm: ModuleControllerType;\n\n private constructor(\n wasm: ModuleControllerType,\n ) {\n this.wasm = wasm;\n }\n\n public vertigo_entry_function(major: number, minor: number) {\n this.wasm.exports.vertigo_entry_function(major, minor);\n }\n\n public static async create(wasmBinPath: string): Promise {\n let wasmModule: ModuleControllerType | null = null;\n\n const getWasm = (): ModuleControllerType => {\n if (wasmModule === null) {\n throw Error('Wasm is no initialized');\n }\n\n return wasmModule;\n };\n\n const apiBrowser = new ApiBrowser(getWasm);\n\n //@ts-expect-error\n window.$vertigoApi = apiBrowser;\n\n wasmModule = await wasmInit(wasmBinPath, {\n mod: {\n panic_message: (ptr: number, size: number) => {\n const decoder = new TextDecoder(\"utf-8\");\n const m = getWasm().getUint8Memory().subarray(ptr, ptr + size);\n const message = decoder.decode(m);\n console.error('PANIC', message);\n },\n dom_access: (ptr: number, size: number): number => {\n let args = getWasm().decodeArguments(ptr, size);\n if (Array.isArray(args)) {\n const path = args;\n let wsk = new JsNode(apiBrowser, apiBrowser.dom.nodes, null);\n\n for (const pathItem of path) {\n const newWsk = wsk.next(path, pathItem);\n\n if (newWsk === null) {\n return 0;\n }\n\n wsk = newWsk;\n }\n\n return getWasm().valueSaveToBuffer(wsk.toValue());\n }\n\n console.error('dom_access - wrong parameters', args);\n return 0;\n },\n }\n });\n\n return new WasmModule(wasmModule);\n }\n}\n","import { WasmModule } from \"./wasm_module\";\n\n// vertigo-cli compatibility version, change together with package version.\nconst VERTIGO_COMPAT_VERSION_MAJOR = 0;\nconst VERTIGO_COMPAT_VERSION_MINOR = 6;\n\nconst moduleRun: Set = new Set();\n\nconst runModule = async (wasm: string) => {\n if (moduleRun.has(wasm)) {\n //ok, module is run\n return;\n }\n\n if (moduleRun.size > 0) {\n console.error('Only one wasm module can be run', { moduleRun, wasm });\n return;\n }\n\n moduleRun.add(wasm);\n\n console.info(`Wasm module: \"${wasm}\" -> start`);\n const wasmModule = await WasmModule.create(wasm);\n console.info(`Wasm module: \"${wasm}\" -> initialized`);\n wasmModule.vertigo_entry_function(VERTIGO_COMPAT_VERSION_MAJOR, VERTIGO_COMPAT_VERSION_MINOR);\n console.info(`Wasm module: \"${wasm}\" -> launched vertigo_entry_function with version ${VERTIGO_COMPAT_VERSION_MAJOR}.${VERTIGO_COMPAT_VERSION_MINOR}`);\n};\n\nconst findAndRunModule = async () => {\n document.querySelectorAll('*[data-vertigo-run-wasm]').forEach((node) => {\n const wasm = node.getAttribute('data-vertigo-run-wasm');\n\n if (typeof wasm === 'string') {\n runModule(wasm);\n } else {\n console.error('Run error', node);\n }\n });\n};\n\n(() => {\n window.addEventListener('load', findAndRunModule);\n setTimeout(findAndRunModule, 3000);\n})();\n"],"names":["assertNever","_value","Error","decoder","TextDecoder","encoder","TextEncoder","BufferCursor","constructor","getUint8Memory","ptr","size","this","pointer","dataView","DataView","buffer","getByte","value","getUint8","setByte","byte","setUint8","getU16","getUint16","setU16","setUint16","getU32","getUint32","setU32","setUint32","getI32","getInt32","setI32","setInt32","getU64","getBigUint64","setU64","setBigUint64","getI64","getBigInt64","setI64","setBigInt64","getF64","getFloat64","setF64","setFloat64","getBuffer","result","subarray","setBuffer","length","set","getString","decode","setString","encode","getSavedSize","getStringSize","GuardJsValue","isString","isStringOrNull","isNumber","type","JsValueConst","I32","U32","isBigInt","I64","U64","JsJsonConst","jsJsonGetSize","Array","isArray","sum","item","key","propertyValue","Object","entries","jsJsonDecodeItem","cursor","typeParam","out","listSize","i","push","saveJsJsonToBufferItem","list","F64","True","False","Null","Undefined","Vec","String","List","Json","jsValueDecodeItem","json","console","error","getSize","Uint8Array","saveToBufferItem","undefined","convertFromJsValue","newList","convertToJsValue","BigInt","convertToJsJson","_error","propName","propValue","map","warn","wasmInit","async","wasmBinPath","imports","module_instance","WebAssembly","instantiateStreaming","stream","fetch","err","info","resp","binary","arrayBuffer","instantiate","fetchModule","cacheGetUint8Memory","instance","exports","memory","Memory","decodeArguments","jsValueDecode","valueSaveToBuffer","alloc","savedSize","saveToBuffer","wasm_callback","callback_id","value_ptr","result_ptr_and_size","response","Number","free","Cookies","get","cname","cookie","document","split","cookieChunk","trim","cookieName","cookieValue","decodeURIComponent","get_json","cvalue_str","JSON","parse","e","cvalue","expires_in","cvalueEncoded","encodeURIComponent","d","Date","setTime","getTime","expires","toUTCString","set_json","stringify","Interval","getWasm","interval_set","duration","setInterval","interval_clear","timer_id","clearInterval","timeout_set","setTimeout","timeout_clear","clearTimeout","HashRouter","trigger","callback","from","values","add","remove","delete","new_hash","location","hash","Map","window","addEventListener","substr","catchError","wasm","callbackSuccess","responseMessage","toString","status","Fetch","fetch_send_request","method","url","headers","body","fetch_send_request_inner","fetchHeaders","fetchBody","headersRecord","Headers","has","getHeadersAndBody","responseType","contentType","typeClear","toLowerCase","getTypeResponse","text","textUint8Array","EventEmitter","events","Set","on","isActive","onExec","param","eventsCopy","itemCallbackToRun","PromiseBoxRace","promiseResolveReject","resolve","reject","isFulfilled","promise","Promise","localResolve","localReject","createPromiseValue","reconnectDelay","label","timeout_retry","timeout","LogContext","host","formatLog","message","SocketConnection","close","send","eventMessage","connect","log","done","socket","WebSocket","isClose","closeSocket","socketConnection","event","dataRaw","data","startSocket","timeout_connection","onMessage","isConnect","openSocketResult","catch","dispose","DriverWebsocket","websocket_register_callback","controller","controllerList","assertNeverMessage","websocket_unregister_callback","websocket_send_message","MapNodes","get_root_html","documentElement","get_root_head","head","get_root_body","id","get_any_option","get_any","get_node_element","node","HTMLElement","get_node","Element","get_text","Text","get_comment","Comment","DriverDom","historyLocation","get_node_to_clear","element","childNodes","forEach","get_to_clear","initBeforeFirstUpdate","nodes","dom_bulk_update","commands","node_head","node_body","setFocus","command","bulk_update_command","name","toLocaleLowerCase","focus","callbacks","ev","preventDefault","debugNodes","ids","create_node","createElementNS","createElement","href","getAttribute","startsWith","scrollTo","set_attribute","setAttribute","HTMLInputElement","HTMLTextAreaElement","defaultValue","remove_attribute","removeAttribute","remove_node","create_text","createTextNode","remove_text","update_text","textContent","insert_before","parent","child","ref_id","parentNode","childNode","insertBefore","ref_node","insert_css","selector","style","content","appendChild","callback_click","callback_input","target","callback_change","HTMLSelectElement","callback_blur","_event","callback_mousedown","callback_mouseup","callback_mouseenter","callback_mouseleave","callback_drop","DragEvent","dataTransfer","files","items","file","getAsFile","then","all","params","callback_keydown","KeyboardEvent","code","altKey","ctrlKey","shiftKey","metaKey","stopPropagation","callback_load","callback_add","event_name","callback_remove","removeEventListener","assertNeverCommand","comment","createComment","HistoryLocation","history","pushState","replace","replaceState","pathname","search","ApiBrowser","getRandom","min","max","range","Math","floor","random","isBrowser","get_env","getTimezoneOffset","interval","hashRouter","websocket","dom","JsNode","api","wsk","getByProperty","path","property","nextCurrentPointer","toValue","next","commandName","args","nextApi","nextRoot","nextGet","nextSet","nextCall","nextGetProps","firstName","rest","domId","getArgs","setArgs","callArgs","paramsJs","WasmModule","vertigo_entry_function","major","minor","create","wasmModule","apiBrowser","$vertigoApi","mod","panic_message","m","dom_access","pathItem","newWsk","moduleRun","findAndRunModule","querySelectorAll","runModule"],"mappings":"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"} \ No newline at end of file