fetch-stream.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. "use strict"
  2. import * as mupdf from "mupdf"
  3. class FetchStream {
  4. constructor(url) {
  5. fetch(url)
  6. .then((response) => {
  7. if (!response.ok)
  8. throw new Error("HTTP " + response.status)
  9. return response.arrayBuffer()
  10. })
  11. .then((buffer) => {
  12. this.buffer = new Uint8Array(buffer)
  13. })
  14. }
  15. fileSize() {
  16. if (this.buffer)
  17. return this.buffer.byteLength
  18. return -1 // signal try later
  19. }
  20. read(memory, offset, size, position) {
  21. if (this.buffer) {
  22. size = Math.min(size, this.buffer.byteLength - position)
  23. memory.set(this.buffer.subarray(position, position + size), offset)
  24. return size
  25. }
  26. return -1 // signal try later
  27. }
  28. close() {
  29. this.buffer = null
  30. }
  31. }
  32. var stm = new mupdf.Stream(new FetchStream("https://mupdf.com/docs/mupdf_explored.pdf"))
  33. function loop() {
  34. try {
  35. var doc = mupdf.Document.openDocument(stm, "application/pdf")
  36. var n = doc.countPages()
  37. console.log("Document has " + n + " pages!")
  38. } catch (err) {
  39. if (err === "TRYLATER") {
  40. console.log("Waiting...")
  41. setTimeout(loop, 1000)
  42. } else {
  43. throw err
  44. }
  45. }
  46. }
  47. loop()