Created
February 14, 2017 23:45
-
-
Save domenic/e1e2238f1447e6f6783f1fba3ee601a6 to your computer and use it in GitHub Desktop.
Service worker stream transferring 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
const worker = new Worker("worker.js"); | |
self.onfetch = e => { | |
e.respondWith(new Promise(resolve => { | |
const guid = generateGUID(); | |
worker.addEventListener("message", function messageListener({ data: { readableStream, messageId } }) { | |
if (messageId !== guid) { | |
return; | |
} | |
worker.removeEventListener("message", messageListener); | |
resolve(new Response(readableStream)); | |
}); | |
worker.postMessage(guid); | |
}); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
self.onmessage = ({ data: messageId, source }) => { | |
const readableStream = new ReadableStream({ | |
start(controller) { | |
// These can be done asynchronously if you want. | |
controller.enqueue(new Uint8Array([1, 2, 3])); | |
controller.close(); | |
} | |
}); | |
source.postMessage({ readableStream, messageId }, [readableStream]); | |
// readableStream has now been transferred/neutered/detached. | |
// This means that readableStream.getReader() will never work anymore in this thread. | |
// However, we as the creator of the stream can still *enqueue data into it*; it's just | |
// that the UA has an exclusive lock on reading data out of it, for the purpose of transferring | |
// it over to the service worker. | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment