@php-wasm/web 3.1.22 → 3.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -57,7 +57,7 @@ const php = new PHP(
57
57
  ```
58
58
 
59
59
  `@php-wasm/web` ships the `intl` extension. Browser builds can also load
60
- external `.so` artifacts from a manifest:
60
+ external JSPI `.so` artifacts from a manifest:
61
61
 
62
62
  ```js
63
63
  const php = new PHP(
@@ -77,6 +77,9 @@ const php = new PHP(
77
77
  In browser runtimes, pass an HTTP(S) URL or a `URL` object. Relative artifact
78
78
  files in the manifest are resolved against the manifest URL.
79
79
 
80
+ External extensions are only supported when JSPI is available. Asyncify support
81
+ is limited to the bundled `intl` extension shipped with this package.
82
+
80
83
  ## Usage with bundlers
81
84
 
82
85
  If you use `@php-wasm/web` with a bundler such as Vite, you may see the following errors:
package/index.cjs CHANGED
@@ -1,25 +1,25 @@
1
- "use strict";var Ke=Object.create;var Y=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var We=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var Re=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of We(e))!be.call(s,n)&&n!==t&&Y(s,n,{get:()=>e[n],enumerable:!(r=De(e,n))||r.enumerable});return s};var f=(s,e,t)=>(t=s!=null?Ke(Pe(s)):{},Re(e||!s||!s.__esModule?Y(t,"default",{value:s,enumerable:!0}):t,s));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("@php-wasm/universal"),u=require("@php-wasm/util"),v=require("@php-wasm/logger"),$=require("@php-wasm/web-service-worker"),Be=require("@wp-playground/common"),Ue=require("wasm-feature-detect"),Z=require("@php-wasm/fs-journal");async function ce(s=d.LatestSupportedPHPVersion){switch(s){case"8.5":return(await import("@php-wasm/web-8-5")).getPHPLoaderModule();case"8.4":return(await import("@php-wasm/web-8-4")).getPHPLoaderModule();case"8.3":return(await import("@php-wasm/web-8-3")).getPHPLoaderModule();case"8.2":return(await import("@php-wasm/web-8-2")).getPHPLoaderModule();case"8.1":return(await import("@php-wasm/web-8-1")).getPHPLoaderModule();case"8.0":return(await import("@php-wasm/web-8-0")).getPHPLoaderModule();case"7.4":return(await import("@php-wasm/web-7-4")).getPHPLoaderModule();case"5.2":return(await import("@php-wasm/web-5-2")).getPHPLoaderModule()}throw new Error(`Unsupported PHP version ${s}`)}function y(s){return Object.fromEntries(Object.entries(s).map(([e,t])=>[t,e]))}function P(s){return new Uint8Array([s>>8&255,s&255])}function g(s){return new Uint8Array([s>>16&255,s>>8&255,s&255])}function J(s){const e=new ArrayBuffer(8);return new DataView(e).setBigUint64(0,BigInt(s),!1),new Uint8Array(e)}class K{constructor(e){this.offset=0,this.buffer=e,this.view=new DataView(e)}readUint8(){const e=this.view.getUint8(this.offset);return this.offset+=1,e}readUint16(){const e=this.view.getUint16(this.offset);return this.offset+=2,e}readUint32(){const e=this.view.getUint32(this.offset);return this.offset+=4,e}readUint8Array(e){const t=this.buffer.slice(this.offset,this.offset+e);return this.offset+=e,new Uint8Array(t)}isFinished(){return this.offset>=this.buffer.byteLength}}class N{constructor(e){this.offset=0,this.buffer=new ArrayBuffer(e),this.uint8Array=new Uint8Array(this.buffer),this.view=new DataView(this.buffer)}writeUint8(e){this.view.setUint8(this.offset,e),this.offset+=1}writeUint16(e){this.view.setUint16(this.offset,e),this.offset+=2}writeUint32(e){this.view.setUint32(this.offset,e),this.offset+=4}writeUint8Array(e){this.uint8Array.set(e,this.offset),this.offset+=e.length}}const b={server_name:0,max_fragment_length:1,client_certificate_url:2,trusted_ca_keys:3,truncated_hmac:4,status_request:5,user_mapping:6,client_authz:7,server_authz:8,cert_type:9,supported_groups:10,ec_point_formats:11,srp:12,signature_algorithms:13,use_srtp:14,heartbeat:15,application_layer_protocol_negotiation:16,status_request_v2:17,signed_certificate_timestamp:18,client_certificate_type:19,server_certificate_type:20,padding:21,encrypt_then_mac:22,extended_master_secret:23,token_binding:24,cached_info:25,tls_its:26,compress_certificate:27,record_size_limit:28,pwd_protect:29,pwo_clear:30,password_salt:31,ticket_pinning:32,tls_cert_with_extern_psk:33,delegated_credential:34,session_ticket:35,TLMSP:36,TLMSP_proxying:37,TLMSP_delegate:38,supported_ekt_ciphers:39,pre_shared_key:41,early_data:42,supported_versions:43,cookie:44,psk_key_exchange_modes:45,reserved:46,certificate_authorities:47,oid_filters:48,post_handshake_auth:49,signature_algorithms_cert:50,key_share:51,transparency_info:52,connection_id:54,renegotiation_info:65281},ve=y(b),Se={host_name:0},Me=y(Se);class le{static decodeFromClient(e){const t=new DataView(e.buffer);let r=0;const n=t.getUint16(r);r+=2;const i=[];for(;r<n+2;){const a=e[r];r+=1;const _=t.getUint16(r);r+=2;const c=e.slice(r,r+_);switch(r+=_,a){case Se.host_name:i.push({name_type:Me[a],name:{host_name:new TextDecoder().decode(c)}});break;default:throw new Error(`Unsupported name type ${a}`)}}return{server_name_list:i}}static encodeForClient(e){if(e!=null&&e.server_name_list.length)throw new Error("Encoding non-empty lists for ClientHello is not supported yet. Only empty lists meant for ServerHello are supported today.");const t=new N(4);return t.writeUint16(b.server_name),t.writeUint16(0),t.uint8Array}}const Ce={uncompressed:0,ansiX962_compressed_prime:1,ansiX962_compressed_char2:2},X=y(Ce);class he{static decodeFromClient(e){const t=new K(e.buffer),r=t.readUint8(),n=[];for(let i=0;i<r;i++){const a=t.readUint8();a in X&&n.push(X[a])}return n}static encodeForClient(e){const t=new N(6);return t.writeUint16(b.ec_point_formats),t.writeUint16(2),t.writeUint8(1),t.writeUint8(Ce[e]),t.uint8Array}}const ue={decodeFromClient(s){const e=s[0]??0;return{renegotiatedConnection:s.slice(1,1+e)}},encodeForClient(){const s=b.renegotiation_info,e=new Uint8Array([0]);return new Uint8Array([s>>8&255,s&255,0,e.length,...e])}},Ae={TLS1_CK_PSK_WITH_RC4_128_SHA:138,TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA:139,TLS1_CK_PSK_WITH_AES_128_CBC_SHA:140,TLS1_CK_PSK_WITH_AES_256_CBC_SHA:141,TLS1_CK_DHE_PSK_WITH_RC4_128_SHA:142,TLS1_CK_DHE_PSK_WITH_3DES_EDE_CBC_SHA:143,TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA:144,TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA:145,TLS1_CK_RSA_PSK_WITH_RC4_128_SHA:146,TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA:147,TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA:148,TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA:149,TLS1_CK_PSK_WITH_AES_128_GCM_SHA256:168,TLS1_CK_PSK_WITH_AES_256_GCM_SHA384:169,TLS1_CK_DHE_PSK_WITH_AES_128_GCM_SHA256:170,TLS1_CK_DHE_PSK_WITH_AES_256_GCM_SHA384:171,TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256:172,TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384:173,TLS1_CK_PSK_WITH_AES_128_CBC_SHA256:174,TLS1_CK_PSK_WITH_AES_256_CBC_SHA384:175,TLS1_CK_PSK_WITH_NULL_SHA256:176,TLS1_CK_PSK_WITH_NULL_SHA384:177,TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA256:178,TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA384:179,TLS1_CK_DHE_PSK_WITH_NULL_SHA256:180,TLS1_CK_DHE_PSK_WITH_NULL_SHA384:181,TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256:182,TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384:183,TLS1_CK_RSA_PSK_WITH_NULL_SHA256:184,TLS1_CK_RSA_PSK_WITH_NULL_SHA384:185,TLS1_CK_PSK_WITH_NULL_SHA:44,TLS1_CK_DHE_PSK_WITH_NULL_SHA:45,TLS1_CK_RSA_PSK_WITH_NULL_SHA:46,TLS1_CK_RSA_WITH_AES_128_SHA:47,TLS1_CK_DH_DSS_WITH_AES_128_SHA:48,TLS1_CK_DH_RSA_WITH_AES_128_SHA:49,TLS1_CK_DHE_DSS_WITH_AES_128_SHA:50,TLS1_CK_DHE_RSA_WITH_AES_128_SHA:51,TLS1_CK_ADH_WITH_AES_128_SHA:52,TLS1_CK_RSA_WITH_AES_256_SHA:53,TLS1_CK_DH_DSS_WITH_AES_256_SHA:54,TLS1_CK_DH_RSA_WITH_AES_256_SHA:55,TLS1_CK_DHE_DSS_WITH_AES_256_SHA:56,TLS1_CK_DHE_RSA_WITH_AES_256_SHA:57,TLS1_CK_ADH_WITH_AES_256_SHA:58,TLS1_CK_RSA_WITH_NULL_SHA256:59,TLS1_CK_RSA_WITH_AES_128_SHA256:60,TLS1_CK_RSA_WITH_AES_256_SHA256:61,TLS1_CK_DH_DSS_WITH_AES_128_SHA256:62,TLS1_CK_DH_RSA_WITH_AES_128_SHA256:63,TLS1_CK_DHE_DSS_WITH_AES_128_SHA256:64,TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA:65,TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:66,TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:67,TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:68,TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:69,TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA:70,TLS1_CK_DHE_RSA_WITH_AES_128_SHA256:103,TLS1_CK_DH_DSS_WITH_AES_256_SHA256:104,TLS1_CK_DH_RSA_WITH_AES_256_SHA256:105,TLS1_CK_DHE_DSS_WITH_AES_256_SHA256:106,TLS1_CK_DHE_RSA_WITH_AES_256_SHA256:107,TLS1_CK_ADH_WITH_AES_128_SHA256:108,TLS1_CK_ADH_WITH_AES_256_SHA256:109,TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA:132,TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:133,TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:134,TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:135,TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:136,TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA:137,TLS1_CK_RSA_WITH_SEED_SHA:150,TLS1_CK_DH_DSS_WITH_SEED_SHA:151,TLS1_CK_DH_RSA_WITH_SEED_SHA:152,TLS1_CK_DHE_DSS_WITH_SEED_SHA:153,TLS1_CK_DHE_RSA_WITH_SEED_SHA:154,TLS1_CK_ADH_WITH_SEED_SHA:155,TLS1_CK_RSA_WITH_AES_128_GCM_SHA256:156,TLS1_CK_RSA_WITH_AES_256_GCM_SHA384:157,TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256:158,TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384:159,TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256:160,TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384:161,TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256:162,TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384:163,TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256:164,TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384:165,TLS1_CK_ADH_WITH_AES_128_GCM_SHA256:166,TLS1_CK_ADH_WITH_AES_256_GCM_SHA384:167,TLS1_CK_RSA_WITH_AES_128_CCM:49308,TLS1_CK_RSA_WITH_AES_256_CCM:49309,TLS1_CK_DHE_RSA_WITH_AES_128_CCM:49310,TLS1_CK_DHE_RSA_WITH_AES_256_CCM:49311,TLS1_CK_RSA_WITH_AES_128_CCM_8:49312,TLS1_CK_RSA_WITH_AES_256_CCM_8:49313,TLS1_CK_DHE_RSA_WITH_AES_128_CCM_8:49314,TLS1_CK_DHE_RSA_WITH_AES_256_CCM_8:49315,TLS1_CK_PSK_WITH_AES_128_CCM:49316,TLS1_CK_PSK_WITH_AES_256_CCM:49317,TLS1_CK_DHE_PSK_WITH_AES_128_CCM:49318,TLS1_CK_DHE_PSK_WITH_AES_256_CCM:49319,TLS1_CK_PSK_WITH_AES_128_CCM_8:49320,TLS1_CK_PSK_WITH_AES_256_CCM_8:49321,TLS1_CK_DHE_PSK_WITH_AES_128_CCM_8:49322,TLS1_CK_DHE_PSK_WITH_AES_256_CCM_8:49323,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM:49324,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM:49325,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM_8:49326,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM_8:49327,TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256:186,TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:187,TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:188,TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:189,TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:190,TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256:191,TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256:192,TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:193,TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:194,TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:195,TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:196,TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256:197,TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA:49153,TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA:49154,TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA:49155,TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA:49156,TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA:49157,TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA:49158,TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA:49159,TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA:49160,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:49161,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:49162,TLS1_CK_ECDH_RSA_WITH_NULL_SHA:49163,TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA:49164,TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA:49165,TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA:49166,TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA:49167,TLS1_CK_ECDHE_RSA_WITH_NULL_SHA:49168,TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA:49169,TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA:49170,TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA:49171,TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA:49172,TLS1_CK_ECDH_anon_WITH_NULL_SHA:49173,TLS1_CK_ECDH_anon_WITH_RC4_128_SHA:49174,TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA:49175,TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA:49176,TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA:49177,TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA:49178,TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:49179,TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:49180,TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA:49181,TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:49182,TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:49183,TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA:49184,TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:49185,TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:49186,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256:49187,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384:49188,TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256:49189,TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384:49190,TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256:49191,TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384:49192,TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256:49193,TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384:49194,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:49195,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:49196,TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:49197,TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:49198,TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256:49199,TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384:49200,TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256:49201,TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384:49202,TLS1_CK_ECDHE_PSK_WITH_RC4_128_SHA:49203,TLS1_CK_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:49204,TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA:49205,TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA:49206,TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA256:49207,TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA384:49208,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA:49209,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA256:49210,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA384:49211,TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:49266,TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:49267,TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:49268,TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:49269,TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:49270,TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:49271,TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:49272,TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:49273,TLS1_CK_PSK_WITH_CAMELLIA_128_CBC_SHA256:49300,TLS1_CK_PSK_WITH_CAMELLIA_256_CBC_SHA384:49301,TLS1_CK_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:49302,TLS1_CK_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:49303,TLS1_CK_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:49304,TLS1_CK_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:49305,TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:49306,TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:49307,TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305:52392,TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:52393,TLS1_CK_DHE_RSA_WITH_CHACHA20_POLY1305:52394,TLS1_CK_PSK_WITH_CHACHA20_POLY1305:52395,TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305:52396,TLS1_CK_DHE_PSK_WITH_CHACHA20_POLY1305:52397,TLS1_CK_RSA_PSK_WITH_CHACHA20_POLY1305:52398},Q=y(Ae),He={secp256r1:23,secp384r1:24,secp521r1:25,x25519:29,x448:30},ee=y(He);class xe{static decodeFromClient(e){const t=new K(e.buffer);t.readUint16();const r=[];for(;!t.isFinished();){const n=t.readUint16();n in ee&&r.push(ee[n])}return r}static encodeForClient(e){const t=new N(6);return t.writeUint16(b.supported_groups),t.writeUint16(2),t.writeUint16(He[e]),t.uint8Array}}const V={anonymous:0,rsa:1,dsa:2,ecdsa:3},te=y(V),z={none:0,md5:1,sha1:2,sha224:3,sha256:4,sha384:5,sha512:6},re=y(z);class Ne{static decodeFromClient(e){const t=new K(e.buffer);t.readUint16();const r=[];for(;!t.isFinished();){const n=t.readUint8(),i=t.readUint8();if(te[i]){if(!re[n]){v.logger.warn(`Unknown hash algorithm: ${n}`);continue}r.push({algorithm:te[i],hash:re[n]})}}return r}static encodeforClient(e,t){const r=new N(6);return r.writeUint16(b.signature_algorithms),r.writeUint16(2),r.writeUint8(z[e]),r.writeUint8(V[t]),r.uint8Array}}const ne={server_name:le,signature_algorithms:Ne,supported_groups:xe,ec_point_formats:he,renegotiation_info:ue};function ke(s){const e=new K(s.buffer),t=[];for(;!e.isFinished();){const r=e.offset,n=e.readUint16(),i=ve[n],a=e.readUint16(),_=e.readUint8Array(a);if(!(i in ne))continue;const c=ne[i];t.push({type:i,data:c.decodeFromClient(_),raw:s.slice(r,r+4+a)})}return t}async function j(s,e,t,r){const n=u.concatArrayBuffers([e,t]),i=await crypto.subtle.importKey("raw",s,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]);let a=n;const _=[];for(;u.concatArrayBuffers(_).byteLength<r;){a=await se(i,a);const S=u.concatArrayBuffers([a,n]),l=await se(i,S);_.push(l)}return u.concatArrayBuffers(_).slice(0,r)}async function se(s,e){return await crypto.subtle.sign({name:"HMAC",hash:"SHA-256"},s,e)}const qe={Null:0},de={Warning:1,Fatal:2},fe=y(de),Ee={CloseNotify:0,UnexpectedMessage:10,BadRecordMac:20,DecryptionFailed:21,RecordOverflow:22,DecompressionFailure:30,HandshakeFailure:40,NoCertificate:41,BadCertificate:42,UnsupportedCertificate:43,CertificateRevoked:44,CertificateExpired:45,CertificateUnknown:46,IllegalParameter:47,UnknownCa:48,AccessDenied:49,DecodeError:50,DecryptError:51,ExportRestriction:60,ProtocolVersion:70,InsufficientSecurity:71,InternalError:80,UserCanceled:90,NoRenegotiation:100,UnsupportedExtension:110},Te=y(Ee),C={ChangeCipherSpec:20,Alert:21,Handshake:22,ApplicationData:23},T={HelloRequest:0,ClientHello:1,ServerHello:2,Certificate:11,ServerKeyExchange:12,ServerHelloDone:14,ClientKeyExchange:16,Finished:20},Fe={NamedCurve:3},Oe={secp256r1:23};class O extends Error{}const x=new Uint8Array([3,3]),je=crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey","deriveBits"]);class Ge{constructor(){this.receivedRecordSequenceNumber=0,this.sentRecordSequenceNumber=0,this.closed=!1,this.receivedBytesBuffer=new Uint8Array,this.receivedTLSRecords=[],this.partialTLSMessages={},this.handshakeMessages=[],this.MAX_CHUNK_SIZE=1024*16,this.clientEnd={upstream:new TransformStream,downstream:new TransformStream},this.clientDownstreamWriter=this.clientEnd.downstream.writable.getWriter(),this.clientUpstreamReader=this.clientEnd.upstream.readable.getReader(),this.serverEnd={upstream:new TransformStream,downstream:$e(this.MAX_CHUNK_SIZE)},this.serverUpstreamWriter=this.serverEnd.upstream.writable.getWriter();const e=this;this.serverEnd.downstream.readable.pipeTo(new WritableStream({async write(t){await e.writeTLSRecord(C.ApplicationData,t)},async abort(t){e.clientDownstreamWriter.releaseLock(),e.clientEnd.downstream.writable.abort(t),e.close()},close(){e.close()}})).catch(()=>{})}async close(){if(!this.closed){this.closed=!0;try{await this.clientDownstreamWriter.close()}catch{}try{await this.clientUpstreamReader.cancel()}catch{}try{await this.serverUpstreamWriter.close()}catch{}try{await this.clientEnd.upstream.readable.cancel()}catch{}try{await this.clientEnd.downstream.writable.close()}catch{}}}async TLSHandshake(e,t){const r=await this.readNextHandshakeMessage(T.ClientHello);if(!r.body.cipher_suites.length)throw new Error("Client did not propose any supported cipher suites.");const n=crypto.getRandomValues(new Uint8Array(32));await this.writeTLSRecord(C.Handshake,W.serverHello(r.body,n,qe.Null)),await this.writeTLSRecord(C.Handshake,W.certificate(t));const i=await je,a=r.body.random,_=await W.ECDHEServerKeyExchange(a,n,i,e);await this.writeTLSRecord(C.Handshake,_),await this.writeTLSRecord(C.Handshake,W.serverHelloDone());const c=await this.readNextHandshakeMessage(T.ClientKeyExchange);await this.readNextMessage(C.ChangeCipherSpec),this.sessionKeys=await this.deriveSessionKeys({clientRandom:a,serverRandom:n,serverPrivateKey:i.privateKey,clientPublicKey:await crypto.subtle.importKey("raw",c.body.exchange_keys,{name:"ECDH",namedCurve:"P-256"},!1,[])}),await this.readNextHandshakeMessage(T.Finished),await this.writeTLSRecord(C.ChangeCipherSpec,W.changeCipherSpec()),await this.writeTLSRecord(C.Handshake,await W.createFinishedMessage(this.handshakeMessages,this.sessionKeys.masterSecret)),this.handshakeMessages=[],this.pollForClientMessages()}async deriveSessionKeys({clientRandom:e,serverRandom:t,serverPrivateKey:r,clientPublicKey:n}){const i=await crypto.subtle.deriveBits({name:"ECDH",public:n},r,256),a=new Uint8Array(await j(i,new TextEncoder().encode("master secret"),u.concatUint8Arrays([e,t]),48)),_=await j(a,new TextEncoder().encode("key expansion"),u.concatUint8Arrays([t,e]),40),c=new K(_),S=c.readUint8Array(16),l=c.readUint8Array(16),h=c.readUint8Array(4),A=c.readUint8Array(4);return{masterSecret:a,clientWriteKey:await crypto.subtle.importKey("raw",S,{name:"AES-GCM"},!1,["encrypt","decrypt"]),serverWriteKey:await crypto.subtle.importKey("raw",l,{name:"AES-GCM"},!1,["encrypt","decrypt"]),clientIV:h,serverIV:A}}async readNextHandshakeMessage(e){const t=await this.readNextMessage(C.Handshake);if(t.msg_type!==e)throw new Error(`Expected ${e} message`);return t}async readNextMessage(e){let t,r=!1;do t=await this.readNextTLSRecord(e),r=await this.accumulateUntilMessageIsComplete(t);while(r===!1);const n=p.TLSMessage(t.type,r);return t.type===C.Handshake&&this.handshakeMessages.push(t.fragment),n}async readNextTLSRecord(e){for(;;){for(let _=0;_<this.receivedTLSRecords.length;_++){const c=this.receivedTLSRecords[_];if(c.type===e)return this.receivedTLSRecords.splice(_,1),c}const t=await this.pollBytes(5),r=t[3]<<8|t[4],n=t[0],i=await this.pollBytes(r),a={type:n,version:{major:t[1],minor:t[2]},length:r,fragment:this.sessionKeys&&n!==C.ChangeCipherSpec?await this.decryptData(n,i):i};if(a.type===C.Alert){const _=a.fragment[0],c=a.fragment[1],S=fe[_],l=Te[c];throw _===de.Warning&&c===Ee.CloseNotify?new O("TLS connection closed by peer (CloseNotify)"):new Error(`TLS alert received: ${S} ${l}`)}this.receivedTLSRecords.push(a)}}async pollBytes(e){for(;this.receivedBytesBuffer.length<e;){const{value:r,done:n}=await this.clientUpstreamReader.read();if(n)throw await this.close(),new O("TLS connection closed");if(this.receivedBytesBuffer=u.concatUint8Arrays([this.receivedBytesBuffer,r]),this.receivedBytesBuffer.length>=e)break;await new Promise(i=>setTimeout(i,100))}const t=this.receivedBytesBuffer.slice(0,e);return this.receivedBytesBuffer=this.receivedBytesBuffer.slice(e),t}async pollForClientMessages(){try{for(;;){const e=await this.readNextMessage(C.ApplicationData);this.serverUpstreamWriter.write(e.body)}}catch(e){if(e instanceof O)return;throw e}}async decryptData(e,t){const r=this.sessionKeys.clientIV,n=t.slice(0,8),i=new Uint8Array([...r,...n]),a=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:new Uint8Array([...J(this.receivedRecordSequenceNumber),e,...x,...P(t.length-8-16)]),tagLength:128},this.sessionKeys.clientWriteKey,t.slice(8));return++this.receivedRecordSequenceNumber,new Uint8Array(a)}async accumulateUntilMessageIsComplete(e){this.partialTLSMessages[e.type]=u.concatUint8Arrays([this.partialTLSMessages[e.type]||new Uint8Array,e.fragment]);const t=this.partialTLSMessages[e.type];switch(e.type){case C.Handshake:{if(t.length<4)return!1;const r=t[1]<<8|t[2];if(t.length<3+r)return!1;break}case C.Alert:{if(t.length<2)return!1;break}case C.ChangeCipherSpec:case C.ApplicationData:break;default:throw new Error(`TLS: Unsupported record type ${e.type}`)}return delete this.partialTLSMessages[e.type],t}async writeTLSRecord(e,t){e===C.Handshake&&this.handshakeMessages.push(t),this.sessionKeys&&e!==C.ChangeCipherSpec&&(t=await this.encryptData(e,t));const r=x,n=t.length,i=new Uint8Array(5);i[0]=e,i[1]=r[0],i[2]=r[1],i[3]=n>>8&255,i[4]=n&255;const a=u.concatUint8Arrays([i,t]);this.clientDownstreamWriter.write(a)}async encryptData(e,t){const r=this.sessionKeys.serverIV,n=crypto.getRandomValues(new Uint8Array(8)),i=new Uint8Array([...r,...n]),a=new Uint8Array([...J(this.sentRecordSequenceNumber),e,...x,...P(t.length)]),_=await crypto.subtle.encrypt({name:"AES-GCM",iv:i,additionalData:a,tagLength:128},this.sessionKeys.serverWriteKey,t);return++this.sentRecordSequenceNumber,u.concatUint8Arrays([n,new Uint8Array(_)])}}class p{static TLSMessage(e,t){switch(e){case C.Handshake:return p.clientHandshake(t);case C.Alert:return p.alert(t);case C.ChangeCipherSpec:return p.changeCipherSpec();case C.ApplicationData:return p.applicationData(t);default:throw new Error(`TLS: Unsupported TLS record type ${e}`)}}static parseCipherSuites(e){const t=new K(e);t.readUint16();const r=[];for(;!t.isFinished();){const n=t.readUint16();n in Q&&r.push(Q[n])}return r}static applicationData(e){return{type:C.ApplicationData,body:e}}static changeCipherSpec(){return{type:C.ChangeCipherSpec,body:new Uint8Array}}static alert(e){return{type:C.Alert,level:fe[e[0]],description:Te[e[1]]}}static clientHandshake(e){const t=e[0],r=e[1]<<16|e[2]<<8|e[3],n=e.slice(4);let i;switch(t){case T.HelloRequest:i=p.clientHelloRequestPayload();break;case T.ClientHello:i=p.clientHelloPayload(n);break;case T.ClientKeyExchange:i=p.clientKeyExchangePayload(n);break;case T.Finished:i=p.clientFinishedPayload(n);break;default:throw new Error(`Invalid handshake type ${t}`)}return{type:C.Handshake,msg_type:t,length:r,body:i}}static clientHelloRequestPayload(){return{}}static clientHelloPayload(e){const t=new K(e.buffer),r={client_version:t.readUint8Array(2),random:t.readUint8Array(32)},n=t.readUint8();r.session_id=t.readUint8Array(n);const i=t.readUint16();r.cipher_suites=p.parseCipherSuites(t.readUint8Array(i).buffer);const a=t.readUint8();r.compression_methods=t.readUint8Array(a);const _=t.readUint16();return r.extensions=ke(t.readUint8Array(_)),r}static clientKeyExchangePayload(e){return{exchange_keys:e.slice(1,e.length)}}static clientFinishedPayload(e){return{verify_data:e}}}function $e(s){return new TransformStream({transform(e,t){for(;e.length>0;)t.enqueue(e.slice(0,s)),e=e.slice(s)}})}class W{static certificate(e){const t=[];for(const i of e)t.push(g(i.byteLength)),t.push(new Uint8Array(i));const r=u.concatUint8Arrays(t),n=new Uint8Array([...g(r.byteLength),...r]);return new Uint8Array([T.Certificate,...g(n.length),...n])}static async ECDHEServerKeyExchange(e,t,r,n){const i=new Uint8Array(await crypto.subtle.exportKey("raw",r.publicKey)),a=new Uint8Array([Fe.NamedCurve,...P(Oe.secp256r1),i.byteLength,...i]),_=await crypto.subtle.sign({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},n,new Uint8Array([...e,...t,...a])),c=new Uint8Array(_),S=new Uint8Array([z.sha256,V.rsa]),l=new Uint8Array([...a,...S,...P(c.length),...c]);return new Uint8Array([T.ServerKeyExchange,...g(l.length),...l])}static serverHello(e,t,r){const n=e.extensions.map(_=>{switch(_.type){case"server_name":return le.encodeForClient();case"ec_point_formats":return he.encodeForClient("uncompressed");case"renegotiation_info":return ue.encodeForClient()}}).filter(_=>_!==void 0),i=u.concatUint8Arrays(n),a=new Uint8Array([...x,...t,e.session_id.length,...e.session_id,...P(Ae.TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256),r,...P(i.length),...i]);return new Uint8Array([T.ServerHello,...g(a.length),...a])}static serverHelloDone(){return new Uint8Array([T.ServerHelloDone,...g(0)])}static async createFinishedMessage(e,t){const r=await crypto.subtle.digest("SHA-256",u.concatUint8Arrays(e)),n=new Uint8Array(await j(t,new TextEncoder().encode("server finished"),r,12));return new Uint8Array([T.Finished,...g(n.length),...n])}static changeCipherSpec(){return new Uint8Array([1])}}function pe(s,e){return Ye.generateCertificate(s,e)}function Ve(s){return`-----BEGIN CERTIFICATE-----
1
+ "use strict";var Ke=Object.create;var Y=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var We=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var Re=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of We(e))!be.call(s,r)&&r!==t&&Y(s,r,{get:()=>e[r],enumerable:!(n=De(e,r))||n.enumerable});return s};var f=(s,e,t)=>(t=s!=null?Ke(Pe(s)):{},Re(e||!s||!s.__esModule?Y(t,"default",{value:s,enumerable:!0}):t,s));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("@php-wasm/universal"),u=require("@php-wasm/util"),v=require("@php-wasm/logger"),$=require("@php-wasm/web-service-worker"),Be=require("@wp-playground/common"),Ue=require("wasm-feature-detect"),J=require("@php-wasm/fs-journal");async function ce(s=d.LatestSupportedPHPVersion){switch(s){case"8.5":return(await import("@php-wasm/web-8-5")).getPHPLoaderModule();case"8.4":return(await import("@php-wasm/web-8-4")).getPHPLoaderModule();case"8.3":return(await import("@php-wasm/web-8-3")).getPHPLoaderModule();case"8.2":return(await import("@php-wasm/web-8-2")).getPHPLoaderModule();case"8.1":return(await import("@php-wasm/web-8-1")).getPHPLoaderModule();case"8.0":return(await import("@php-wasm/web-8-0")).getPHPLoaderModule();case"7.4":return(await import("@php-wasm/web-7-4")).getPHPLoaderModule();case"5.2":return(await import("@php-wasm/web-5-2")).getPHPLoaderModule()}throw new Error(`Unsupported PHP version ${s}`)}function y(s){return Object.fromEntries(Object.entries(s).map(([e,t])=>[t,e]))}function P(s){return new Uint8Array([s>>8&255,s&255])}function g(s){return new Uint8Array([s>>16&255,s>>8&255,s&255])}function Z(s){const e=new ArrayBuffer(8);return new DataView(e).setBigUint64(0,BigInt(s),!1),new Uint8Array(e)}class K{constructor(e){this.offset=0,this.buffer=e,this.view=new DataView(e)}readUint8(){const e=this.view.getUint8(this.offset);return this.offset+=1,e}readUint16(){const e=this.view.getUint16(this.offset);return this.offset+=2,e}readUint32(){const e=this.view.getUint32(this.offset);return this.offset+=4,e}readUint8Array(e){const t=this.buffer.slice(this.offset,this.offset+e);return this.offset+=e,new Uint8Array(t)}isFinished(){return this.offset>=this.buffer.byteLength}}class N{constructor(e){this.offset=0,this.buffer=new ArrayBuffer(e),this.uint8Array=new Uint8Array(this.buffer),this.view=new DataView(this.buffer)}writeUint8(e){this.view.setUint8(this.offset,e),this.offset+=1}writeUint16(e){this.view.setUint16(this.offset,e),this.offset+=2}writeUint32(e){this.view.setUint32(this.offset,e),this.offset+=4}writeUint8Array(e){this.uint8Array.set(e,this.offset),this.offset+=e.length}}const b={server_name:0,max_fragment_length:1,client_certificate_url:2,trusted_ca_keys:3,truncated_hmac:4,status_request:5,user_mapping:6,client_authz:7,server_authz:8,cert_type:9,supported_groups:10,ec_point_formats:11,srp:12,signature_algorithms:13,use_srtp:14,heartbeat:15,application_layer_protocol_negotiation:16,status_request_v2:17,signed_certificate_timestamp:18,client_certificate_type:19,server_certificate_type:20,padding:21,encrypt_then_mac:22,extended_master_secret:23,token_binding:24,cached_info:25,tls_its:26,compress_certificate:27,record_size_limit:28,pwd_protect:29,pwo_clear:30,password_salt:31,ticket_pinning:32,tls_cert_with_extern_psk:33,delegated_credential:34,session_ticket:35,TLMSP:36,TLMSP_proxying:37,TLMSP_delegate:38,supported_ekt_ciphers:39,pre_shared_key:41,early_data:42,supported_versions:43,cookie:44,psk_key_exchange_modes:45,reserved:46,certificate_authorities:47,oid_filters:48,post_handshake_auth:49,signature_algorithms_cert:50,key_share:51,transparency_info:52,connection_id:54,renegotiation_info:65281},ve=y(b),Se={host_name:0},Me=y(Se);class le{static decodeFromClient(e){const t=new DataView(e.buffer);let n=0;const r=t.getUint16(n);n+=2;const i=[];for(;n<r+2;){const a=e[n];n+=1;const _=t.getUint16(n);n+=2;const c=e.slice(n,n+_);switch(n+=_,a){case Se.host_name:i.push({name_type:Me[a],name:{host_name:new TextDecoder().decode(c)}});break;default:throw new Error(`Unsupported name type ${a}`)}}return{server_name_list:i}}static encodeForClient(e){if(e!=null&&e.server_name_list.length)throw new Error("Encoding non-empty lists for ClientHello is not supported yet. Only empty lists meant for ServerHello are supported today.");const t=new N(4);return t.writeUint16(b.server_name),t.writeUint16(0),t.uint8Array}}const Ce={uncompressed:0,ansiX962_compressed_prime:1,ansiX962_compressed_char2:2},X=y(Ce);class he{static decodeFromClient(e){const t=new K(e.buffer),n=t.readUint8(),r=[];for(let i=0;i<n;i++){const a=t.readUint8();a in X&&r.push(X[a])}return r}static encodeForClient(e){const t=new N(6);return t.writeUint16(b.ec_point_formats),t.writeUint16(2),t.writeUint8(1),t.writeUint8(Ce[e]),t.uint8Array}}const ue={decodeFromClient(s){const e=s[0]??0;return{renegotiatedConnection:s.slice(1,1+e)}},encodeForClient(){const s=b.renegotiation_info,e=new Uint8Array([0]);return new Uint8Array([s>>8&255,s&255,0,e.length,...e])}},Ae={TLS1_CK_PSK_WITH_RC4_128_SHA:138,TLS1_CK_PSK_WITH_3DES_EDE_CBC_SHA:139,TLS1_CK_PSK_WITH_AES_128_CBC_SHA:140,TLS1_CK_PSK_WITH_AES_256_CBC_SHA:141,TLS1_CK_DHE_PSK_WITH_RC4_128_SHA:142,TLS1_CK_DHE_PSK_WITH_3DES_EDE_CBC_SHA:143,TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA:144,TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA:145,TLS1_CK_RSA_PSK_WITH_RC4_128_SHA:146,TLS1_CK_RSA_PSK_WITH_3DES_EDE_CBC_SHA:147,TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA:148,TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA:149,TLS1_CK_PSK_WITH_AES_128_GCM_SHA256:168,TLS1_CK_PSK_WITH_AES_256_GCM_SHA384:169,TLS1_CK_DHE_PSK_WITH_AES_128_GCM_SHA256:170,TLS1_CK_DHE_PSK_WITH_AES_256_GCM_SHA384:171,TLS1_CK_RSA_PSK_WITH_AES_128_GCM_SHA256:172,TLS1_CK_RSA_PSK_WITH_AES_256_GCM_SHA384:173,TLS1_CK_PSK_WITH_AES_128_CBC_SHA256:174,TLS1_CK_PSK_WITH_AES_256_CBC_SHA384:175,TLS1_CK_PSK_WITH_NULL_SHA256:176,TLS1_CK_PSK_WITH_NULL_SHA384:177,TLS1_CK_DHE_PSK_WITH_AES_128_CBC_SHA256:178,TLS1_CK_DHE_PSK_WITH_AES_256_CBC_SHA384:179,TLS1_CK_DHE_PSK_WITH_NULL_SHA256:180,TLS1_CK_DHE_PSK_WITH_NULL_SHA384:181,TLS1_CK_RSA_PSK_WITH_AES_128_CBC_SHA256:182,TLS1_CK_RSA_PSK_WITH_AES_256_CBC_SHA384:183,TLS1_CK_RSA_PSK_WITH_NULL_SHA256:184,TLS1_CK_RSA_PSK_WITH_NULL_SHA384:185,TLS1_CK_PSK_WITH_NULL_SHA:44,TLS1_CK_DHE_PSK_WITH_NULL_SHA:45,TLS1_CK_RSA_PSK_WITH_NULL_SHA:46,TLS1_CK_RSA_WITH_AES_128_SHA:47,TLS1_CK_DH_DSS_WITH_AES_128_SHA:48,TLS1_CK_DH_RSA_WITH_AES_128_SHA:49,TLS1_CK_DHE_DSS_WITH_AES_128_SHA:50,TLS1_CK_DHE_RSA_WITH_AES_128_SHA:51,TLS1_CK_ADH_WITH_AES_128_SHA:52,TLS1_CK_RSA_WITH_AES_256_SHA:53,TLS1_CK_DH_DSS_WITH_AES_256_SHA:54,TLS1_CK_DH_RSA_WITH_AES_256_SHA:55,TLS1_CK_DHE_DSS_WITH_AES_256_SHA:56,TLS1_CK_DHE_RSA_WITH_AES_256_SHA:57,TLS1_CK_ADH_WITH_AES_256_SHA:58,TLS1_CK_RSA_WITH_NULL_SHA256:59,TLS1_CK_RSA_WITH_AES_128_SHA256:60,TLS1_CK_RSA_WITH_AES_256_SHA256:61,TLS1_CK_DH_DSS_WITH_AES_128_SHA256:62,TLS1_CK_DH_RSA_WITH_AES_128_SHA256:63,TLS1_CK_DHE_DSS_WITH_AES_128_SHA256:64,TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA:65,TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:66,TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:67,TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:68,TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:69,TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA:70,TLS1_CK_DHE_RSA_WITH_AES_128_SHA256:103,TLS1_CK_DH_DSS_WITH_AES_256_SHA256:104,TLS1_CK_DH_RSA_WITH_AES_256_SHA256:105,TLS1_CK_DHE_DSS_WITH_AES_256_SHA256:106,TLS1_CK_DHE_RSA_WITH_AES_256_SHA256:107,TLS1_CK_ADH_WITH_AES_128_SHA256:108,TLS1_CK_ADH_WITH_AES_256_SHA256:109,TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA:132,TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:133,TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:134,TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:135,TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:136,TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA:137,TLS1_CK_RSA_WITH_SEED_SHA:150,TLS1_CK_DH_DSS_WITH_SEED_SHA:151,TLS1_CK_DH_RSA_WITH_SEED_SHA:152,TLS1_CK_DHE_DSS_WITH_SEED_SHA:153,TLS1_CK_DHE_RSA_WITH_SEED_SHA:154,TLS1_CK_ADH_WITH_SEED_SHA:155,TLS1_CK_RSA_WITH_AES_128_GCM_SHA256:156,TLS1_CK_RSA_WITH_AES_256_GCM_SHA384:157,TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256:158,TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384:159,TLS1_CK_DH_RSA_WITH_AES_128_GCM_SHA256:160,TLS1_CK_DH_RSA_WITH_AES_256_GCM_SHA384:161,TLS1_CK_DHE_DSS_WITH_AES_128_GCM_SHA256:162,TLS1_CK_DHE_DSS_WITH_AES_256_GCM_SHA384:163,TLS1_CK_DH_DSS_WITH_AES_128_GCM_SHA256:164,TLS1_CK_DH_DSS_WITH_AES_256_GCM_SHA384:165,TLS1_CK_ADH_WITH_AES_128_GCM_SHA256:166,TLS1_CK_ADH_WITH_AES_256_GCM_SHA384:167,TLS1_CK_RSA_WITH_AES_128_CCM:49308,TLS1_CK_RSA_WITH_AES_256_CCM:49309,TLS1_CK_DHE_RSA_WITH_AES_128_CCM:49310,TLS1_CK_DHE_RSA_WITH_AES_256_CCM:49311,TLS1_CK_RSA_WITH_AES_128_CCM_8:49312,TLS1_CK_RSA_WITH_AES_256_CCM_8:49313,TLS1_CK_DHE_RSA_WITH_AES_128_CCM_8:49314,TLS1_CK_DHE_RSA_WITH_AES_256_CCM_8:49315,TLS1_CK_PSK_WITH_AES_128_CCM:49316,TLS1_CK_PSK_WITH_AES_256_CCM:49317,TLS1_CK_DHE_PSK_WITH_AES_128_CCM:49318,TLS1_CK_DHE_PSK_WITH_AES_256_CCM:49319,TLS1_CK_PSK_WITH_AES_128_CCM_8:49320,TLS1_CK_PSK_WITH_AES_256_CCM_8:49321,TLS1_CK_DHE_PSK_WITH_AES_128_CCM_8:49322,TLS1_CK_DHE_PSK_WITH_AES_256_CCM_8:49323,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM:49324,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM:49325,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CCM_8:49326,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CCM_8:49327,TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA256:186,TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:187,TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:188,TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:189,TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:190,TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA256:191,TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA256:192,TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:193,TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:194,TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:195,TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:196,TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA256:197,TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA:49153,TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA:49154,TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA:49155,TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA:49156,TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA:49157,TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA:49158,TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA:49159,TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA:49160,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:49161,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:49162,TLS1_CK_ECDH_RSA_WITH_NULL_SHA:49163,TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA:49164,TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA:49165,TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA:49166,TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA:49167,TLS1_CK_ECDHE_RSA_WITH_NULL_SHA:49168,TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA:49169,TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA:49170,TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA:49171,TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA:49172,TLS1_CK_ECDH_anon_WITH_NULL_SHA:49173,TLS1_CK_ECDH_anon_WITH_RC4_128_SHA:49174,TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA:49175,TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA:49176,TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA:49177,TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA:49178,TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:49179,TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:49180,TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA:49181,TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:49182,TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:49183,TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA:49184,TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:49185,TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:49186,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256:49187,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384:49188,TLS1_CK_ECDH_ECDSA_WITH_AES_128_SHA256:49189,TLS1_CK_ECDH_ECDSA_WITH_AES_256_SHA384:49190,TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256:49191,TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384:49192,TLS1_CK_ECDH_RSA_WITH_AES_128_SHA256:49193,TLS1_CK_ECDH_RSA_WITH_AES_256_SHA384:49194,TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:49195,TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:49196,TLS1_CK_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:49197,TLS1_CK_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:49198,TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256:49199,TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384:49200,TLS1_CK_ECDH_RSA_WITH_AES_128_GCM_SHA256:49201,TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384:49202,TLS1_CK_ECDHE_PSK_WITH_RC4_128_SHA:49203,TLS1_CK_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:49204,TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA:49205,TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA:49206,TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA256:49207,TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA384:49208,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA:49209,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA256:49210,TLS1_CK_ECDHE_PSK_WITH_NULL_SHA384:49211,TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:49266,TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:49267,TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:49268,TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:49269,TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:49270,TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:49271,TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:49272,TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:49273,TLS1_CK_PSK_WITH_CAMELLIA_128_CBC_SHA256:49300,TLS1_CK_PSK_WITH_CAMELLIA_256_CBC_SHA384:49301,TLS1_CK_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:49302,TLS1_CK_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:49303,TLS1_CK_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:49304,TLS1_CK_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:49305,TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:49306,TLS1_CK_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:49307,TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305:52392,TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:52393,TLS1_CK_DHE_RSA_WITH_CHACHA20_POLY1305:52394,TLS1_CK_PSK_WITH_CHACHA20_POLY1305:52395,TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305:52396,TLS1_CK_DHE_PSK_WITH_CHACHA20_POLY1305:52397,TLS1_CK_RSA_PSK_WITH_CHACHA20_POLY1305:52398},Q=y(Ae),He={secp256r1:23,secp384r1:24,secp521r1:25,x25519:29,x448:30},ee=y(He);class xe{static decodeFromClient(e){const t=new K(e.buffer);t.readUint16();const n=[];for(;!t.isFinished();){const r=t.readUint16();r in ee&&n.push(ee[r])}return n}static encodeForClient(e){const t=new N(6);return t.writeUint16(b.supported_groups),t.writeUint16(2),t.writeUint16(He[e]),t.uint8Array}}const V={anonymous:0,rsa:1,dsa:2,ecdsa:3},te=y(V),z={none:0,md5:1,sha1:2,sha224:3,sha256:4,sha384:5,sha512:6},ne=y(z);class Ne{static decodeFromClient(e){const t=new K(e.buffer);t.readUint16();const n=[];for(;!t.isFinished();){const r=t.readUint8(),i=t.readUint8();if(te[i]){if(!ne[r]){v.logger.warn(`Unknown hash algorithm: ${r}`);continue}n.push({algorithm:te[i],hash:ne[r]})}}return n}static encodeforClient(e,t){const n=new N(6);return n.writeUint16(b.signature_algorithms),n.writeUint16(2),n.writeUint8(z[e]),n.writeUint8(V[t]),n.uint8Array}}const re={server_name:le,signature_algorithms:Ne,supported_groups:xe,ec_point_formats:he,renegotiation_info:ue};function ke(s){const e=new K(s.buffer),t=[];for(;!e.isFinished();){const n=e.offset,r=e.readUint16(),i=ve[r],a=e.readUint16(),_=e.readUint8Array(a);if(!(i in re))continue;const c=re[i];t.push({type:i,data:c.decodeFromClient(_),raw:s.slice(n,n+4+a)})}return t}async function j(s,e,t,n){const r=u.concatArrayBuffers([e,t]),i=await crypto.subtle.importKey("raw",s,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]);let a=r;const _=[];for(;u.concatArrayBuffers(_).byteLength<n;){a=await se(i,a);const S=u.concatArrayBuffers([a,r]),l=await se(i,S);_.push(l)}return u.concatArrayBuffers(_).slice(0,n)}async function se(s,e){return await crypto.subtle.sign({name:"HMAC",hash:"SHA-256"},s,e)}const qe={Null:0},de={Warning:1,Fatal:2},fe=y(de),Ee={CloseNotify:0,UnexpectedMessage:10,BadRecordMac:20,DecryptionFailed:21,RecordOverflow:22,DecompressionFailure:30,HandshakeFailure:40,NoCertificate:41,BadCertificate:42,UnsupportedCertificate:43,CertificateRevoked:44,CertificateExpired:45,CertificateUnknown:46,IllegalParameter:47,UnknownCa:48,AccessDenied:49,DecodeError:50,DecryptError:51,ExportRestriction:60,ProtocolVersion:70,InsufficientSecurity:71,InternalError:80,UserCanceled:90,NoRenegotiation:100,UnsupportedExtension:110},Te=y(Ee),C={ChangeCipherSpec:20,Alert:21,Handshake:22,ApplicationData:23},T={HelloRequest:0,ClientHello:1,ServerHello:2,Certificate:11,ServerKeyExchange:12,ServerHelloDone:14,ClientKeyExchange:16,Finished:20},Fe={NamedCurve:3},Oe={secp256r1:23};class O extends Error{}const x=new Uint8Array([3,3]),je=crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey","deriveBits"]);class Ge{constructor(){this.receivedRecordSequenceNumber=0,this.sentRecordSequenceNumber=0,this.closed=!1,this.receivedBytesBuffer=new Uint8Array,this.receivedTLSRecords=[],this.partialTLSMessages={},this.handshakeMessages=[],this.MAX_CHUNK_SIZE=1024*16,this.clientEnd={upstream:new TransformStream,downstream:new TransformStream},this.clientDownstreamWriter=this.clientEnd.downstream.writable.getWriter(),this.clientUpstreamReader=this.clientEnd.upstream.readable.getReader(),this.serverEnd={upstream:new TransformStream,downstream:$e(this.MAX_CHUNK_SIZE)},this.serverUpstreamWriter=this.serverEnd.upstream.writable.getWriter();const e=this;this.serverEnd.downstream.readable.pipeTo(new WritableStream({async write(t){await e.writeTLSRecord(C.ApplicationData,t)},async abort(t){e.clientDownstreamWriter.releaseLock(),e.clientEnd.downstream.writable.abort(t),e.close()},close(){e.close()}})).catch(()=>{})}async close(){if(!this.closed){this.closed=!0;try{await this.clientDownstreamWriter.close()}catch{}try{await this.clientUpstreamReader.cancel()}catch{}try{await this.serverUpstreamWriter.close()}catch{}try{await this.clientEnd.upstream.readable.cancel()}catch{}try{await this.clientEnd.downstream.writable.close()}catch{}}}async TLSHandshake(e,t){const n=await this.readNextHandshakeMessage(T.ClientHello);if(!n.body.cipher_suites.length)throw new Error("Client did not propose any supported cipher suites.");const r=crypto.getRandomValues(new Uint8Array(32));await this.writeTLSRecord(C.Handshake,W.serverHello(n.body,r,qe.Null)),await this.writeTLSRecord(C.Handshake,W.certificate(t));const i=await je,a=n.body.random,_=await W.ECDHEServerKeyExchange(a,r,i,e);await this.writeTLSRecord(C.Handshake,_),await this.writeTLSRecord(C.Handshake,W.serverHelloDone());const c=await this.readNextHandshakeMessage(T.ClientKeyExchange);await this.readNextMessage(C.ChangeCipherSpec),this.sessionKeys=await this.deriveSessionKeys({clientRandom:a,serverRandom:r,serverPrivateKey:i.privateKey,clientPublicKey:await crypto.subtle.importKey("raw",c.body.exchange_keys,{name:"ECDH",namedCurve:"P-256"},!1,[])}),await this.readNextHandshakeMessage(T.Finished),await this.writeTLSRecord(C.ChangeCipherSpec,W.changeCipherSpec()),await this.writeTLSRecord(C.Handshake,await W.createFinishedMessage(this.handshakeMessages,this.sessionKeys.masterSecret)),this.handshakeMessages=[],this.pollForClientMessages()}async deriveSessionKeys({clientRandom:e,serverRandom:t,serverPrivateKey:n,clientPublicKey:r}){const i=await crypto.subtle.deriveBits({name:"ECDH",public:r},n,256),a=new Uint8Array(await j(i,new TextEncoder().encode("master secret"),u.concatUint8Arrays([e,t]),48)),_=await j(a,new TextEncoder().encode("key expansion"),u.concatUint8Arrays([t,e]),40),c=new K(_),S=c.readUint8Array(16),l=c.readUint8Array(16),h=c.readUint8Array(4),A=c.readUint8Array(4);return{masterSecret:a,clientWriteKey:await crypto.subtle.importKey("raw",S,{name:"AES-GCM"},!1,["encrypt","decrypt"]),serverWriteKey:await crypto.subtle.importKey("raw",l,{name:"AES-GCM"},!1,["encrypt","decrypt"]),clientIV:h,serverIV:A}}async readNextHandshakeMessage(e){const t=await this.readNextMessage(C.Handshake);if(t.msg_type!==e)throw new Error(`Expected ${e} message`);return t}async readNextMessage(e){let t,n=!1;do t=await this.readNextTLSRecord(e),n=await this.accumulateUntilMessageIsComplete(t);while(n===!1);const r=p.TLSMessage(t.type,n);return t.type===C.Handshake&&this.handshakeMessages.push(t.fragment),r}async readNextTLSRecord(e){for(;;){for(let _=0;_<this.receivedTLSRecords.length;_++){const c=this.receivedTLSRecords[_];if(c.type===e)return this.receivedTLSRecords.splice(_,1),c}const t=await this.pollBytes(5),n=t[3]<<8|t[4],r=t[0],i=await this.pollBytes(n),a={type:r,version:{major:t[1],minor:t[2]},length:n,fragment:this.sessionKeys&&r!==C.ChangeCipherSpec?await this.decryptData(r,i):i};if(a.type===C.Alert){const _=a.fragment[0],c=a.fragment[1],S=fe[_],l=Te[c];throw _===de.Warning&&c===Ee.CloseNotify?new O("TLS connection closed by peer (CloseNotify)"):new Error(`TLS alert received: ${S} ${l}`)}this.receivedTLSRecords.push(a)}}async pollBytes(e){for(;this.receivedBytesBuffer.length<e;){const{value:n,done:r}=await this.clientUpstreamReader.read();if(r)throw await this.close(),new O("TLS connection closed");if(this.receivedBytesBuffer=u.concatUint8Arrays([this.receivedBytesBuffer,n]),this.receivedBytesBuffer.length>=e)break;await new Promise(i=>setTimeout(i,100))}const t=this.receivedBytesBuffer.slice(0,e);return this.receivedBytesBuffer=this.receivedBytesBuffer.slice(e),t}async pollForClientMessages(){try{for(;;){const e=await this.readNextMessage(C.ApplicationData);this.serverUpstreamWriter.write(e.body)}}catch(e){if(e instanceof O)return;throw e}}async decryptData(e,t){const n=this.sessionKeys.clientIV,r=t.slice(0,8),i=new Uint8Array([...n,...r]),a=await crypto.subtle.decrypt({name:"AES-GCM",iv:i,additionalData:new Uint8Array([...Z(this.receivedRecordSequenceNumber),e,...x,...P(t.length-8-16)]),tagLength:128},this.sessionKeys.clientWriteKey,t.slice(8));return++this.receivedRecordSequenceNumber,new Uint8Array(a)}async accumulateUntilMessageIsComplete(e){this.partialTLSMessages[e.type]=u.concatUint8Arrays([this.partialTLSMessages[e.type]||new Uint8Array,e.fragment]);const t=this.partialTLSMessages[e.type];switch(e.type){case C.Handshake:{if(t.length<4)return!1;const n=t[1]<<8|t[2];if(t.length<3+n)return!1;break}case C.Alert:{if(t.length<2)return!1;break}case C.ChangeCipherSpec:case C.ApplicationData:break;default:throw new Error(`TLS: Unsupported record type ${e.type}`)}return delete this.partialTLSMessages[e.type],t}async writeTLSRecord(e,t){e===C.Handshake&&this.handshakeMessages.push(t),this.sessionKeys&&e!==C.ChangeCipherSpec&&(t=await this.encryptData(e,t));const n=x,r=t.length,i=new Uint8Array(5);i[0]=e,i[1]=n[0],i[2]=n[1],i[3]=r>>8&255,i[4]=r&255;const a=u.concatUint8Arrays([i,t]);this.clientDownstreamWriter.write(a)}async encryptData(e,t){const n=this.sessionKeys.serverIV,r=crypto.getRandomValues(new Uint8Array(8)),i=new Uint8Array([...n,...r]),a=new Uint8Array([...Z(this.sentRecordSequenceNumber),e,...x,...P(t.length)]),_=await crypto.subtle.encrypt({name:"AES-GCM",iv:i,additionalData:a,tagLength:128},this.sessionKeys.serverWriteKey,t);return++this.sentRecordSequenceNumber,u.concatUint8Arrays([r,new Uint8Array(_)])}}class p{static TLSMessage(e,t){switch(e){case C.Handshake:return p.clientHandshake(t);case C.Alert:return p.alert(t);case C.ChangeCipherSpec:return p.changeCipherSpec();case C.ApplicationData:return p.applicationData(t);default:throw new Error(`TLS: Unsupported TLS record type ${e}`)}}static parseCipherSuites(e){const t=new K(e);t.readUint16();const n=[];for(;!t.isFinished();){const r=t.readUint16();r in Q&&n.push(Q[r])}return n}static applicationData(e){return{type:C.ApplicationData,body:e}}static changeCipherSpec(){return{type:C.ChangeCipherSpec,body:new Uint8Array}}static alert(e){return{type:C.Alert,level:fe[e[0]],description:Te[e[1]]}}static clientHandshake(e){const t=e[0],n=e[1]<<16|e[2]<<8|e[3],r=e.slice(4);let i;switch(t){case T.HelloRequest:i=p.clientHelloRequestPayload();break;case T.ClientHello:i=p.clientHelloPayload(r);break;case T.ClientKeyExchange:i=p.clientKeyExchangePayload(r);break;case T.Finished:i=p.clientFinishedPayload(r);break;default:throw new Error(`Invalid handshake type ${t}`)}return{type:C.Handshake,msg_type:t,length:n,body:i}}static clientHelloRequestPayload(){return{}}static clientHelloPayload(e){const t=new K(e.buffer),n={client_version:t.readUint8Array(2),random:t.readUint8Array(32)},r=t.readUint8();n.session_id=t.readUint8Array(r);const i=t.readUint16();n.cipher_suites=p.parseCipherSuites(t.readUint8Array(i).buffer);const a=t.readUint8();n.compression_methods=t.readUint8Array(a);const _=t.readUint16();return n.extensions=ke(t.readUint8Array(_)),n}static clientKeyExchangePayload(e){return{exchange_keys:e.slice(1,e.length)}}static clientFinishedPayload(e){return{verify_data:e}}}function $e(s){return new TransformStream({transform(e,t){for(;e.length>0;)t.enqueue(e.slice(0,s)),e=e.slice(s)}})}class W{static certificate(e){const t=[];for(const i of e)t.push(g(i.byteLength)),t.push(new Uint8Array(i));const n=u.concatUint8Arrays(t),r=new Uint8Array([...g(n.byteLength),...n]);return new Uint8Array([T.Certificate,...g(r.length),...r])}static async ECDHEServerKeyExchange(e,t,n,r){const i=new Uint8Array(await crypto.subtle.exportKey("raw",n.publicKey)),a=new Uint8Array([Fe.NamedCurve,...P(Oe.secp256r1),i.byteLength,...i]),_=await crypto.subtle.sign({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},r,new Uint8Array([...e,...t,...a])),c=new Uint8Array(_),S=new Uint8Array([z.sha256,V.rsa]),l=new Uint8Array([...a,...S,...P(c.length),...c]);return new Uint8Array([T.ServerKeyExchange,...g(l.length),...l])}static serverHello(e,t,n){const r=e.extensions.map(_=>{switch(_.type){case"server_name":return le.encodeForClient();case"ec_point_formats":return he.encodeForClient("uncompressed");case"renegotiation_info":return ue.encodeForClient()}}).filter(_=>_!==void 0),i=u.concatUint8Arrays(r),a=new Uint8Array([...x,...t,e.session_id.length,...e.session_id,...P(Ae.TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256),n,...P(i.length),...i]);return new Uint8Array([T.ServerHello,...g(a.length),...a])}static serverHelloDone(){return new Uint8Array([T.ServerHelloDone,...g(0)])}static async createFinishedMessage(e,t){const n=await crypto.subtle.digest("SHA-256",u.concatUint8Arrays(e)),r=new Uint8Array(await j(t,new TextEncoder().encode("server finished"),n,12));return new Uint8Array([T.Finished,...g(r.length),...r])}static changeCipherSpec(){return new Uint8Array([1])}}function pe(s,e){return Ye.generateCertificate(s,e)}function Ve(s){return`-----BEGIN CERTIFICATE-----
2
2
  ${ye(we(s.buffer))}
