diff --git a/packages/preview2-shim/src/io/worker-io.ts b/packages/preview2-shim/src/io/worker-io.ts index 4469df3c3..5ec6f4b4d 100644 --- a/packages/preview2-shim/src/io/worker-io.ts +++ b/packages/preview2-shim/src/io/worker-io.ts @@ -141,8 +141,7 @@ export function earlyDispose(finalizer) { finalizer(); } -const _Error = Error; -const IoError = class Error extends _Error { +class IoError extends Error { payload: any; constructor(payload: any) { super(payload); @@ -151,7 +150,7 @@ const IoError = class Error extends _Error { toDebugString() { return this.message; } -}; +} function streamIoErrorCall(call, id, payload) { try { diff --git a/packages/preview2-shim/test/browser/http-input-stream.ts b/packages/preview2-shim/test/browser/http-input-stream.ts index eb45b868c..9b2ec5c9f 100644 --- a/packages/preview2-shim/test/browser/http-input-stream.ts +++ b/packages/preview2-shim/test/browser/http-input-stream.ts @@ -70,7 +70,7 @@ afterEach(() => { suite("Browser HTTP input stream", () => { test.each([true, false])( - "only unconsumed response futures abort Fetch on drop (consumed=%s)", + "settled response futures do not abort Fetch on drop (consumed=%s)", async (consumed) => { let signal: AbortSignal | null | undefined; vi.stubGlobal( @@ -95,7 +95,7 @@ suite("Browser HTTP input stream", () => { assert.ok(future.get()); } dispose(future); - assert.strictEqual(signal.aborted, !consumed); + assert.strictEqual(signal.aborted, false); }, ); diff --git a/packages/preview2-shim/test/browser/index.ts b/packages/preview2-shim/test/browser/index.ts index 2be03cb74..392c7af57 100644 --- a/packages/preview2-shim/test/browser/index.ts +++ b/packages/preview2-shim/test/browser/index.ts @@ -64,7 +64,9 @@ suite("browser", () => { return; } const chunks: Uint8Array[] = []; - stream.on("data", (chunk) => chunks.push(chunk)); + stream.on("data", (chunk) => { + chunks.push(typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk); + }); stream.on("end", () => { stream.respond({ ":status": 200, diff --git a/packages/preview2-shim/test/browser/io.ts b/packages/preview2-shim/test/browser/io.ts index 96232f1e9..669f6b6be 100644 --- a/packages/preview2-shim/test/browser/io.ts +++ b/packages/preview2-shim/test/browser/io.ts @@ -135,8 +135,8 @@ suite("Browser I/O", () => { }), }); const child = input.subscribe(); - const blocked = child.block(); - const polled = poll.poll([child]) as Promise; + const blocked = Promise.resolve(child.block()); + const polled = Promise.resolve(poll.poll([child])); (input as any)[symbolDispose](); diff --git a/packages/preview2-shim/test/fixtures/tls/localhost.crt b/packages/preview2-shim/test/fixtures/tls/localhost.crt new file mode 100644 index 000000000..f28d94f28 --- /dev/null +++ b/packages/preview2-shim/test/fixtures/tls/localhost.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDADCCAeigAwIBAgIUPkkLpP56FfjUfelKxbjuCuMa/5MwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTI2MDgyODA4NDgyNFoYDzIxMjYw +ODA0MDg0ODI0WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDLN8h1wyJuWFMfso9CuV4XHr3v0gD7dNY6N+ER0WtA +/cjghklox/4k2qnb4DjsvQfMzxKH0u28ybQKpe9AL/EXobFJnjuus2R1U7zE8QrV +bS5axKD5xr8xVzuPcILX/Ciwd+N+/hdWesosa7v/a8Sj284/e0+2jH9bY5AaRxWx +nZ1Az24SuAmx8bntmT22Uoz5ii4DmcDc+ax5xB7QZiV/oXe7XYzUBM0xZ3UUk2t8 +Wbhur+2PVOK+XpKGdR8f+ycWB2Tmtmos5uZ1iRCmXxAUjSssmlgzO4+tclUSc4oR +4xIu25ZblKhVc7z2g1Xj9Akh8k57bAZRRbI4k2QVGs7DAgMBAAGjSDBGMB0GA1Ud +DgQWBBTy1t+w64/aQgI/6cx4IxAFxzU7xzAPBgNVHRMBAf8EBTADAQH/MBQGA1Ud +EQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEATOXmX4u4AJLKCHOK +ZTEXPVWx0SsUlxMncm9SxjSWlSzrXea3+n8ytIbIZVmQylhdIwoe41871ukxzydr +6272W2QBzq+/inNDmszssVCHu41UeYf1UT+321Z5Cf7qKCYGC1uz+IypbkWLp52v +3YVXe7qG+NmwWfA+5GIR/1mDR5qFz+WCIhQHiDTSE1bkQB07msXr857U6A84FZpI +HrQwLszeS/ilqH11YKNPNntsZWwXD9QxqFaG0EA5PambbI/mQbeNushYb5HW8IYd +2moXbq4VpMgcikHmtpfx7XU/ljLnlNO3vZsGvAU4f+45xoT5dMSEuSVgViDqJYfV +M3bI1Q== +-----END CERTIFICATE----- diff --git a/packages/preview2-shim/test/fixtures/tls/localhost.key b/packages/preview2-shim/test/fixtures/tls/localhost.key new file mode 100644 index 000000000..b0889f1a0 --- /dev/null +++ b/packages/preview2-shim/test/fixtures/tls/localhost.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLN8h1wyJuWFMf +so9CuV4XHr3v0gD7dNY6N+ER0WtA/cjghklox/4k2qnb4DjsvQfMzxKH0u28ybQK +pe9AL/EXobFJnjuus2R1U7zE8QrVbS5axKD5xr8xVzuPcILX/Ciwd+N+/hdWesos +a7v/a8Sj284/e0+2jH9bY5AaRxWxnZ1Az24SuAmx8bntmT22Uoz5ii4DmcDc+ax5 +xB7QZiV/oXe7XYzUBM0xZ3UUk2t8Wbhur+2PVOK+XpKGdR8f+ycWB2Tmtmos5uZ1 +iRCmXxAUjSssmlgzO4+tclUSc4oR4xIu25ZblKhVc7z2g1Xj9Akh8k57bAZRRbI4 +k2QVGs7DAgMBAAECggEAKfr3l9A8VCQ9473s12FYvRj2Ls0os8mCmdtCTP6AlBf5 +P9yt3I34A+ACF/B9gfZY3qfmUZWy0/2tCkgWISHmQbX+3FDqTmAzwAMQ63RKAyX/ +XfPht0el5oj5PlwFQ54NP8s8fVb7Nju+eSe2WgEGybzWIgoUwQbMJnJuaedGZX7l ++DjrKbUnmhsUzSBbHaPmBnqSFn2tG8ym6ayTYgeMm+/xf8bDQVg3skgXRPx62vms +Bt8hRtY4UWWksuzEliUAvJBHQ7Pn7gm2qzL0pV01OO/wa9H2NOwwuDLpQk6efWpw +tCn5QPTFiCWjG2cmyC4p/Ccv3m5VkQihHNomfAqj9QKBgQDzGD35whYDMyFxEtvg +qhzuW59UW+P1891icSbvVMYJmQ/0MWhStPpl3vMSGrAOODnCfd5tRfkM7jvkkKq2 +hdYqUgTS+Kk3vBtWYTYixYJvijUbg8X7yPh2x8NEOp8c/NqDJ1R90n1xtPuEmvZG +dxtZyrfBXKE33EdilsY3oIfpXQKBgQDWAZlI7QEwTspn16n8kHzDAAtEvF9qDKxo +7MLev7CV6VZsnfMDmr57qKVjcBy36rjvTYRXCYDC+jff73dZtoGf/yXURclIYEtY +nu8tccr7vGcRc3EsUneOxM7aSVCO7b3k5LQQJpL5J7Qvc2GHNSkLkrHDSt2GxnzW +js1nVaB2nwKBgQCc/cboiSNWJasvLxK44KOWe61F+aIasMcEUDbo0UKj6CmZdl79 +KsubBoTL6FhSlpUWudrvjwTsCN69GYBmJ8DLy/Q5m0UNLXoqKtWfVxaJmiP6BPvT +Q1LSwuekJIelXNZxZPD34PwKdusIFFt/3mPXdUd+pKepP6UKUnzoZ8/eMQKBgC8d +6P66V6GoJz4XqHBX63APaWu3wZYatjbfscPTFnDbD9EYMXHgtwGIzukGvPvtLMxb +F8EF8Zh7+KNQGMniucVdKpoCx18s/EnFrEkoHZWxFEwuS4ODoJkJUbWToK3nQADO +LarEo2VBzZUI5TcciC3pHUQvDnjm6INgq26N1qdnAoGAf6yPUSmbNKNk+GWUolKa +Y1ZZ3uuTZkfOABQzpUB3GzLIQBc3dwmv/ORaQ/QQ0MaLT8vfxM5/kmABxD0kSnG2 +YDTccZRYhxkNPzqw8CdqW7NBc8+G7vxUWe+75fl1nj8kFWsD8SA2mdsZRDWlFSdL +8CXKLyzyrep0S3YFPYUVkSw= +-----END PRIVATE KEY----- diff --git a/packages/preview2-shim/test/node.ts b/packages/preview2-shim/test/node.ts index 3ad4c0719..15520218e 100644 --- a/packages/preview2-shim/test/node.ts +++ b/packages/preview2-shim/test/node.ts @@ -881,7 +881,7 @@ suite("Instantiation", () => { }); const imports = shim.getImportObject(); assert.strictEqual(receivedPreopens, configuredPreopens); - assert.strictEqual(receivedPreopens["/guest"], capability); + assert.strictEqual(receivedPreopens?.["/guest"], capability); assert.strictEqual(imports["wasi:filesystem/types"], filesystem.types); assert.strictEqual(imports["wasi:filesystem/preopens"], customPreopens); }); @@ -1105,7 +1105,7 @@ suite("Sandboxing", () => { /access-denied/, ); assert.strictEqual(dispatched, 0, "denied HTTP must not reach the configured handler"); - assert.strictEqual( + assert.strictEqual( allowed["wasi:http/outgoing-handler"].handle({} as any, undefined), "dispatched", ); @@ -1308,7 +1308,7 @@ suite("Sandboxing", () => { const testDir = mkdtempSync(join(tmpdir(), "jco-symlink-follow-")); try { writeFileSync(join(testDir, "real.txt"), "target contents"); - symlinkSync(join(testDir, "real.txt"), join(testDir, "link.txt")); + symlinkSync("real.txt", join(testDir, "link.txt")); const shim = new WASIShim({ sandbox: { preopens: { "/test": testDir } } }); const [rootDescriptor] = shim @@ -1330,6 +1330,11 @@ suite("Sandboxing", () => { false, "following the symlink should hard-link the real file", ); + assert.strictEqual( + lstatSync(join(testDir, "followed.txt")).ino, + lstatSync(join(testDir, "real.txt")).ino, + "the hard link should refer to the symlink target", + ); } finally { rmSync(testDir, { recursive: true, force: true }); } diff --git a/packages/preview2-shim/test/vitest.ts b/packages/preview2-shim/test/vitest.ts index d9db5db57..a2efd7045 100644 --- a/packages/preview2-shim/test/vitest.ts +++ b/packages/preview2-shim/test/vitest.ts @@ -11,7 +11,7 @@ export default defineConfig({ printConsoleTrace: true, passWithNoTests: false, include: ["test/*.ts", "test/browser/**/*.ts"], - exclude: ["test/common.ts", "test/vitest.ts"], + exclude: ["test/common.ts", "test/filesystem-conformance.ts", "test/vitest.ts"], testTimeout: DEFAULT_TIMEOUT_MS, hookTimeout: DEFAULT_TIMEOUT_MS, teardownTimeout: DEFAULT_TIMEOUT_MS,