diff --git a/docs/consumers.md b/docs/consumers.md index c370444..e4c554c 100644 --- a/docs/consumers.md +++ b/docs/consumers.md @@ -105,7 +105,9 @@ honor it. webcrypto stays measurable indefinitely either way. Node is **not a consumer requirement.** Deno functionally substitutes across the whole consumer capability surface — verified empirically (2026-08-08, -Deno 2.9.5/linux-arm64, `tools/probes/webrtc-deno/`): +Deno 2.9.5/linux-arm64, via the C0 capability probe; served and retired +2026-08-14, history: `git log -- tools/probes/webrtc-deno` — the living +WebRTC coverage is `just test-webrtc`, node-datachannel under Deno): | Capability | Deno path | Status | |---|---|---| diff --git a/ports/webrtc/src/webrtc.ts b/ports/webrtc/src/webrtc.ts index 6e799c2..efa5258 100644 --- a/ports/webrtc/src/webrtc.ts +++ b/ports/webrtc/src/webrtc.ts @@ -1,8 +1,9 @@ // Host-module port of `polymorph:webrtc-datachannels/connections@0.1.0` to // the embedder conventions (contracts/embedder-api.md), backed by the -// Deno-verified WebRTC path (tools/probes/webrtc-deno/probe.mjs proved both -// node-datachannel's Node-API addon and pure-TS werift pass full -// data-channel loopbacks under this exact Deno). +// Deno-verified WebRTC path (the retired C0 probe — see docs/consumers.md +// "Deno substitutes for Node" — proved both node-datachannel's Node-API +// addon and pure-TS werift pass full data-channel loopbacks under this +// exact Deno). // // Ported from the browser-first reference // (`polymorph/polymorph-webrtc-datachannels/jco-impl/webrtc.js`, read-only diff --git a/ports/webrtc/webrtc.test.ts b/ports/webrtc/webrtc.test.ts index 570a731..8dcd626 100644 --- a/ports/webrtc/webrtc.test.ts +++ b/ports/webrtc/webrtc.test.ts @@ -1,8 +1,9 @@ // In-process loopback tests for the `ports/webrtc` host module: two // instantiations of the port's `PeerConnection`/`DataChannel` classes wired // directly to each other (no signaling server), following the -// trickle-ICE-buffering discipline proven by -// `tools/probes/webrtc-deno/probe.mjs`. +// trickle-ICE-buffering discipline proven by the C0 capability probe +// (`tools/probes/webrtc-deno/`, retired 2026-08-14 — its questions are +// answered in docs/consumers.md; source via git history). // // Sanitizer note: `node-datachannel` keeps background native threads alive // across the whole process (proven by the probe, which calls `Deno.exit` @@ -31,7 +32,7 @@ const NO_SANITIZE = { sanitizeResources: false, sanitizeOps: false }; /** * Wire two freshly constructed `PeerConnection`s through a full offer/answer * + trickle-ICE exchange, in-process (no network signaling server) — - * ported wiring discipline from tools/probes/webrtc-deno/probe.mjs:28-66 + * ported wiring discipline from the retired probe's loopback * (buffer candidates until the peer has its remote description). */ async function connectPair(): Promise<{ a: PeerConnection; b: PeerConnection }> { diff --git a/tools/probes/webrtc-deno/deno.json b/tools/probes/webrtc-deno/deno.json deleted file mode 100644 index 3cffbb5..0000000 --- a/tools/probes/webrtc-deno/deno.json +++ /dev/null @@ -1 +0,0 @@ -{"nodeModulesDir":"auto"} diff --git a/tools/probes/webrtc-deno/deno.lock b/tools/probes/webrtc-deno/deno.lock deleted file mode 100644 index 4e3df07..0000000 --- a/tools/probes/webrtc-deno/deno.lock +++ /dev/null @@ -1,581 +0,0 @@ -{ - "version": "5", - "specifiers": { - "npm:node-datachannel@0.32.3": "0.32.3", - "npm:werift@0.22.2": "0.22.2" - }, - "npm": { - "@fidm/asn1@1.0.4": { - "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==" - }, - "@fidm/x509@1.2.1": { - "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", - "dependencies": [ - "@fidm/asn1", - "tweetnacl" - ] - }, - "@leichtgewicht/ip-codec@2.0.5": { - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "@minhducsun2002/leb128@1.0.0": { - "integrity": "sha512-eFrYUPDVHeuwWHluTG1kwNQUEUcFjVKYwPkU8z9DR1JH3AW7JtJsG9cRVGmwz809kKtGfwGJj58juCZxEvnI/g==" - }, - "@noble/curves@1.9.7": { - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "dependencies": [ - "@noble/hashes" - ] - }, - "@noble/hashes@1.8.0": { - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" - }, - "@peculiar/asn1-cms@2.8.0": { - "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "@peculiar/asn1-x509-attr", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-csr@2.8.0": { - "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-ecc@2.8.0": { - "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-pfx@2.8.0": { - "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", - "dependencies": [ - "@peculiar/asn1-cms", - "@peculiar/asn1-pkcs8", - "@peculiar/asn1-rsa", - "@peculiar/asn1-schema", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-pkcs8@2.8.0": { - "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-pkcs9@2.8.0": { - "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", - "dependencies": [ - "@peculiar/asn1-cms", - "@peculiar/asn1-pfx", - "@peculiar/asn1-pkcs8", - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "@peculiar/asn1-x509-attr", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-rsa@2.8.0": { - "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-schema@2.8.0": { - "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", - "dependencies": [ - "@peculiar/utils", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-x509-attr@2.8.0": { - "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/asn1-x509@2.8.0": { - "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", - "dependencies": [ - "@peculiar/asn1-schema", - "@peculiar/utils", - "asn1js", - "tslib@2.8.1" - ] - }, - "@peculiar/utils@2.0.3": { - "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "@peculiar/x509@1.14.3": { - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", - "dependencies": [ - "@peculiar/asn1-cms", - "@peculiar/asn1-csr", - "@peculiar/asn1-ecc", - "@peculiar/asn1-pkcs9", - "@peculiar/asn1-rsa", - "@peculiar/asn1-schema", - "@peculiar/asn1-x509", - "pvtsutils", - "reflect-metadata", - "tslib@2.8.1", - "tsyringe" - ] - }, - "@shinyoshiaki/binary-data@0.6.1": { - "integrity": "sha512-7HDb/fQAop2bCmvDIzU5+69i+UJaFgIVp99h1VzK1mpg1JwSODOkjbqD7ilTYnqlnadF8C4XjpwpepxDsGY6+w==", - "dependencies": [ - "generate-function", - "is-plain-object" - ] - }, - "@shinyoshiaki/jspack@0.0.6": { - "integrity": "sha512-SdsNhLjQh4onBlyPrn4ia1Pdx5bXT88G/LIEpOYAjx2u4xeY/m/HB5yHqlkJB1uQR3Zw4R3hBWLj46STRAN0rg==" - }, - "@types/dom-mediacapture-transform@0.1.12": { - "integrity": "sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==", - "dependencies": [ - "@types/dom-webcodecs" - ] - }, - "@types/dom-webcodecs@0.1.13": { - "integrity": "sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==" - }, - "aes-js@3.1.2": { - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "asn1js@3.0.10": { - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", - "dependencies": [ - "pvtsutils", - "pvutils", - "tslib@2.8.1" - ] - }, - "base64-js@1.5.1": { - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "big-integer@1.6.52": { - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==" - }, - "bl@4.1.0": { - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": [ - "buffer@5.7.1", - "inherits", - "readable-stream" - ] - }, - "buffer-crc32@1.0.0": { - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" - }, - "buffer@5.7.1": { - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dependencies": [ - "base64-js", - "ieee754" - ] - }, - "buffer@6.0.3": { - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dependencies": [ - "base64-js", - "ieee754" - ] - }, - "chownr@1.1.4": { - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "date-fns@4.4.0": { - "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==" - }, - "debug@4.4.0": { - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": [ - "ms" - ] - }, - "decompress-response@6.0.0": { - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": [ - "mimic-response" - ] - }, - "deep-extend@0.6.0": { - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "detect-libc@2.1.2": { - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" - }, - "dns-packet@5.6.1": { - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": [ - "@leichtgewicht/ip-codec" - ] - }, - "end-of-stream@1.4.5": { - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dependencies": [ - "once" - ] - }, - "expand-template@2.0.3": { - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "fs-constants@1.0.0": { - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "generate-function@2.3.1": { - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dependencies": [ - "is-property" - ] - }, - "github-from-package@0.0.0": { - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "ieee754@1.2.1": { - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini@1.3.8": { - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "int64-buffer@1.1.0": { - "integrity": "sha512-94smTCQOvigN4d/2R/YDjz8YVG0Sufvv2aAh8P5m42gwhCsDAJqnbNOrxJsrADuAFAA69Q/ptGzxvNcNuIJcvw==" - }, - "ip@2.0.1": { - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" - }, - "is-plain-object@2.0.4": { - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": [ - "isobject" - ] - }, - "is-property@1.0.2": { - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" - }, - "isobject@3.0.1": { - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" - }, - "lodash@4.18.1": { - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" - }, - "mediabunny@1.52.3": { - "integrity": "sha512-rMGwH5fykDCSA55LG9aWkE433wwHrycq3J5mRf+djBnHBZzmJGvIwg6Qfcfr4rRkzkmrdmewxQozLkOM1H1C6Q==", - "dependencies": [ - "@types/dom-mediacapture-transform", - "@types/dom-webcodecs" - ] - }, - "mimic-response@3.1.0": { - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "minimist@1.2.8": { - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp-classic@0.5.3": { - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "mp4box@0.5.4": { - "integrity": "sha512-GcCH0fySxBurJtvr0dfhz0IxHZjc1RP+F+I8xw+LIwkU1a+7HJx8NCDiww1I5u4Hz6g4eR1JlGADEGJ9r4lSfA==" - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "multicast-dns@7.2.5": { - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": [ - "dns-packet", - "thunky" - ], - "bin": true - }, - "nano-time@1.0.0": { - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "dependencies": [ - "big-integer" - ] - }, - "napi-build-utils@2.0.0": { - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" - }, - "node-abi@3.94.0": { - "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", - "dependencies": [ - "semver" - ] - }, - "node-datachannel@0.32.3": { - "integrity": "sha512-Aok1ZhLsll472lRefgWYuWJ0070jh0ecHravTdRyZEmoESumebMEQV8Y+poBwSW2ZbEwAokAOGsK5Cu8pDDT2g==", - "dependencies": [ - "prebuild-install" - ], - "scripts": true - }, - "once@1.4.0": { - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": [ - "wrappy" - ] - }, - "p-cancelable@2.1.1": { - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "prebuild-install@7.1.3": { - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dependencies": [ - "detect-libc", - "expand-template", - "github-from-package", - "minimist", - "mkdirp-classic", - "napi-build-utils", - "node-abi", - "pump", - "rc", - "simple-get", - "tar-fs", - "tunnel-agent" - ], - "deprecated": true, - "bin": true - }, - "pump@3.0.4": { - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dependencies": [ - "end-of-stream", - "once" - ] - }, - "pvtsutils@1.3.6": { - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dependencies": [ - "tslib@2.8.1" - ] - }, - "pvutils@1.2.0": { - "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==" - }, - "rc@1.2.8": { - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": [ - "deep-extend", - "ini", - "minimist", - "strip-json-comments" - ], - "bin": true - }, - "readable-stream@3.6.2": { - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": [ - "inherits", - "string_decoder", - "util-deprecate" - ] - }, - "reflect-metadata@0.2.2": { - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" - }, - "rx.mini@1.4.0": { - "integrity": "sha512-8w5cSc1mwNja7fl465DXOkVvIOkpvh2GW4jo31nAIvX4WTXCsRnKJGUfiDBzWtYRInEcHAUYIZfzusjIrea8gA==" - }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "semver@7.8.5": { - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "bin": true - }, - "simple-concat@1.0.1": { - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get@4.0.1": { - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dependencies": [ - "decompress-response", - "once", - "simple-concat" - ] - }, - "string_decoder@1.3.0": { - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": [ - "safe-buffer" - ] - }, - "strip-json-comments@2.0.1": { - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - }, - "tar-fs@2.1.5": { - "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", - "dependencies": [ - "chownr", - "mkdirp-classic", - "pump", - "tar-stream" - ] - }, - "tar-stream@2.2.0": { - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": [ - "bl", - "end-of-stream", - "fs-constants", - "inherits", - "readable-stream" - ] - }, - "thunky@1.1.0": { - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "tslib@1.14.1": { - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tslib@2.8.1": { - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "tsyringe@4.10.0": { - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "dependencies": [ - "tslib@1.14.1" - ] - }, - "tunnel-agent@0.6.0": { - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": [ - "safe-buffer" - ] - }, - "turbo-crc32@1.0.1": { - "integrity": "sha512-8yyRd1ZdNp+AQLGqi3lTaA2k81JjlIZOyFQEsi7GQWBgirnQOxjqVtDEbYHM2Z4yFdJ5AQw0fxBLLnDCl6RXoQ==" - }, - "tweetnacl@1.0.3": { - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "util-deprecate@1.0.2": { - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid@11.1.1": { - "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", - "bin": true - }, - "werift-common@0.0.3": { - "integrity": "sha512-ma3E4BqKTyZVLhrdfTVs2T1tg9seeUtKMRn5e64LwgrogWa62+3LAUoLBUSl1yPWhgSkXId7GmcHuWDen9IJeQ==", - "dependencies": [ - "@shinyoshiaki/jspack", - "debug" - ] - }, - "werift-dtls@0.5.8": { - "integrity": "sha512-oH39cdCpVLqKcPZRMGQLcN+tIBixvMGqjCB9qCrH39Tu9Mmu8u2+zTzyl0Fod87EK6PNPgoNqMJt64xlSMfLnw==", - "dependencies": [ - "@fidm/x509", - "@noble/curves", - "@peculiar/x509", - "@shinyoshiaki/binary-data", - "debug", - "tweetnacl" - ] - }, - "werift-ice@0.2.2": { - "integrity": "sha512-td52pHp+JmFnUn5jfDr/SSNO0dMCbknhuPdN1tFp9cfRj5jaktN63qnAdUuZC20QCC3ETWdsOthcm+RalHpFCQ==", - "dependencies": [ - "@shinyoshiaki/jspack", - "buffer-crc32", - "debug", - "int64-buffer", - "ip", - "lodash", - "multicast-dns", - "p-cancelable", - "rx.mini" - ] - }, - "werift-rtp@0.8.9": { - "integrity": "sha512-uLFOawIXw8FblIp1akfIVYFuRNtNo7csRxYypLz0t++sUNCN7sPeghVqET/c3Mq7Tg2QA3oAb15fXIIuJEp2AA==", - "dependencies": [ - "buffer@6.0.3", - "debug", - "mediabunny" - ] - }, - "werift-sctp@0.0.11": { - "integrity": "sha512-7109yuI5U7NTEHjqjn0A8VeynytkgVaxM6lRr1Ziv0D8bPcaB8A7U/P88M7WaCpWDoELHoXiRUjQycMWStIgjQ==", - "dependencies": [ - "@shinyoshiaki/jspack" - ] - }, - "werift@0.22.2": { - "integrity": "sha512-R+dfzOknUiGH8EcxGjWfN4404+Npj4tT1L5HpqZLjw0ARCO0B19i9gAQOo6ESzzTE+L8L1wxb1KIspOeoko+TQ==", - "dependencies": [ - "@fidm/x509", - "@minhducsun2002/leb128", - "@noble/curves", - "@peculiar/x509", - "@shinyoshiaki/binary-data", - "@shinyoshiaki/jspack", - "aes-js", - "buffer@6.0.3", - "buffer-crc32", - "date-fns", - "debug", - "int64-buffer", - "ip", - "lodash", - "mp4box", - "multicast-dns", - "nano-time", - "turbo-crc32", - "tweetnacl", - "uuid", - "werift-common", - "werift-dtls", - "werift-ice", - "werift-rtp", - "werift-sctp" - ] - }, - "wrappy@1.0.2": { - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - }, - "workspace": { - "packageJson": { - "dependencies": [ - "npm:node-datachannel@0.32.3", - "npm:werift@0.22.2" - ] - } - } -} diff --git a/tools/probes/webrtc-deno/package.json b/tools/probes/webrtc-deno/package.json deleted file mode 100644 index 3f8f47f..0000000 --- a/tools/probes/webrtc-deno/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "node-datachannel": "0.32.3", - "werift": "0.22.2" - } -} diff --git a/tools/probes/webrtc-deno/probe.mjs b/tools/probes/webrtc-deno/probe.mjs deleted file mode 100644 index 908542f..0000000 --- a/tools/probes/webrtc-deno/probe.mjs +++ /dev/null @@ -1,90 +0,0 @@ -// WebRTC-under-Deno capability probe (docs/consumers.md (C0 evidence)). -// -// Question answered: can Deno functionally substitute for Node as the -// consumers' JS-native lane, on the one capability that is not a Deno -// built-in — WebRTC? The polymorph webrtc host module resolves -// `RTCPeerConnection` isomorphically (globalThis, else -// `node-datachannel/polyfill`), so this probes both candidate providers -// with a full data-channel loopback: offer/answer, trickled ICE -// (buffered until remote descriptions are set — libdatachannel emits -// candidates immediately on setLocalDescription), SCTP channel open, -// and a bidirectional message echo. -// -// Legs: -// 1. node-datachannel/polyfill — the exact dependency the polymorph -// Node legs use; a Node-API native addon (prebuilt binaries via the -// now-unmaintained prebuild-install; hence leg 2). -// 2. werift — pure-TS WebRTC; the no-native-code fallback. -// -// Run (from this directory): -// deno install --allow-scripts=npm:node-datachannel -// deno run --allow-all probe.mjs -// -// First verified: 2026-08-08, Deno 2.9.5, linux-arm64 — both legs PASS. - -const timeout = (ms) => - new Promise((_, rej) => setTimeout(() => rej(new Error(`timeout ${ms}ms`)), ms)); - -async function loopback(RTCPeerConnection, label) { - const a = new RTCPeerConnection(); - const b = new RTCPeerConnection(); - // Buffer trickled candidates until the peer has its remote description. - const pend = { a: [], b: [] }; - a.onicecandidate = (e) => - e.candidate && (pend.b ? pend.b.push(e.candidate) : b.addIceCandidate(e.candidate)); - b.onicecandidate = (e) => - e.candidate && (pend.a ? pend.a.push(e.candidate) : a.addIceCandidate(e.candidate)); - - const chA = a.createDataChannel("probe"); - const echoed = new Promise((resolve, reject) => { - b.ondatachannel = ({ channel }) => { - channel.onmessage = (e) => channel.send(`echo:${e.data}`); - channel.onerror = reject; - }; - chA.onmessage = (e) => resolve(e.data); - chA.onerror = reject; - chA.onopen = () => chA.send("hello"); - }); - - const offer = await a.createOffer(); - await a.setLocalDescription(offer); - await b.setRemoteDescription(offer); - for (const c of pend.b) await b.addIceCandidate(c); - pend.b = null; - const answer = await b.createAnswer(); - await b.setLocalDescription(answer); - await a.setRemoteDescription(answer); - for (const c of pend.a) await a.addIceCandidate(c); - pend.a = null; - - const result = await Promise.race([echoed, timeout(15000)]); - if (result !== "echo:hello") throw new Error(`unexpected echo: ${JSON.stringify(result)}`); - console.log(`PASS ${label}: data channel echo => ${JSON.stringify(result)}`); - chA.close(); - a.close(); - b.close(); -} - -let failures = 0; - -try { - const { RTCPeerConnection } = await import("node-datachannel/polyfill"); - console.log("node-datachannel/polyfill loaded (Node-API addon works under Deno)"); - await loopback(RTCPeerConnection, "node-datachannel"); - (await import("node-datachannel")).cleanup?.(); -} catch (err) { - failures++; - console.log(`FAIL node-datachannel: ${err?.message}\n cause: ${err?.cause?.message ?? "-"}`); -} - -try { - const { RTCPeerConnection } = await import("werift"); - console.log("werift loaded (pure TS)"); - await loopback(RTCPeerConnection, "werift"); -} catch (err) { - failures++; - console.log(`FAIL werift: ${err?.message}\n cause: ${err?.cause?.message ?? "-"}`); -} - -// node-datachannel keeps background threads alive; exit explicitly. -Deno.exit(failures); diff --git a/upstream-component-model-repo-findings.md b/upstream-component-model-repo-findings.md index 1fd2f48..44b6562 100644 --- a/upstream-component-model-repo-findings.md +++ b/upstream-component-model-repo-findings.md @@ -49,14 +49,36 @@ Docs PR deleting `$async?` from the template at CanonicalABI.md:4013. > may not block"). This looks like a leftover from the removal of async > drops; this PR removes the stale immediate from the template. +### Filing notes + +- Removal history: #578 removed the `async` immediate from `resource.drop` + (Explainer grammar, Binary.md opcode `0x07`, the `option` prose); + #646 then forbade async ABI options on sync-typed functions entirely — + current dtor text ("may not block; may spawn a cooperative thread that + does") dates from there. +- The `$async?` immediates on `stream.cancel-read/write` / + `future.cancel-read/write` a few sections down (~L4744-4747) are still + correct — the fix is deleting the one token at :4013 only. +- Still present at upstream `main` (re-checked 2026-08-14). A standalone + pre-tracker draft of this finding (`upstream-issue-stale-async-drop.md`) + was retired into this entry; see git history if the fuller prose is wanted. + --- ## CM-2: `canon_backpressure_set` is dead code in definitions.py -**Status:** DRAFT — proposed as a PR removing it (with a question in the -description in case retention is intentional) +**Status:** RESOLVED upstream, independently — no filing needed. Upstream +commit `1c42aeb02` ("Remove TODO from tests, remove stale backpressure.set +definition", PR [#690]) deleted the block from definitions.py; verified +absent at `main` 2026-08-14. Our runtime's annotations referencing the dead +code (`runtime/src/intrinsics/async_builtins.ts`, `intrinsics/mod.ts`, +`runtime/README.md`) describe the **pinned** submodule (`73b7ad5`), where it +still exists — they come out with the next submodule bump, per the filing +checklist. **Found:** 2026-08-08, during the canonical-ABI reference-test port +[#690]: https://github.com/WebAssembly/component-model/pull/690 + ### Evidence - `canonical-abi/definitions.py:2366-2371` contains a @@ -77,24 +99,9 @@ description in case retention is intentional) `canon_backpressure_inc`), and exits with *"Error: Differences found between definitions.py and CanonicalABI.md."* -### Proposed fix - -PR removing the `canon backpressure.set` section from definitions.py, making -`diff.py` pass again. The PR description should ask whether the function was -kept deliberately (e.g., transitional compat for toolchains that emitted -`backpressure.set`) — if so, the alternative fix is documenting it in -CanonicalABI.md and the Explainer instead. - -### Draft PR description - -> `definitions.py` still defines `canon_backpressure_set`, but the Explainer -> grammar and CanonicalABI.md only define `backpressure.inc`/`backpressure.dec` -> — there is no grammar production that could reach it, and -> `canonical-abi/diff.py` currently fails with this block as its only -> difference. This PR removes the leftover from the set→inc/dec transition. -> If it is being kept intentionally for transitional toolchain compatibility, -> happy to convert this into a docs PR adding it back to the grammar/prose -> instead — but as it stands the repo's own consistency check is red. +(The formerly-proposed removal PR is exactly what upstream #690 did, +including making `diff.py` pass again; the draft text was dropped from this +entry on resolution — see git history.) --- diff --git a/upstream-issue-stale-async-drop.md b/upstream-issue-stale-async-drop.md deleted file mode 100644 index 5892fa6..0000000 --- a/upstream-issue-stale-async-drop.md +++ /dev/null @@ -1,40 +0,0 @@ -# Upstream issue draft: stale `$async?` on `canon resource.drop` in CanonicalABI.md - -Target repo: WebAssembly/component-model -Status: not yet filed - ---- - -Title: **CanonicalABI.md: leftover `$async?` immediate on `canon resource.drop`** - -#578 removed the `async` immediate from `resource.drop` (Explainer grammar, -Binary.md opcode `0x07`, and the `option` prose), but one wat template -in CanonicalABI.md's validation section still has it: - -https://github.com/WebAssembly/component-model/blob/73b7ad5/design/mvp/CanonicalABI.md#L4013 - -```wat -(canon resource.drop $rt $async? (core func $f)) -``` - -Everything else agrees the immediate is gone: - -- Explainer.md grammar: `(canon resource.drop (core func ?))` -- Binary.md: only `0x03` (the `0x07` async encoding was removed in #578) -- canonical-abi/definitions.py: `canon_resource_drop(rt, i)` — no async param - -Fix is deleting the one token. Note the `$async?` immediates on -`stream.cancel-read/write` / `future.cancel-read/write` a few sections down -(~L4744-4747) are still correct and should be left alone. - ---- - -Filing notes (not part of the issue body): - -- Removal rationale: #578 made `async` a checked effect on the function type; - dtor calls are non-`async`-lowered/typed, so the drop can never observe - blocking and the `option` return lost its meaning. -- #646 subsequently forbade async ABI options on sync-typed functions - entirely; current dtor text ("may not block; may spawn a cooperative thread - that does") dates from there. -- Verified at HEAD `73b7ad5` (2026-08-08).