3
3
  -----END CERTIFICATE-----`}async function ze(s){const e=await crypto.subtle.exportKey("pkcs8",s);return`-----BEGIN PRIVATE KEY-----
4
4
  ${ye(we(e))}
5
- -----END PRIVATE KEY-----`}class Ye{static async generateCertificate(e,t){const r=await crypto.subtle.generateKey({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256",modulusLength:2048,publicExponent:new Uint8Array([1,0,1])},!0,["sign","verify"]),n=await this.signingRequest(e,r.publicKey),i=await this.sign(n,(t==null?void 0:t.privateKey)??r.privateKey);return{keyPair:r,certificate:i,tbsCertificate:n,tbsDescription:e}}static async sign(e,t){const r=await crypto.subtle.sign({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},t,e.buffer);return o.sequence([new Uint8Array(e.buffer),this.signatureAlgorithm("sha256WithRSAEncryption"),o.bitString(new Uint8Array(r))])}static async signingRequest(e,t){const r=[];return e.keyUsage&&r.push(this.keyUsage(e.keyUsage)),e.extKeyUsage&&r.push(this.extKeyUsage(e.extKeyUsage)),e.subjectAltNames&&r.push(this.subjectAltName(e.subjectAltNames)),e.nsCertType&&r.push(this.nsCertType(e.nsCertType)),e.basicConstraints&&r.push(this.basicConstraints(e.basicConstraints)),o.sequence([this.version(e.version),this.serialNumber(e.serialNumber),this.signatureAlgorithm(e.signatureAlgorithm),this.distinguishedName(e.issuer??e.subject),this.validity(e.validity),this.distinguishedName(e.subject),await this.subjectPublicKeyInfo(t),this.extensions(r)])}static version(e=2){return o.ASN1(160,o.integer(new Uint8Array([e])))}static serialNumber(e=crypto.getRandomValues(new Uint8Array(4))){return o.integer(e)}static signatureAlgorithm(e="sha256WithRSAEncryption"){return o.sequence([o.objectIdentifier(L(e)),o.null()])}static async subjectPublicKeyInfo(e){return new Uint8Array(await crypto.subtle.exportKey("spki",e))}static extensions(e){return o.ASN1(163,o.sequence(e))}static distinguishedName(e){const t=[];for(const[r,n]of Object.entries(e)){const i=[o.objectIdentifier(L(r))];switch(r){case"countryName":i.push(o.printableString(n));break;default:i.push(o.utf8String(n))}t.push(o.set([o.sequence(i)]))}return o.sequence(t)}static validity(e){return o.sequence([o.ASN1(E.UTCTime,new TextEncoder().encode(ae((e==null?void 0:e.notBefore)??new Date))),o.ASN1(E.UTCTime,new TextEncoder().encode(ae((e==null?void 0:e.notAfter)??Je(new Date,10))))])}static basicConstraints({ca:e=!0,pathLenConstraint:t=void 0}){const r=[o.boolean(e)];return t!==void 0&&r.push(o.integer(new Uint8Array([t]))),o.sequence([o.objectIdentifier(L("basicConstraints")),o.octetString(o.sequence(r))])}static keyUsage(e){const t=new Uint8Array([0]);return e!=null&&e.digitalSignature&&(t[0]|=1),e!=null&&e.nonRepudiation&&(t[0]|=2),e!=null&&e.keyEncipherment&&(t[0]|=4),e!=null&&e.dataEncipherment&&(t[0]|=8),e!=null&&e.keyAgreement&&(t[0]|=16),e!=null&&e.keyCertSign&&(t[0]|=32),e!=null&&e.cRLSign&&(t[0]|=64),e!=null&&e.encipherOnly&&(t[0]|=128),e!=null&&e.decipherOnly&&(t[0]|=64),o.sequence([o.objectIdentifier(L("keyUsage")),o.boolean(!0),o.octetString(o.bitString(t))])}static extKeyUsage(e={}){return o.sequence([o.objectIdentifier(L("extKeyUsage")),o.boolean(!0),o.octetString(o.sequence(Object.entries(e).map(([t,r])=>r?o.objectIdentifier(L(t)):o.null())))])}static nsCertType(e){const t=new Uint8Array([0]);return e.client&&(t[0]|=1),e.server&&(t[0]|=2),e.email&&(t[0]|=4),e.objsign&&(t[0]|=8),e.sslCA&&(t[0]|=16),e.emailCA&&(t[0]|=32),e.objCA&&(t[0]|=64),o.sequence([o.objectIdentifier(L("nsCertType")),o.octetString(t)])}static subjectAltName(e){var i,a;const t=((i=e.dnsNames)==null?void 0:i.map(_=>{const c=o.ia5String(_);return o.contextSpecific(2,c)}))||[],r=((a=e.ipAddresses)==null?void 0:a.map(_=>{const c=o.ia5String(_);return o.contextSpecific(7,c)}))||[],n=o.octetString(o.sequence([...t,...r]));return o.sequence([o.objectIdentifier(L("subjectAltName")),o.boolean(!0),n])}}const Ze={"1.2.840.113549.1.1.1":"rsaEncryption","1.2.840.113549.1.1.4":"md5WithRSAEncryption","1.2.840.113549.1.1.5":"sha1WithRSAEncryption","1.2.840.113549.1.1.7":"RSAES-OAEP","1.2.840.113549.1.1.8":"mgf1","1.2.840.113549.1.1.9":"pSpecified","1.2.840.113549.1.1.10":"RSASSA-PSS","1.2.840.113549.1.1.11":"sha256WithRSAEncryption","1.2.840.113549.1.1.12":"sha384WithRSAEncryption","1.2.840.113549.1.1.13":"sha512WithRSAEncryption","1.3.101.112":"EdDSA25519","1.2.840.10040.4.3":"dsa-with-sha1","1.3.14.3.2.7":"desCBC","1.3.14.3.2.26":"sha1","1.3.14.3.2.29":"sha1WithRSASignature","2.16.840.1.101.3.4.2.1":"sha256","2.16.840.1.101.3.4.2.2":"sha384","2.16.840.1.101.3.4.2.3":"sha512","2.16.840.1.101.3.4.2.4":"sha224","2.16.840.1.101.3.4.2.5":"sha512-224","2.16.840.1.101.3.4.2.6":"sha512-256","1.2.840.113549.2.2":"md2","1.2.840.113549.2.5":"md5","1.2.840.113549.1.7.1":"data","1.2.840.113549.1.7.2":"signedData","1.2.840.113549.1.7.3":"envelopedData","1.2.840.113549.1.7.4":"signedAndEnvelopedData","1.2.840.113549.1.7.5":"digestedData","1.2.840.113549.1.7.6":"encryptedData","1.2.840.113549.1.9.1":"emailAddress","1.2.840.113549.1.9.2":"unstructuredName","1.2.840.113549.1.9.3":"contentType","1.2.840.113549.1.9.4":"messageDigest","1.2.840.113549.1.9.5":"signingTime","1.2.840.113549.1.9.6":"counterSignature","1.2.840.113549.1.9.7":"challengePassword","1.2.840.113549.1.9.8":"unstructuredAddress","1.2.840.113549.1.9.14":"extensionRequest","1.2.840.113549.1.9.20":"friendlyName","1.2.840.113549.1.9.21":"localKeyId","1.2.840.113549.1.9.22.1":"x509Certificate","1.2.840.113549.1.12.10.1.1":"keyBag","1.2.840.113549.1.12.10.1.2":"pkcs8ShroudedKeyBag","1.2.840.113549.1.12.10.1.3":"certBag","1.2.840.113549.1.12.10.1.4":"crlBag","1.2.840.113549.1.12.10.1.5":"secretBag","1.2.840.113549.1.12.10.1.6":"safeContentsBag","1.2.840.113549.1.5.13":"pkcs5PBES2","1.2.840.113549.1.5.12":"pkcs5PBKDF2","1.2.840.113549.1.12.1.1":"pbeWithSHAAnd128BitRC4","1.2.840.113549.1.12.1.2":"pbeWithSHAAnd40BitRC4","1.2.840.113549.1.12.1.3":"pbeWithSHAAnd3-KeyTripleDES-CBC","1.2.840.113549.1.12.1.4":"pbeWithSHAAnd2-KeyTripleDES-CBC","1.2.840.113549.1.12.1.5":"pbeWithSHAAnd128BitRC2-CBC","1.2.840.113549.1.12.1.6":"pbewithSHAAnd40BitRC2-CBC","1.2.840.113549.2.7":"hmacWithSHA1","1.2.840.113549.2.8":"hmacWithSHA224","1.2.840.113549.2.9":"hmacWithSHA256","1.2.840.113549.2.10":"hmacWithSHA384","1.2.840.113549.2.11":"hmacWithSHA512","1.2.840.113549.3.7":"des-EDE3-CBC","2.16.840.1.101.3.4.1.2":"aes128-CBC","2.16.840.1.101.3.4.1.22":"aes192-CBC","2.16.840.1.101.3.4.1.42":"aes256-CBC","2.5.4.3":"commonName","2.5.4.4":"surname","2.5.4.5":"serialNumber","2.5.4.6":"countryName","2.5.4.7":"localityName","2.5.4.8":"stateOrProvinceName","2.5.4.9":"streetAddress","2.5.4.10":"organizationName","2.5.4.11":"organizationalUnitName","2.5.4.12":"title","2.5.4.13":"description","2.5.4.15":"businessCategory","2.5.4.17":"postalCode","2.5.4.42":"givenName","1.3.6.1.4.1.311.60.2.1.2":"jurisdictionOfIncorporationStateOrProvinceName","1.3.6.1.4.1.311.60.2.1.3":"jurisdictionOfIncorporationCountryName","2.16.840.1.113730.1.1":"nsCertType","2.16.840.1.113730.1.13":"nsComment","2.5.29.14":"subjectKeyIdentifier","2.5.29.15":"keyUsage","2.5.29.17":"subjectAltName","2.5.29.18":"issuerAltName","2.5.29.19":"basicConstraints","2.5.29.31":"cRLDistributionPoints","2.5.29.32":"certificatePolicies","2.5.29.35":"authorityKeyIdentifier","2.5.29.37":"extKeyUsage","1.3.6.1.4.1.11129.2.4.2":"timestampList","1.3.6.1.5.5.7.1.1":"authorityInfoAccess","1.3.6.1.5.5.7.3.1":"serverAuth","1.3.6.1.5.5.7.3.2":"clientAuth","1.3.6.1.5.5.7.3.3":"codeSigning","1.3.6.1.5.5.7.3.4":"emailProtection","1.3.6.1.5.5.7.3.8":"timeStamping"};function L(s){for(const[e,t]of Object.entries(Ze))if(t===s)return e;throw new Error(`OID not found for name: ${s}`)}const ie=32,E={Boolean:1,Integer:2,BitString:3,OctetString:4,Null:5,OID:6,Utf8String:12,Sequence:16|ie,Set:17|ie,PrintableString:19,IA5String:22,UTCTime:23};class o{static length_(e){if(e<128)return new Uint8Array([e]);{let t=e;const r=[];for(;t>0;)r.unshift(t&255),t>>=8;const n=r.length,i=new Uint8Array(1+n);i[0]=128|n;for(let a=0;a<n;a++)i[a+1]=r[a];return i}}static ASN1(e,t){const r=o.length_(t.length),n=new Uint8Array(1+r.length+t.length);return n[0]=e,n.set(r,1),n.set(t,1+r.length),n}static integer(e){let t=0;for(;t<e.length-1&&e[t]===0&&e[t+1]<128;)t++;if(t>0&&(e=e.subarray(t)),e[0]>127){const r=new Uint8Array(e.length+1);r[0]=0,r.set(e,1),e=r}return o.ASN1(E.Integer,e)}static bitString(e){const t=new Uint8Array([0]),r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),o.ASN1(E.BitString,r)}static octetString(e){return o.ASN1(E.OctetString,e)}static null(){return o.ASN1(E.Null,new Uint8Array(0))}static objectIdentifier(e){const t=e.split(".").map(Number),n=[t[0]*40+t[1]];for(let i=2;i<t.length;i++){let a=t[i];const _=[];do _.unshift(a&127),a>>=7;while(a>0);for(let c=0;c<_.length-1;c++)_[c]|=128;n.push(..._)}return o.ASN1(E.OID,new Uint8Array(n))}static utf8String(e){const t=new TextEncoder().encode(e);return o.ASN1(E.Utf8String,t)}static printableString(e){const t=new TextEncoder().encode(e);return o.ASN1(E.PrintableString,t)}static sequence(e){return o.ASN1(E.Sequence,u.concatUint8Arrays(e))}static set(e){return o.ASN1(E.Set,u.concatUint8Arrays(e))}static ia5String(e){const t=new TextEncoder().encode(e);return o.ASN1(E.IA5String,t)}static contextSpecific(e,t,r=!1){const n=(r?160:128)|e;return o.ASN1(n,t)}static boolean(e){return o.ASN1(E.Boolean,new Uint8Array([e?255:0]))}}function we(s){return btoa(String.fromCodePoint(...new Uint8Array(s)))}function ye(s){var e;return((e=s.match(/.{1,64}/g))==null?void 0:e.join(`
6
- `))||s}function ae(s){const e=s.getUTCFullYear().toString().substr(2),t=U(s.getUTCMonth()+1),r=U(s.getUTCDate()),n=U(s.getUTCHours()),i=U(s.getUTCMinutes()),a=U(s.getUTCSeconds());return`${e}${t}${r}${n}${i}${a}Z`}function U(s){return s.toString().padStart(2,"0")}function Je(s,e){const t=new Date(s);return t.setUTCFullYear(t.getUTCFullYear()+e),t}class Xe extends TransformStream{constructor(){let e=new Uint8Array(0),t="SCAN_CHUNK_SIZE",r=0;super({transform(n,i){for(e=u.concatUint8Arrays([e,n]);e.length>0;)if(t==="SCAN_CHUNK_SIZE"){if(e.length<3)return;let a=0;for(;a<e.length;){const S=e[a];if(!(S>=48&&S<=57||S>=97&&S<=102||S>=65&&S<=70))break;a++}if(a===0)throw new Error("Invalid chunk size format");if(e.length<a+2)return;if(e[a]!==13||e[a+1]!==10)throw new Error("Invalid chunk size format. Expected CRLF after chunk size");const _=new TextDecoder().decode(e.slice(0,a)),c=parseInt(_,16);if(e=e.slice(a+2),c===0){t="SCAN_FINAL_CHUNK",i.terminate();return}r=c,t="SCAN_CHUNK_DATA"}else if(t==="SCAN_CHUNK_DATA"){const a=Math.min(r,e.length),_=e.slice(0,a);e=e.slice(a),r-=a,i.enqueue(_),r===0&&(t="SCAN_CHUNK_TRAILER")}else if(t==="SCAN_CHUNK_TRAILER"){if(e.length<2)return;if(e[0]!==13||e[1]!==10)throw new Error("Invalid chunk trailer format. Expected CRLF after chunk data");e=e.slice(2),t="SCAN_CHUNK_SIZE"}}})}}const Qe=(s,e)=>({...s,websocket:{url:(t,r,n)=>`ws://playground.internal/?${new URLSearchParams({host:r,port:n}).toString()}`,subprotocol:"binary",decorator:()=>class extends et{constructor(t,r){super(t,r,{CAroot:e.CAroot,corsProxyUrl:e.corsProxyUrl})}}}});class et{constructor(e,t,{CAroot:r,corsProxyUrl:n,outputType:i="messages"}={}){this.CONNECTING=0,this.OPEN=1,this.CLOSING=2,this.CLOSED=3,this.readyState=this.CONNECTING,this.binaryType="blob",this.bufferedAmount=0,this.extensions="",this.protocol="ws",this.host="",this.port=0,this.listeners=new Map,this.clientUpstream=new TransformStream,this.clientUpstreamWriter=this.clientUpstream.writable.getWriter(),this.clientDownstream=new TransformStream,this.fetchInitiated=!1,this.bufferedBytesFromClient=new Uint8Array(0),this.url=e,this.options=t;const a=new URL(e);this.host=a.searchParams.get("host"),this.port=parseInt(a.searchParams.get("port"),10),this.binaryType="arraybuffer",this.corsProxyUrl=n,this.CAroot=r,i==="messages"&&this.clientDownstream.readable.pipeTo(new WritableStream({write:_=>{this.emit("message",{data:_})},abort:()=>{this.emit("error",new Error("ECONNREFUSED")),this.close()},close:()=>{this.close()}})).catch(()=>{}),this.readyState=this.OPEN,this.emit("open")}on(e,t){this.addEventListener(e,t)}once(e,t){const r=n=>{t(n),this.removeEventListener(e,r)};this.addEventListener(e,r)}addEventListener(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}removeListener(e,t){this.removeEventListener(e,t)}removeEventListener(e,t){const r=this.listeners.get(e);r&&r.delete(t)}emit(e,t={}){e==="message"?this.onmessage(t):e==="close"?this.onclose(t):e==="error"?this.onerror(t):e==="open"&&this.onopen(t);const r=this.listeners.get(e);if(r)for(const n of r)n(t)}onclose(e){}onerror(e){}onmessage(e){}onopen(e){}send(e){if(!(this.readyState===this.CLOSING||this.readyState===this.CLOSED)&&(this.clientUpstreamWriter.write(new Uint8Array(e)),!this.fetchInitiated))switch(this.bufferedBytesFromClient=u.concatUint8Arrays([this.bufferedBytesFromClient,new Uint8Array(e)]),rt(this.port,this.bufferedBytesFromClient)){case!1:return;case"other":this.emit("error",new Error("Unsupported protocol")),this.close();break;case"tls":this.fetchOverTLS(),this.fetchInitiated=!0;break;case"http":this.fetchOverHTTP(),this.fetchInitiated=!0;break}}async fetchOverTLS(){if(!this.CAroot)throw new Error("TLS protocol is only supported when the TCPOverFetchWebsocket is instantiated with a CAroot");const e=await pe({subject:{commonName:this.host,organizationName:this.host,countryName:"US"},issuer:this.CAroot.tbsDescription.subject},this.CAroot.keyPair),t=new Ge;this.clientUpstream.readable.pipeTo(t.clientEnd.upstream.writable).catch(()=>{}),t.clientEnd.downstream.readable.pipeTo(this.clientDownstream.writable).catch(()=>{}),await t.TLSHandshake(e.keyPair.privateKey,[e.certificate,this.CAroot.certificate]);const{request:r,expectsContinue:n}=await I.parseHttpRequest(t.serverEnd.upstream.readable,this.host,"https");if(n){const i=t.serverEnd.downstream.writable.getWriter();await i.write(new TextEncoder().encode(`HTTP/1.1 100 Continue\r
5
+ -----END PRIVATE KEY-----`}class Ye{static async generateCertificate(e,t){const n=await crypto.subtle.generateKey({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256",modulusLength:2048,publicExponent:new Uint8Array([1,0,1])},!0,["sign","verify"]),r=await this.signingRequest(e,n.publicKey),i=await this.sign(r,(t==null?void 0:t.privateKey)??n.privateKey);return{keyPair:n,certificate:i,tbsCertificate:r,tbsDescription:e}}static async sign(e,t){const n=await crypto.subtle.sign({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},t,e.buffer);return o.sequence([new Uint8Array(e.buffer),this.signatureAlgorithm("sha256WithRSAEncryption"),o.bitString(new Uint8Array(n))])}static async signingRequest(e,t){const n=[];return e.keyUsage&&n.push(this.keyUsage(e.keyUsage)),e.extKeyUsage&&n.push(this.extKeyUsage(e.extKeyUsage)),e.subjectAltNames&&n.push(this.subjectAltName(e.subjectAltNames)),e.nsCertType&&n.push(this.nsCertType(e.nsCertType)),e.basicConstraints&&n.push(this.basicConstraints(e.basicConstraints)),o.sequence([this.version(e.version),this.serialNumber(e.serialNumber),this.signatureAlgorithm(e.signatureAlgorithm),this.distinguishedName(e.issuer??e.subject),this.validity(e.validity),this.distinguishedName(e.subject),await this.subjectPublicKeyInfo(t),this.extensions(n)])}static version(e=2){return o.ASN1(160,o.integer(new Uint8Array([e])))}static serialNumber(e=crypto.getRandomValues(new Uint8Array(4))){return o.integer(e)}static signatureAlgorithm(e="sha256WithRSAEncryption"){return o.sequence([o.objectIdentifier(L(e)),o.null()])}static async subjectPublicKeyInfo(e){return new Uint8Array(await crypto.subtle.exportKey("spki",e))}static extensions(e){return o.ASN1(163,o.sequence(e))}static distinguishedName(e){const t=[];for(const[n,r]of Object.entries(e)){const i=[o.objectIdentifier(L(n))];switch(n){case"countryName":i.push(o.printableString(r));break;default:i.push(o.utf8String(r))}t.push(o.set([o.sequence(i)]))}return o.sequence(t)}static validity(e){return o.sequence([o.ASN1(E.UTCTime,new TextEncoder().encode(ae((e==null?void 0:e.notBefore)??new Date))),o.ASN1(E.UTCTime,new TextEncoder().encode(ae((e==null?void 0:e.notAfter)??Ze(new Date,10))))])}static basicConstraints({ca:e=!0,pathLenConstraint:t=void 0}){const n=[o.boolean(e)];return t!==void 0&&n.push(o.integer(new Uint8Array([t]))),o.sequence([o.objectIdentifier(L("basicConstraints")),o.octetString(o.sequence(n))])}static keyUsage(e){const t=new Uint8Array([0]);return e!=null&&e.digitalSignature&&(t[0]|=1),e!=null&&e.nonRepudiation&&(t[0]|=2),e!=null&&e.keyEncipherment&&(t[0]|=4),e!=null&&e.dataEncipherment&&(t[0]|=8),e!=null&&e.keyAgreement&&(t[0]|=16),e!=null&&e.keyCertSign&&(t[0]|=32),e!=null&&e.cRLSign&&(t[0]|=64),e!=null&&e.encipherOnly&&(t[0]|=128),e!=null&&e.decipherOnly&&(t[0]|=64),o.sequence([o.objectIdentifier(L("keyUsage")),o.boolean(!0),o.octetString(o.bitString(t))])}static extKeyUsage(e={}){return o.sequence([o.objectIdentifier(L("extKeyUsage")),o.boolean(!0),o.octetString(o.sequence(Object.entries(e).map(([t,n])=>n?o.objectIdentifier(L(t)):o.null())))])}static nsCertType(e){const t=new Uint8Array([0]);return e.client&&(t[0]|=1),e.server&&(t[0]|=2),e.email&&(t[0]|=4),e.objsign&&(t[0]|=8),e.sslCA&&(t[0]|=16),e.emailCA&&(t[0]|=32),e.objCA&&(t[0]|=64),o.sequence([o.objectIdentifier(L("nsCertType")),o.octetString(t)])}static subjectAltName(e){var i,a;const t=((i=e.dnsNames)==null?void 0:i.map(_=>{const c=o.ia5String(_);return o.contextSpecific(2,c)}))||[],n=((a=e.ipAddresses)==null?void 0:a.map(_=>{const c=o.ia5String(_);return o.contextSpecific(7,c)}))||[],r=o.octetString(o.sequence([...t,...n]));return o.sequence([o.objectIdentifier(L("subjectAltName")),o.boolean(!0),r])}}const Je={"1.2.840.113549.1.1.1":"rsaEncryption","1.2.840.113549.1.1.4":"md5WithRSAEncryption","1.2.840.113549.1.1.5":"sha1WithRSAEncryption","1.2.840.113549.1.1.7":"RSAES-OAEP","1.2.840.113549.1.1.8":"mgf1","1.2.840.113549.1.1.9":"pSpecified","1.2.840.113549.1.1.10":"RSASSA-PSS","1.2.840.113549.1.1.11":"sha256WithRSAEncryption","1.2.840.113549.1.1.12":"sha384WithRSAEncryption","1.2.840.113549.1.1.13":"sha512WithRSAEncryption","1.3.101.112":"EdDSA25519","1.2.840.10040.4.3":"dsa-with-sha1","1.3.14.3.2.7":"desCBC","1.3.14.3.2.26":"sha1","1.3.14.3.2.29":"sha1WithRSASignature","2.16.840.1.101.3.4.2.1":"sha256","2.16.840.1.101.3.4.2.2":"sha384","2.16.840.1.101.3.4.2.3":"sha512","2.16.840.1.101.3.4.2.4":"sha224","2.16.840.1.101.3.4.2.5":"sha512-224","2.16.840.1.101.3.4.2.6":"sha512-256","1.2.840.113549.2.2":"md2","1.2.840.113549.2.5":"md5","1.2.840.113549.1.7.1":"data","1.2.840.113549.1.7.2":"signedData","1.2.840.113549.1.7.3":"envelopedData","1.2.840.113549.1.7.4":"signedAndEnvelopedData","1.2.840.113549.1.7.5":"digestedData","1.2.840.113549.1.7.6":"encryptedData","1.2.840.113549.1.9.1":"emailAddress","1.2.840.113549.1.9.2":"unstructuredName","1.2.840.113549.1.9.3":"contentType","1.2.840.113549.1.9.4":"messageDigest","1.2.840.113549.1.9.5":"signingTime","1.2.840.113549.1.9.6":"counterSignature","1.2.840.113549.1.9.7":"challengePassword","1.2.840.113549.1.9.8":"unstructuredAddress","1.2.840.113549.1.9.14":"extensionRequest","1.2.840.113549.1.9.20":"friendlyName","1.2.840.113549.1.9.21":"localKeyId","1.2.840.113549.1.9.22.1":"x509Certificate","1.2.840.113549.1.12.10.1.1":"keyBag","1.2.840.113549.1.12.10.1.2":"pkcs8ShroudedKeyBag","1.2.840.113549.1.12.10.1.3":"certBag","1.2.840.113549.1.12.10.1.4":"crlBag","1.2.840.113549.1.12.10.1.5":"secretBag","1.2.840.113549.1.12.10.1.6":"safeContentsBag","1.2.840.113549.1.5.13":"pkcs5PBES2","1.2.840.113549.1.5.12":"pkcs5PBKDF2","1.2.840.113549.1.12.1.1":"pbeWithSHAAnd128BitRC4","1.2.840.113549.1.12.1.2":"pbeWithSHAAnd40BitRC4","1.2.840.113549.1.12.1.3":"pbeWithSHAAnd3-KeyTripleDES-CBC","1.2.840.113549.1.12.1.4":"pbeWithSHAAnd2-KeyTripleDES-CBC","1.2.840.113549.1.12.1.5":"pbeWithSHAAnd128BitRC2-CBC","1.2.840.113549.1.12.1.6":"pbewithSHAAnd40BitRC2-CBC","1.2.840.113549.2.7":"hmacWithSHA1","1.2.840.113549.2.8":"hmacWithSHA224","1.2.840.113549.2.9":"hmacWithSHA256","1.2.840.113549.2.10":"hmacWithSHA384","1.2.840.113549.2.11":"hmacWithSHA512","1.2.840.113549.3.7":"des-EDE3-CBC","2.16.840.1.101.3.4.1.2":"aes128-CBC","2.16.840.1.101.3.4.1.22":"aes192-CBC","2.16.840.1.101.3.4.1.42":"aes256-CBC","2.5.4.3":"commonName","2.5.4.4":"surname","2.5.4.5":"serialNumber","2.5.4.6":"countryName","2.5.4.7":"localityName","2.5.4.8":"stateOrProvinceName","2.5.4.9":"streetAddress","2.5.4.10":"organizationName","2.5.4.11":"organizationalUnitName","2.5.4.12":"title","2.5.4.13":"description","2.5.4.15":"businessCategory","2.5.4.17":"postalCode","2.5.4.42":"givenName","1.3.6.1.4.1.311.60.2.1.2":"jurisdictionOfIncorporationStateOrProvinceName","1.3.6.1.4.1.311.60.2.1.3":"jurisdictionOfIncorporationCountryName","2.16.840.1.113730.1.1":"nsCertType","2.16.840.1.113730.1.13":"nsComment","2.5.29.14":"subjectKeyIdentifier","2.5.29.15":"keyUsage","2.5.29.17":"subjectAltName","2.5.29.18":"issuerAltName","2.5.29.19":"basicConstraints","2.5.29.31":"cRLDistributionPoints","2.5.29.32":"certificatePolicies","2.5.29.35":"authorityKeyIdentifier","2.5.29.37":"extKeyUsage","1.3.6.1.4.1.11129.2.4.2":"timestampList","1.3.6.1.5.5.7.1.1":"authorityInfoAccess","1.3.6.1.5.5.7.3.1":"serverAuth","1.3.6.1.5.5.7.3.2":"clientAuth","1.3.6.1.5.5.7.3.3":"codeSigning","1.3.6.1.5.5.7.3.4":"emailProtection","1.3.6.1.5.5.7.3.8":"timeStamping"};function L(s){for(const[e,t]of Object.entries(Je))if(t===s)return e;throw new Error(`OID not found for name: ${s}`)}const ie=32,E={Boolean:1,Integer:2,BitString:3,OctetString:4,Null:5,OID:6,Utf8String:12,Sequence:16|ie,Set:17|ie,PrintableString:19,IA5String:22,UTCTime:23};class o{static length_(e){if(e<128)return new Uint8Array([e]);{let t=e;const n=[];for(;t>0;)n.unshift(t&255),t>>=8;const r=n.length,i=new Uint8Array(1+r);i[0]=128|r;for(let a=0;a<r;a++)i[a+1]=n[a];return i}}static ASN1(e,t){const n=o.length_(t.length),r=new Uint8Array(1+n.length+t.length);return r[0]=e,r.set(n,1),r.set(t,1+n.length),r}static integer(e){let t=0;for(;t<e.length-1&&e[t]===0&&e[t+1]<128;)t++;if(t>0&&(e=e.subarray(t)),e[0]>127){const n=new Uint8Array(e.length+1);n[0]=0,n.set(e,1),e=n}return o.ASN1(E.Integer,e)}static bitString(e){const t=new Uint8Array([0]),n=new Uint8Array(t.length+e.length);return n.set(t),n.set(e,t.length),o.ASN1(E.BitString,n)}static octetString(e){return o.ASN1(E.OctetString,e)}static null(){return o.ASN1(E.Null,new Uint8Array(0))}static objectIdentifier(e){const t=e.split(".").map(Number),r=[t[0]*40+t[1]];for(let i=2;i<t.length;i++){let a=t[i];const _=[];do _.unshift(a&127),a>>=7;while(a>0);for(let c=0;c<_.length-1;c++)_[c]|=128;r.push(..._)}return o.ASN1(E.OID,new Uint8Array(r))}static utf8String(e){const t=new TextEncoder().encode(e);return o.ASN1(E.Utf8String,t)}static printableString(e){const t=new TextEncoder().encode(e);return o.ASN1(E.PrintableString,t)}static sequence(e){return o.ASN1(E.Sequence,u.concatUint8Arrays(e))}static set(e){return o.ASN1(E.Set,u.concatUint8Arrays(e))}static ia5String(e){const t=new TextEncoder().encode(e);return o.ASN1(E.IA5String,t)}static contextSpecific(e,t,n=!1){const r=(n?160:128)|e;return o.ASN1(r,t)}static boolean(e){return o.ASN1(E.Boolean,new Uint8Array([e?255:0]))}}function we(s){return btoa(String.fromCodePoint(...new Uint8Array(s)))}function ye(s){var e;return((e=s.match(/.{1,64}/g))==null?void 0:e.join(`
6
+ `))||s}function ae(s){const e=s.getUTCFullYear().toString().substr(2),t=U(s.getUTCMonth()+1),n=U(s.getUTCDate()),r=U(s.getUTCHours()),i=U(s.getUTCMinutes()),a=U(s.getUTCSeconds());return`${e}${t}${n}${r}${i}${a}Z`}function U(s){return s.toString().padStart(2,"0")}function Ze(s,e){const t=new Date(s);return t.setUTCFullYear(t.getUTCFullYear()+e),t}class Xe extends TransformStream{constructor(){let e=new Uint8Array(0),t="SCAN_CHUNK_SIZE",n=0;super({transform(r,i){for(e=u.concatUint8Arrays([e,r]);e.length>0;)if(t==="SCAN_CHUNK_SIZE"){if(e.length<3)return;let a=0;for(;a<e.length;){const S=e[a];if(!(S>=48&&S<=57||S>=97&&S<=102||S>=65&&S<=70))break;a++}if(a===0)throw new Error("Invalid chunk size format");if(e.length<a+2)return;if(e[a]!==13||e[a+1]!==10)throw new Error("Invalid chunk size format. Expected CRLF after chunk size");const _=new TextDecoder().decode(e.slice(0,a)),c=parseInt(_,16);if(e=e.slice(a+2),c===0){t="SCAN_FINAL_CHUNK",i.terminate();return}n=c,t="SCAN_CHUNK_DATA"}else if(t==="SCAN_CHUNK_DATA"){const a=Math.min(n,e.length),_=e.slice(0,a);e=e.slice(a),n-=a,i.enqueue(_),n===0&&(t="SCAN_CHUNK_TRAILER")}else if(t==="SCAN_CHUNK_TRAILER"){if(e.length<2)return;if(e[0]!==13||e[1]!==10)throw new Error("Invalid chunk trailer format. Expected CRLF after chunk data");e=e.slice(2),t="SCAN_CHUNK_SIZE"}}})}}const Qe=(s,e)=>({...s,websocket:{url:(t,n,r)=>`ws://playground.internal/?${new URLSearchParams({host:n,port:r}).toString()}`,subprotocol:"binary",decorator:()=>class extends et{constructor(t,n){super(t,n,{CAroot:e.CAroot,corsProxyUrl:e.corsProxyUrl})}}}});class et{constructor(e,t,{CAroot:n,corsProxyUrl:r,outputType:i="messages"}={}){this.CONNECTING=0,this.OPEN=1,this.CLOSING=2,this.CLOSED=3,this.readyState=this.CONNECTING,this.binaryType="blob",this.bufferedAmount=0,this.extensions="",this.protocol="ws",this.host="",this.port=0,this.listeners=new Map,this.clientUpstream=new TransformStream,this.clientUpstreamWriter=this.clientUpstream.writable.getWriter(),this.clientDownstream=new TransformStream,this.fetchInitiated=!1,this.bufferedBytesFromClient=new Uint8Array(0),this.url=e,this.options=t;const a=new URL(e);this.host=a.searchParams.get("host"),this.port=parseInt(a.searchParams.get("port"),10),this.binaryType="arraybuffer",this.corsProxyUrl=r,this.CAroot=n,i==="messages"&&this.clientDownstream.readable.pipeTo(new WritableStream({write:_=>{this.emit("message",{data:_})},abort:()=>{this.emit("error",new Error("ECONNREFUSED")),this.close()},close:()=>{this.close()}})).catch(()=>{}),this.readyState=this.OPEN,this.emit("open")}on(e,t){this.addEventListener(e,t)}once(e,t){const n=r=>{t(r),this.removeEventListener(e,n)};this.addEventListener(e,n)}addEventListener(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}removeListener(e,t){this.removeEventListener(e,t)}removeEventListener(e,t){const n=this.listeners.get(e);n&&n.delete(t)}emit(e,t={}){e==="message"?this.onmessage(t):e==="close"?this.onclose(t):e==="error"?this.onerror(t):e==="open"&&this.onopen(t);const n=this.listeners.get(e);if(n)for(const r of n)r(t)}onclose(e){}onerror(e){}onmessage(e){}onopen(e){}send(e){if(!(this.readyState===this.CLOSING||this.readyState===this.CLOSED)&&(this.clientUpstreamWriter.write(new Uint8Array(e)),!this.fetchInitiated))switch(this.bufferedBytesFromClient=u.concatUint8Arrays([this.bufferedBytesFromClient,new Uint8Array(e)]),nt(this.port,this.bufferedBytesFromClient)){case!1:return;case"other":this.emit("error",new Error("Unsupported protocol")),this.close();break;case"tls":this.fetchOverTLS(),this.fetchInitiated=!0;break;case"http":this.fetchOverHTTP(),this.fetchInitiated=!0;break}}async fetchOverTLS(){if(!this.CAroot)throw new Error("TLS protocol is only supported when the TCPOverFetchWebsocket is instantiated with a CAroot");const e=await pe({subject:{commonName:this.host,organizationName:this.host,countryName:"US"},issuer:this.CAroot.tbsDescription.subject},this.CAroot.keyPair),t=new Ge;this.clientUpstream.readable.pipeTo(t.clientEnd.upstream.writable).catch(()=>{}),t.clientEnd.downstream.readable.pipeTo(this.clientDownstream.writable).catch(()=>{}),await t.TLSHandshake(e.keyPair.privateKey,[e.certificate,this.CAroot.certificate]);const{request:n,expectsContinue:r}=await I.parseHttpRequest(t.serverEnd.upstream.readable,this.host,"https");if(r){const i=t.serverEnd.downstream.writable.getWriter();await i.write(new TextEncoder().encode(`HTTP/1.1 100 Continue\r
7
7
  \r
