Source code
Revision control
Copy as Markdown
Other Tools
/* Any copyright is dedicated to the Public Domain.
"use strict";
function test(condition, message) {
self.postMessage({
type: "test",
result: condition,
message,
});
}
self.onmessage = async function (e) {
const { testName } = e.data;
try {
switch (testName) {
case "readableTransfer":
await testReadableTransfer(e.data);
break;
case "writableTransfer":
await testWritableTransfer(e.data);
break;
case "bothTransfer":
await testBothTransfer(e.data);
break;
default:
self.postMessage({
type: "error",
message: `Unknown test: ${testName}`,
});
return;
}
self.postMessage({ type: "done" });
} catch (ex) {
self.postMessage({
type: "error",
message: `${testName} failed: ${ex.name}: ${ex.message}`,
});
}
};
async function testReadableTransfer(data) {
const readable = data.readable;
test(
readable instanceof ReadableStream,
"Should receive a ReadableStream in worker"
);
const reader = readable.getReader();
const { value, done } = await reader.read();
test(!done, "Read should not be done");
test(
value instanceof Uint8Array,
"Should receive Uint8Array from transferred readable"
);
const decoder = new TextDecoder();
const text = decoder.decode(value);
test(
text === "TransferRead",
`Should receive 'TransferRead' but got '${text}'`
);
reader.releaseLock();
}
async function testWritableTransfer(data) {
const writable = data.writable;
test(
writable instanceof WritableStream,
"Should receive a WritableStream in worker"
);
const writer = writable.getWriter();
const encoder = new TextEncoder();
await writer.write(encoder.encode("WorkerWrite"));
test(true, "Should write data through transferred writable");
writer.releaseLock();
}
async function testBothTransfer(data) {
const readable = data.readable;
const writable = data.writable;
test(
readable instanceof ReadableStream,
"Should receive a ReadableStream in worker"
);
test(
writable instanceof WritableStream,
"Should receive a WritableStream in worker"
);
const writer = writable.getWriter();
const encoder = new TextEncoder();
await writer.write(encoder.encode("RoundTrip"));
writer.releaseLock();
test(true, "Should write data through transferred writable");
const reader = readable.getReader();
const { value, done } = await reader.read();
test(!done, "Read should not be done");
test(
value instanceof Uint8Array,
"Should receive Uint8Array from transferred readable"
);
const decoder = new TextDecoder();
const text = decoder.decode(value);
test(text === "RoundTrip", `Should receive 'RoundTrip' but got '${text}'`);
reader.releaseLock();
}