webStream.spec.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { createApp, h, defineAsyncComponent } from 'vue'
  2. import { ReadableStream, TransformStream } from 'stream/web'
  3. import { pipeToWebWritable, renderToWebStream } from '../src'
  4. beforeEach(() => {
  5. global.ReadableStream = ReadableStream
  6. })
  7. afterEach(() => {
  8. // @ts-ignore
  9. delete global.ReadableStream
  10. })
  11. test('renderToWebStream', async () => {
  12. const Async = defineAsyncComponent(() =>
  13. Promise.resolve({
  14. render: () => h('div', 'async')
  15. })
  16. )
  17. const App = {
  18. render: () => [h('div', 'parent'), h(Async)]
  19. }
  20. const stream = renderToWebStream(createApp(App))
  21. const reader = stream.getReader()
  22. const decoder = new TextDecoder()
  23. let res = ''
  24. await reader.read().then(function read({ done, value }): any {
  25. if (!done) {
  26. res += decoder.decode(value)
  27. return reader.read().then(read)
  28. }
  29. })
  30. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  31. })
  32. test('pipeToWebWritable', async () => {
  33. const Async = defineAsyncComponent(() =>
  34. Promise.resolve({
  35. render: () => h('div', 'async')
  36. })
  37. )
  38. const App = {
  39. render: () => [h('div', 'parent'), h(Async)]
  40. }
  41. const { readable, writable } = new TransformStream()
  42. pipeToWebWritable(createApp(App), {}, writable)
  43. const reader = readable.getReader()
  44. const decoder = new TextDecoder()
  45. let res = ''
  46. await reader.read().then(function read({ done, value }): any {
  47. if (!done) {
  48. res += decoder.decode(value)
  49. return reader.read().then(read)
  50. }
  51. })
  52. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  53. })