8
- `)),i.releaseLock()}try{await I.fetchRawResponseBytes(r,this.corsProxyUrl).pipeTo(t.serverEnd.downstream.writable)}catch{}}async fetchOverHTTP(){const{request:e,expectsContinue:t}=await I.parseHttpRequest(this.clientUpstream.readable,this.host,"http");if(t){const r=this.clientDownstream.writable.getWriter();await r.write(new TextEncoder().encode(`HTTP/1.1 100 Continue\r
8
+ `)),i.releaseLock()}try{await I.fetchRawResponseBytes(n,this.corsProxyUrl).pipeTo(t.serverEnd.downstream.writable)}catch{}}async fetchOverHTTP(){const{request:e,expectsContinue:t}=await I.parseHttpRequest(this.clientUpstream.readable,this.host,"http");if(t){const n=this.clientDownstream.writable.getWriter();await n.write(new TextEncoder().encode(`HTTP/1.1 100 Continue\r
9
9
  \r
10
- `)),r.releaseLock()}try{await I.fetchRawResponseBytes(e,this.corsProxyUrl).pipeTo(this.clientDownstream.writable)}catch{}}close(){this.emit("message",{data:new Uint8Array(0)}),this.readyState=this.CLOSING,this.emit("close"),this.readyState=this.CLOSED}}const tt=["GET","POST","HEAD","PATCH","OPTIONS","DELETE","PUT","TRACE"];function rt(s,e){if(e.length<8)return!1;if(s===443&&e[0]===C.Handshake&&e[1]===3&&e[2]>=1&&e[2]<=3)return"tls";const r=new TextDecoder("latin1",{fatal:!0}).decode(e);return tt.some(i=>r.startsWith(i+" "))?"http":"other"}class I{static fetchRawResponseBytes(e,t){return new ReadableStream({async start(r){var _;let n;try{n=await $.fetchWithCorsProxy(e,void 0,t)}catch(c){r.enqueue(new TextEncoder().encode(`HTTP/1.1 400 Bad Request\r
10
+ `)),n.releaseLock()}try{await I.fetchRawResponseBytes(e,this.corsProxyUrl).pipeTo(this.clientDownstream.writable)}catch{}}close(){this.emit("message",{data:new Uint8Array(0)}),this.readyState=this.CLOSING,this.emit("close"),this.readyState=this.CLOSED}}const tt=["GET","POST","HEAD","PATCH","OPTIONS","DELETE","PUT","TRACE"];function nt(s,e){if(e.length<8)return!1;if(s===443&&e[0]===C.Handshake&&e[1]===3&&e[2]>=1&&e[2]<=3)return"tls";const n=new TextDecoder("latin1",{fatal:!0}).decode(e);return tt.some(i=>n.startsWith(i+" "))?"http":"other"}class I{static fetchRawResponseBytes(e,t){return new ReadableStream({async start(n){var _;let r;try{r=await $.fetchWithCorsProxy(e,void 0,t)}catch(c){n.enqueue(new TextEncoder().encode(`HTTP/1.1 400 Bad Request\r
11
11
  Content-Length: 0\r
12
12
  \r
13
- `)),r.error(c);return}r.enqueue(I.headersAsBytes(n));const i=(_=n.body)==null?void 0:_.getReader();if(!i){r.close();return}const a=new TextEncoder;for(;;){const{done:c,value:S}=await i.read();if(S&&(r.enqueue(a.encode(`${S.length.toString(16)}\r
14
- `)),r.enqueue(S),r.enqueue(a.encode(`\r
15
- `))),c){r.enqueue(a.encode(`0\r
13
+ `)),n.error(c);return}n.enqueue(I.headersAsBytes(r));const i=(_=r.body)==null?void 0:_.getReader();if(!i){n.close();return}const a=new TextEncoder;for(;;){const{done:c,value:S}=await i.read();if(S&&(n.enqueue(a.encode(`${S.length.toString(16)}\r
14
+ `)),n.enqueue(S),n.enqueue(a.encode(`\r
15
+ `))),c){n.enqueue(a.encode(`0\r
16
16
  \r
17
- `)),r.close();return}}}})}static headersAsBytes(e){const t=`HTTP/1.1 ${e.status} ${e.statusText}`,r={};e.headers.forEach((a,_)=>{r[_.toLowerCase()]=a}),delete r["content-length"],delete r["content-encoding"],r["transfer-encoding"]="chunked";const n=[];for(const[a,_]of Object.entries(r))n.push(`${a}: ${_}`);const i=[t,...n].join(`\r
17
+ `)),n.close();return}}}})}static headersAsBytes(e){const t=`HTTP/1.1 ${e.status} ${e.statusText}`,n={};e.headers.forEach((a,_)=>{n[_.toLowerCase()]=a}),delete n["content-length"],delete n["content-encoding"],n["transfer-encoding"]="chunked";const r=[];for(const[a,_]of Object.entries(n))r.push(`${a}: ${_}`);const i=[t,...r].join(`\r
18
18
  `)+`\r
19
19
  \r
20
- `;return new TextEncoder().encode(i)}static async parseHttpRequest(e,t,r){let n=new Uint8Array(0),i=!1,a=-1;const _=e.getReader();for(;a===-1;){const{done:k,value:R}=await _.read();if(k){i=!0;break}n=u.concatUint8Arrays([n,R]),a=nt(n,new Uint8Array([13,10,13,10]))}_.releaseLock();const c=n.slice(0,a),S=I.parseRequestHeaders(c),l=S.headers.get("Transfer-Encoding")!==null?"chunked":"content-length",h=S.headers.get("Content-Length")!==null?parseInt(S.headers.get("Content-Length"),10):void 0,A=n.slice(a+4);let H;if(S.method!=="GET"){const k=e.getReader();let R=A.length,q=A.slice(-6);const me=new TextEncoder().encode(`0\r
20
+ `;return new TextEncoder().encode(i)}static async parseHttpRequest(e,t,n){let r=new Uint8Array(0),i=!1,a=-1;const _=e.getReader();for(;a===-1;){const{done:k,value:R}=await _.read();if(k){i=!0;break}r=u.concatUint8Arrays([r,R]),a=rt(r,new Uint8Array([13,10,13,10]))}_.releaseLock();const c=r.slice(0,a),S=I.parseRequestHeaders(c),l=S.headers.get("Transfer-Encoding")!==null?"chunked":"content-length",h=S.headers.get("Content-Length")!==null?parseInt(S.headers.get("Content-Length"),10):void 0,A=r.slice(a+4);let H;if(S.method!=="GET"){const k=e.getReader();let R=A.length,q=A.slice(-6);const me=new TextEncoder().encode(`0\r
21
21
  \r
22
- `);H=new ReadableStream({async start(B){A.length>0&&B.enqueue(A);const F=l==="content-length"&&h!==void 0&&R>=h;(i||F)&&B.close()},async pull(B){const{done:F,value:D}=await k.read();if(R+=(D==null?void 0:D.length)||0,D&&(B.enqueue(D),q=u.concatUint8Arrays([q,D||new Uint8Array]).slice(-5)),F||l==="content-length"&&h!==void 0&&R>=h||l==="chunked"&&q.every((ge,Ie)=>ge===me[Ie])){B.close();return}}}),l==="chunked"&&(H=H.pipeThrough(new Xe))}const w=S.headers.get("Host")??t,m=new URL(S.path,r+"://"+w);return{request:new Request(m.toString(),{method:S.method,headers:S.headers,body:H,duplex:H?"half":void 0}),expectsContinue:S.expectsContinue}}static parseRequestHeaders(e){var c;const t=new TextDecoder().decode(e),r=t.split(`
23
- `)[0],[n,i]=r.split(" "),a=new Headers;for(const S of t.split(`\r
24
- `).slice(1)){if(S==="")break;const l=S.indexOf(":");if(l===-1)continue;const h=S.slice(0,l).trim(),A=S.slice(l+1).trimStart();h!==""&&a.set(h,A)}const _=((c=a.get("Expect"))==null?void 0:c.toLowerCase())==="100-continue";return a.delete("Expect"),{method:n,path:i,headers:a,expectsContinue:_}}}function nt(s,e){const t=s.length,r=e.length,n=t-r;for(let i=0;i<=n;i++){let a=!0;for(let _=0;_<r;_++)if(s[i+_]!==e[_]){a=!1;break}if(a)return i}return-1}async function st(s=d.LatestSupportedPHPVersion){switch(s){case"8.5":return(await import("@php-wasm/web-8-5")).getIntlExtensionPath();case"8.4":return(await import("@php-wasm/web-8-4")).getIntlExtensionPath();case"8.3":return(await import("@php-wasm/web-8-3")).getIntlExtensionPath();case"8.2":return(await import("@php-wasm/web-8-2")).getIntlExtensionPath();case"8.1":return(await import("@php-wasm/web-8-1")).getIntlExtensionPath();case"8.0":return(await import("@php-wasm/web-8-0")).getIntlExtensionPath();case"7.4":return(await import("@php-wasm/web-7-4")).getIntlExtensionPath()}throw new Error(`Unsupported PHP version ${s}`)}async function it(s,e,t,r=[]){if(!r.length)return t;const n=await Promise.all(r.map(i=>at(s,e,i)));return d.withResolvedPHPExtensions(t,n)}async function at(s,e,t){if(typeof t=="object"&&"source"in t)return await d.resolvePHPExtension({...t,phpVersion:s,asyncMode:e});const r=typeof t=="string"?t:t.name;if(r!=="intl")throw new Error(`Unknown bundled PHP web extension: ${String(r)}.`);const n=Be.createMemoizedFetch(fetch),i=await st(s),a=(await import("../intl/shared/icu.dat")).default,[_,c]=await Promise.all([i,a].map(async S=>{const l=await n(S);if(!l.ok)throw new Error(`Failed to fetch bundled PHP web extension asset: ${l.url||S} (${l.status} ${l.statusText}).`);return await l.arrayBuffer()}));return await d.resolvePHPExtension({source:{format:"so",name:"intl",bytes:new Uint8Array(_)},phpVersion:s,asyncMode:e,env:{ICU_DATA:"/internal/shared"},extraFiles:{targetPath:"/internal/shared",files:{"icudt74l.dat":new Uint8Array(c)}}})}const _t=()=>({websocket:{decorator:s=>class extends s{constructor(){try{super()}catch{}}send(){return null}}}});async function ot(s,e={}){var c;"setImmediate"in globalThis||(globalThis.setImmediate=S=>setTimeout(S,0));const t=await Ue.jspi()?"jspi":"asyncify";let r={..._t(),...e.emscriptenOptions||{},phpWasmAsyncMode:t};e.tcpOverFetch&&(r=Qe(r,e.tcpOverFetch));const n=d.isLegacyPHPVersion(s),i=[...e.extensions??[]];if(e.withIntl&&!ct(i,"intl")&&i.push("intl"),n){const S=await r,l=S.preRun||[];r={...S,preRun:[...l,d.createLegacyPhpIniPreRunStep()]}}if(n&&i.length)throw new Error(`Extensions are not available for legacy PHP ${s}.`);n||(r=it(s,t,await r,i));const[a,_]=await Promise.all([ce(s),r]);return(c=e.onPhpLoaderModuleLoaded)==null||c.call(e,a),await d.loadPHPRuntime(a,_)}function ct(s,e){return s.some(t=>typeof t=="string"?t===e:!("source"in t)&&t.name===e)}function St(s,e){window.addEventListener("message",t=>{t.source===s.contentWindow&&(e&&t.origin!==e||typeof t.data!="object"||t.data.type!=="relay"||window.parent.postMessage(t.data,"*"))}),window.addEventListener("message",t=>{var r;t.source===window.parent&&(typeof t.data!="object"||t.data.type!=="relay"||(r=s==null?void 0:s.contentWindow)==null||r.postMessage(t.data))})}async function lt(s){const e=new Worker(s,{type:"module"});return new Promise((t,r)=>{e.onerror=i=>{const a=new Error(`WebWorker failed to load at ${s}. ${i.message?`Original error: ${i.message}`:""}`);a.filename=i.filename,r(a)};function n(i){i.data==="worker-script-started"&&(t(e),e.removeEventListener("message",n))}e.addEventListener("message",n)})}const Ct=1e3;function ht(s,e={initialSync:{}}){return e={...e,initialSync:{...e.initialSync,direction:e.initialSync.direction??"opfs-to-memfs"}},async function(t,r,n){var a;e.initialSync.direction==="opfs-to-memfs"?(d.FSHelpers.fileExists(r,n)&&d.FSHelpers.rmdir(r,n),d.FSHelpers.mkdir(r,n),await ut(r,s,n)):await Le(r,s,n,e.initialSync.onProgress);const i=Ht(t,s,n);return(a=e.onMount)==null||a.call(e,i),i.unmount}}async function ut(s,e,t){d.FSHelpers.mkdir(s,t);const r=new u.Semaphore({concurrency:40}),n=[],i=[[e,t]];for(;i.length>0;){const[a,_]=i.pop();for await(const c of a.values()){const S=r.run(async()=>{const l=u.joinPaths(_,c.name);if(c.kind==="directory"){try{s.mkdir(l)}catch(h){if((h==null?void 0:h.errno)!==20)throw v.logger.error(h),h}i.push([c,l])}else if(c.kind==="file"){const h=await c.getFile(),A=new Uint8Array(await h.arrayBuffer());s.createDataFile(_,c.name,A,!0,!0,!0)}n.splice(n.indexOf(S),1)});n.push(S)}for(;i.length===0&&n.length>0;)await Promise.any(n)}}async function Le(s,e,t,r){s.mkdirTree(t);const n=[];async function i(l,h){await Promise.all(s.readdir(l).filter(A=>A!=="."&&A!=="..").map(async A=>{const H=u.joinPaths(l,A);if(!At(s,H)){n.push([h,H,A]);return}const w=await h.getDirectoryHandle(A,{create:!0});return await i(H,w)}))}await i(t,e);let a=0;const _=r&&Et(r,100),c=100,S=new Set;try{for(const[l,h,A]of n){const H=G(l,A,s,h).then(()=>{a++,S.delete(H),_==null||_({files:a,total:n.length})});S.add(H),S.size>=c&&(await Promise.race(S),_==null||_({files:a,total:n.length}))}}finally{await Promise.allSettled(S)}}function At(s,e){return s.isDir(s.lookupPath(e,{follow:!0}).node.mode)}async function G(s,e,t,r){let n;try{n=t.readFile(r,{encoding:"binary"})}catch{return}const i=await s.getFileHandle(e,{create:!0}),a=i.createWritable!==void 0?await i.createWritable():await i.createSyncAccessHandle();try{await a.truncate(0),await a.write(n)}finally{await a.close()}}function Ht(s,e,t,r={}){const n=[],i=Z.journalFSEvents(s,t,H=>{n.push(H)}),a=new dt(s,e,t);let _;function c(){return _===void 0&&(_=h().finally(()=>{_=void 0})),_}async function S(){try{await c()}finally{i(),s.removeEventListener("request.end",l),s.removeEventListener("filesystem.write",l)}}function l(){c().catch(H=>{v.logger.error(H)})}async function h(){const H=r.maxFlushPasses??Ct;for(let w=0;n.length>0;w++){if(w>=H){const m=n.length,M=m===1?`${m} journal entry remains`:`${m} journal entries remain`;throw new Error(`OPFS flush for "${t}" did not settle after ${H} journal batches; ${M}. This can happen when filesystem writes are continuously enqueued while flushing.`)}await A()}}async function A(){if(n.length===0)return;const H=await s.semaphore.acquire(),w=[...n];n.splice(0,w.length);const m=Z.normalizeFilesystemOperations(w);try{for(const M of m)await a.processEntry(M)}finally{H()}}return s.addEventListener("request.end",l),s.addEventListener("filesystem.write",l),{flush:c,unmount:S}}class dt{constructor(e,t,r){this.php=e,this.opfs=t,this.memfsRoot=_e(r)}toOpfsPath(e){return _e(e.substring(this.memfsRoot.length))}async processEntry(e){if(!e.path.startsWith(this.memfsRoot)||e.path===this.memfsRoot)return;const t=this.toOpfsPath(e.path),r=await oe(this.opfs,t),n=ft(t);if(n)try{if(e.operation==="DELETE")try{await r.removeEntry(n,{recursive:!0})}catch{}else if(e.operation==="CREATE")e.nodeType==="directory"?await r.getDirectoryHandle(n,{create:!0}):await r.getFileHandle(n,{create:!0});else if(e.operation==="WRITE")await G(r,n,this.php[d.__private__dont__use].FS,e.path);else if(e.operation==="RENAME"&&e.toPath.startsWith(this.memfsRoot)){const i=this.toOpfsPath(e.toPath),a=await oe(this.opfs,i);if(e.nodeType==="directory"){const _=await a.getDirectoryHandle(n,{create:!0});await Le(this.php[d.__private__dont__use].FS,_,e.toPath),await r.removeEntry(n,{recursive:!0})}else{try{await r.removeEntry(n)}catch{}await G(a,u.basename(i),this.php[d.__private__dont__use].FS,e.toPath)}}}catch(i){throw v.logger.log({entry:e,name:n}),v.logger.error(i),i}}}function _e(s){return s.replace(/\/$/,"").replace(/\/\/+/g,"/")}function ft(s){return s.substring(s.lastIndexOf("/")+1)}async function oe(s,e){const t=e.replace(/^\/+|\/+$/g,"").replace(/\/+/,"/");if(!t)return s;const r=t.split("/");let n=s;for(let i=0;i<r.length-1;i++){const a=r[i];n=await n.getDirectoryHandle(a,{create:!0})}return n}function Et(s,e){let t=0,r,n;return function(...a){n=a;const _=Date.now()-t;if(r===void 0){const c=Math.max(0,e-_);r=setTimeout(()=>{r=void 0,t=Date.now(),s(...n)},c)}}}Object.defineProperty(exports,"consumeAPI",{enumerable:!0,get:()=>d.consumeAPI});Object.defineProperty(exports,"exposeAPI",{enumerable:!0,get:()=>d.exposeAPI});Object.defineProperty(exports,"FirewallInterferenceError",{enumerable:!0,get:()=>$.FirewallInterferenceError});Object.defineProperty(exports,"fetchWithCorsProxy",{enumerable:!0,get:()=>$.fetchWithCorsProxy});exports.certificateToPEM=Ve;exports.createDirectoryHandleMountHandler=ht;exports.generateCertificate=pe;exports.getPHPLoaderModule=ce;exports.loadWebRuntime=ot;exports.privateKeyToPEM=ze;exports.setupPostMessageRelay=St;exports.spawnPHPWorkerThread=lt;
22
+ `);H=new ReadableStream({async start(B){A.length>0&&B.enqueue(A);const F=l==="content-length"&&h!==void 0&&R>=h;(i||F)&&B.close()},async pull(B){const{done:F,value:D}=await k.read();if(R+=(D==null?void 0:D.length)||0,D&&(B.enqueue(D),q=u.concatUint8Arrays([q,D||new Uint8Array]).slice(-5)),F||l==="content-length"&&h!==void 0&&R>=h||l==="chunked"&&q.every((ge,Ie)=>ge===me[Ie])){B.close();return}}}),l==="chunked"&&(H=H.pipeThrough(new Xe))}const w=S.headers.get("Host")??t,m=new URL(S.path,n+"://"+w);return{request:new Request(m.toString(),{method:S.method,headers:S.headers,body:H,duplex:H?"half":void 0}),expectsContinue:S.expectsContinue}}static parseRequestHeaders(e){var c;const t=new TextDecoder().decode(e),n=t.split(`
23
+ `)[0],[r,i]=n.split(" "),a=new Headers;for(const S of t.split(`\r
24
+ `).slice(1)){if(S==="")break;const l=S.indexOf(":");if(l===-1)continue;const h=S.slice(0,l).trim(),A=S.slice(l+1).trimStart();h!==""&&a.set(h,A)}const _=((c=a.get("Expect"))==null?void 0:c.toLowerCase())==="100-continue";return a.delete("Expect"),{method:r,path:i,headers:a,expectsContinue:_}}}function rt(s,e){const t=s.length,n=e.length,r=t-n;for(let i=0;i<=r;i++){let a=!0;for(let _=0;_<n;_++)if(s[i+_]!==e[_]){a=!1;break}if(a)return i}return-1}async function st(s=d.LatestSupportedPHPVersion){switch(s){case"8.5":return(await import("@php-wasm/web-8-5")).getIntlExtensionPath();case"8.4":return(await import("@php-wasm/web-8-4")).getIntlExtensionPath();case"8.3":return(await import("@php-wasm/web-8-3")).getIntlExtensionPath();case"8.2":return(await import("@php-wasm/web-8-2")).getIntlExtensionPath();case"8.1":return(await import("@php-wasm/web-8-1")).getIntlExtensionPath();case"8.0":return(await import("@php-wasm/web-8-0")).getIntlExtensionPath();case"7.4":return(await import("@php-wasm/web-7-4")).getIntlExtensionPath()}throw new Error(`Unsupported PHP version ${s}`)}async function it(s,e,t,n=[]){if(!n.length)return t;const r=await Promise.all(n.map(i=>at(s,e,i)));return d.withResolvedPHPExtensions(t,r)}async function at(s,e,t){if(typeof t=="object"&&"source"in t){if(e==="asyncify")throw new Error("External PHP extensions require JSPI. Asyncify is only supported for PHP.wasm bundled extensions.");return await d.resolvePHPExtension({...t,phpVersion:s})}const n=typeof t=="string"?t:t.name;if(n!=="intl")throw new Error(`Unknown bundled PHP web extension: ${String(n)}.`);const r=Be.createMemoizedFetch(fetch),i=await st(s),a=(await import("../intl/shared/icu.dat")).default,[_,c]=await Promise.all([i,a].map(async S=>{const l=await r(S);if(!l.ok)throw new Error(`Failed to fetch bundled PHP web extension asset: ${l.url||S} (${l.status} ${l.statusText}).`);return await l.arrayBuffer()}));return await d.resolvePHPExtension({source:{format:"so",name:"intl",bytes:new Uint8Array(_)},phpVersion:s,env:{ICU_DATA:"/internal/shared"},extraFiles:{targetPath:"/internal/shared",files:{"icudt74l.dat":new Uint8Array(c)}}})}const _t=()=>({websocket:{decorator:s=>class extends s{constructor(){try{super()}catch{}}send(){return null}}}});async function ot(s,e={}){var c;"setImmediate"in globalThis||(globalThis.setImmediate=S=>setTimeout(S,0));const t=await Ue.jspi()?"jspi":"asyncify";let n={..._t(),...e.emscriptenOptions||{},phpWasmAsyncMode:t};e.tcpOverFetch&&(n=Qe(n,e.tcpOverFetch));const r=d.isLegacyPHPVersion(s),i=[...e.extensions??[]];if(e.withIntl&&!ct(i,"intl")&&i.push("intl"),r){const S=await n,l=S.preRun||[];n={...S,preRun:[...l,d.createLegacyPhpIniPreRunStep()]}}if(r&&i.length)throw new Error(`Extensions are not available for legacy PHP ${s}.`);r||(n=it(s,t,await n,i));const[a,_]=await Promise.all([ce(s),n]);return(c=e.onPhpLoaderModuleLoaded)==null||c.call(e,a),await d.loadPHPRuntime(a,_)}function ct(s,e){return s.some(t=>typeof t=="string"?t===e:!("source"in t)&&t.name===e)}function St(s,e){window.addEventListener("message",t=>{t.source===s.contentWindow&&(e&&t.origin!==e||typeof t.data!="object"||t.data.type!=="relay"||window.parent.postMessage(t.data,"*"))}),window.addEventListener("message",t=>{var n;t.source===window.parent&&(typeof t.data!="object"||t.data.type!=="relay"||(n=s==null?void 0:s.contentWindow)==null||n.postMessage(t.data))})}async function lt(s){const e=new Worker(s,{type:"module"});return new Promise((t,n)=>{e.onerror=i=>{const a=new Error(`WebWorker failed to load at ${s}. ${i.message?`Original error: ${i.message}`:""}`);a.filename=i.filename,n(a)};function r(i){i.data==="worker-script-started"&&(t(e),e.removeEventListener("message",r))}e.addEventListener("message",r)})}const Ct=1e3;function ht(s,e={initialSync:{}}){return e={...e,initialSync:{...e.initialSync,direction:e.initialSync.direction??"opfs-to-memfs"}},async function(t,n,r){var a;e.initialSync.direction==="opfs-to-memfs"?(d.FSHelpers.fileExists(n,r)&&d.FSHelpers.rmdir(n,r),d.FSHelpers.mkdir(n,r),await ut(n,s,r)):await Le(n,s,r,e.initialSync.onProgress);const i=Ht(t,s,r);return(a=e.onMount)==null||a.call(e,i),i.unmount}}async function ut(s,e,t){d.FSHelpers.mkdir(s,t);const n=new u.Semaphore({concurrency:40}),r=[],i=[[e,t]];for(;i.length>0;){const[a,_]=i.pop();for await(const c of a.values()){const S=n.run(async()=>{const l=u.joinPaths(_,c.name);if(c.kind==="directory"){try{s.mkdir(l)}catch(h){if((h==null?void 0:h.errno)!==20)throw v.logger.error(h),h}i.push([c,l])}else if(c.kind==="file"){const h=await c.getFile(),A=new Uint8Array(await h.arrayBuffer());s.createDataFile(_,c.name,A,!0,!0,!0)}r.splice(r.indexOf(S),1)});r.push(S)}for(;i.length===0&&r.length>0;)await Promise.any(r)}}async function Le(s,e,t,n){s.mkdirTree(t);const r=[];async function i(l,h){await Promise.all(s.readdir(l).filter(A=>A!=="."&&A!=="..").map(async A=>{const H=u.joinPaths(l,A);if(!At(s,H)){r.push([h,H,A]);return}const w=await h.getDirectoryHandle(A,{create:!0});return await i(H,w)}))}await i(t,e);let a=0;const _=n&&Et(n,100),c=100,S=new Set;try{for(const[l,h,A]of r){const H=G(l,A,s,h).then(()=>{a++,S.delete(H),_==null||_({files:a,total:r.length})});S.add(H),S.size>=c&&(await Promise.race(S),_==null||_({files:a,total:r.length}))}}finally{await Promise.allSettled(S)}}function At(s,e){return s.isDir(s.lookupPath(e,{follow:!0}).node.mode)}async function G(s,e,t,n){let r;try{r=t.readFile(n,{encoding:"binary"})}catch{return}const i=await s.getFileHandle(e,{create:!0}),a=i.createWritable!==void 0?await i.createWritable():await i.createSyncAccessHandle();try{await a.truncate(0),await a.write(r)}finally{await a.close()}}function Ht(s,e,t,n={}){const r=[],i=J.journalFSEvents(s,t,H=>{r.push(H)}),a=new dt(s,e,t);let _;function c(){return _===void 0&&(_=h().finally(()=>{_=void 0})),_}async function S(){try{await c()}finally{i(),s.removeEventListener("request.end",l),s.removeEventListener("filesystem.write",l)}}function l(){c().catch(H=>{v.logger.error(H)})}async function h(){const H=n.maxFlushPasses??Ct;for(let w=0;r.length>0;w++){if(w>=H){const m=r.length,M=m===1?`${m} journal entry remains`:`${m} journal entries remain`;throw new Error(`OPFS flush for "${t}" did not settle after ${H} journal batches; ${M}. This can happen when filesystem writes are continuously enqueued while flushing.`)}await A()}}async function A(){if(r.length===0)return;const H=await s.semaphore.acquire(),w=[...r];r.splice(0,w.length);const m=J.normalizeFilesystemOperations(w);try{for(const M of m)await a.processEntry(M)}finally{H()}}return s.addEventListener("request.end",l),s.addEventListener("filesystem.write",l),{flush:c,unmount:S}}class dt{constructor(e,t,n){this.php=e,this.opfs=t,this.memfsRoot=_e(n)}toOpfsPath(e){return _e(e.substring(this.memfsRoot.length))}async processEntry(e){if(!e.path.startsWith(this.memfsRoot)||e.path===this.memfsRoot)return;const t=this.toOpfsPath(e.path),n=await oe(this.opfs,t),r=ft(t);if(r)try{if(e.operation==="DELETE")try{await n.removeEntry(r,{recursive:!0})}catch{}else if(e.operation==="CREATE")e.nodeType==="directory"?await n.getDirectoryHandle(r,{create:!0}):await n.getFileHandle(r,{create:!0});else if(e.operation==="WRITE")await G(n,r,this.php[d.__private__dont__use].FS,e.path);else if(e.operation==="RENAME"&&e.toPath.startsWith(this.memfsRoot)){const i=this.toOpfsPath(e.toPath),a=await oe(this.opfs,i);if(e.nodeType==="directory"){const _=await a.getDirectoryHandle(r,{create:!0});await Le(this.php[d.__private__dont__use].FS,_,e.toPath),await n.removeEntry(r,{recursive:!0})}else{try{await n.removeEntry(r)}catch{}await G(a,u.basename(i),this.php[d.__private__dont__use].FS,e.toPath)}}}catch(i){throw v.logger.log({entry:e,name:r}),v.logger.error(i),i}}}function _e(s){return s.replace(/\/$/,"").replace(/\/\/+/g,"/")}function ft(s){return s.substring(s.lastIndexOf("/")+1)}async function oe(s,e){const t=e.replace(/^\/+|\/+$/g,"").replace(/\/+/,"/");if(!t)return s;const n=t.split("/");let r=s;for(let i=0;i<n.length-1;i++){const a=n[i];r=await r.getDirectoryHandle(a,{create:!0})}return r}function Et(s,e){let t=0,n,r;return function(...a){r=a;const _=Date.now()-t;if(n===void 0){const c=Math.max(0,e-_);n=setTimeout(()=>{n=void 0,t=Date.now(),s(...r)},c)}}}Object.defineProperty(exports,"consumeAPI",{enumerable:!0,get:()=>d.consumeAPI});Object.defineProperty(exports,"exposeAPI",{enumerable:!0,get:()=>d.exposeAPI});Object.defineProperty(exports,"FirewallInterferenceError",{enumerable:!0,get:()=>$.FirewallInterferenceError});Object.defineProperty(exports,"fetchWithCorsProxy",{enumerable:!0,get:()=>$.fetchWithCorsProxy});exports.certificateToPEM=Ve;exports.createDirectoryHandleMountHandler=ht;exports.generateCertificate=pe;exports.getPHPLoaderModule=ce;exports.loadWebRuntime=ot;exports.privateKeyToPEM=ze;exports.setupPostMessageRelay=St;exports.spawnPHPWorkerThread=lt;
25
25
  //# sourceMappingURL=index.cjs.map