quickwin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.en.md +197 -0
  2. package/README.md +196 -0
  3. package/examples/PdfCanvas.js +67 -0
  4. package/examples/PdfCanvas.tsx +83 -0
  5. package/examples/pdf_preview2.js +431 -0
  6. package/examples/pdf_preview2.ts +375 -0
  7. package/examples/pdf_viewer.js +17623 -0
  8. package/examples/pdf_viewer.tsx +279 -0
  9. package/examples/test_gallery.js +17452 -0
  10. package/examples/test_gallery.tsx +285 -0
  11. package/examples/test_react_lazy.js +17336 -0
  12. package/examples/test_react_lazy.tsx +63 -0
  13. package/examples/test_react_listbox.js +17339 -0
  14. package/examples/test_react_listbox.tsx +71 -0
  15. package/examples/test_root_window.js +17313 -0
  16. package/examples/test_root_window.tsx +41 -0
  17. package/examples/test_tab.js +17339 -0
  18. package/examples/test_tab.tsx +75 -0
  19. package/examples/tray_demo.js +79 -0
  20. package/examples/tray_demo.tsx +81 -0
  21. package/lib/assert.js +8 -0
  22. package/lib/assert.ts +7 -0
  23. package/lib/cache-utils.js +43 -0
  24. package/lib/cache-utils.ts +40 -0
  25. package/lib/dumpRects.js +25 -0
  26. package/lib/dumpRects.ts +25 -0
  27. package/lib/fetch.js +490 -0
  28. package/lib/fetch.ts +502 -0
  29. package/lib/http-common.js +342 -0
  30. package/lib/http-common.ts +399 -0
  31. package/lib/http-server.js +416 -0
  32. package/lib/http-server.ts +424 -0
  33. package/lib/polyfill.js +156 -0
  34. package/lib/polyfill.ts +171 -0
  35. package/lib/react-qw/components/Button.js +8 -0
  36. package/lib/react-qw/components/CheckBox.js +31 -0
  37. package/lib/react-qw/components/ComboBox.js +42 -0
  38. package/lib/react-qw/components/DateTimePicker.js +96 -0
  39. package/lib/react-qw/components/Input.js +50 -0
  40. package/lib/react-qw/components/Link.js +43 -0
  41. package/lib/react-qw/components/ListBox.js +48 -0
  42. package/lib/react-qw/components/ListView.js +328 -0
  43. package/lib/react-qw/components/PathPicker.js +136 -0
  44. package/lib/react-qw/components/ProgressBar.js +22 -0
  45. package/lib/react-qw/components/RadioButton.js +31 -0
  46. package/lib/react-qw/components/ScrollView.js +139 -0
  47. package/lib/react-qw/components/Slider.js +45 -0
  48. package/lib/react-qw/components/Tab.js +61 -0
  49. package/lib/react-qw/components/Tooltip.js +55 -0
  50. package/lib/react-qw/components/TreeView.js +130 -0
  51. package/lib/react-qw/components/index.js +16 -0
  52. package/lib/react-qw/components/index.ts +17 -0
  53. package/lib/react-qw/index.js +73 -0
  54. package/lib/react-qw/index.ts +90 -0
  55. package/lib/react-qw/jsx.d.ts +34 -0
  56. package/lib/react-qw/layout.js +82 -0
  57. package/lib/react-qw/layout.ts +111 -0
  58. package/lib/react-qw/props.js +27 -0
  59. package/lib/react-qw/props.ts +36 -0
  60. package/lib/react-qw/reconciler.js +333 -0
  61. package/lib/react-qw/reconciler.ts +373 -0
  62. package/lib/stream.js +2 -0
  63. package/lib/stream.ts +22 -0
  64. package/lib/text-codec.js +197 -0
  65. package/lib/text-codec.ts +171 -0
  66. package/lib/text-measure.js +52 -0
  67. package/lib/text-measure.ts +54 -0
  68. package/lib/url.js +278 -0
  69. package/lib/url.ts +201 -0
  70. package/lib/vendor/web-streams/ponyfill.d.mts +829 -0
  71. package/lib/vendor/web-streams/ponyfill.mjs +8 -0
  72. package/lib/websocket.js +541 -0
  73. package/lib/websocket.ts +555 -0
  74. package/package.json +44 -0
  75. package/quickwin.d.ts +594 -0
  76. package/quickwin_const.d.ts +900 -0
  77. package/qwin-nowasm.exe +0 -0
  78. package/qwin.exe +0 -0
  79. package/test/add.wasm +0 -0
  80. package/test/complex.wasm +0 -0
  81. package/test/complex_imports.wasm +0 -0
  82. package/test/debug/http_server_e2e.js +31 -0
  83. package/test/debug/minwasm.js +52 -0
  84. package/test/debug/mupdf_debug.js +104 -0
  85. package/test/debug/wasm.js +122 -0
  86. package/test/debug/wasm_export_debug.js +64 -0
  87. package/test/debug/wasm_names.js +46 -0
  88. package/test/global_imports.wasm +0 -0
  89. package/test/import_func.wasm +0 -0
  90. package/test/imports.wasm +0 -0
  91. package/test/run.js +91 -0
  92. package/test/run.ts +96 -0
  93. package/test/sjlj.wasm +0 -0
  94. package/test/test_basic.js +7 -0
  95. package/test/test_basic.ts +9 -0
  96. package/test/test_basic_fetch.js +34 -0
  97. package/test/test_basic_fetch.ts +33 -0
  98. package/test/test_brotli.js +48 -0
  99. package/test/test_brotli.ts +52 -0
  100. package/test/test_fetch_cache.js +169 -0
  101. package/test/test_fetch_cache.ts +187 -0
  102. package/test/test_ffi.js +157 -0
  103. package/test/test_ffi.ts +174 -0
  104. package/test/test_frame_encoding.js +128 -0
  105. package/test/test_frame_encoding.ts +132 -0
  106. package/test/test_helper.js +84 -0
  107. package/test/test_helper.ts +80 -0
  108. package/test/test_http_import.js +78 -0
  109. package/test/test_http_import.ts +74 -0
  110. package/test/test_http_server.js +142 -0
  111. package/test/test_http_server.ts +136 -0
  112. package/test/test_import_dir.js +4 -0
  113. package/test/test_import_dir.ts +5 -0
  114. package/test/test_ipv6.js +134 -0
  115. package/test/test_ipv6.ts +129 -0
  116. package/test/test_jsx.js +1314 -0
  117. package/test/test_meta_url.js +3 -0
  118. package/test/test_meta_url.ts +4 -0
  119. package/test/test_mupdf_render.js +69 -0
  120. package/test/test_mupdf_render.ts +74 -0
  121. package/test/test_mupdf_twice.js +77 -0
  122. package/test/test_mupdf_twice.ts +81 -0
  123. package/test/test_mupdf_wasm.js +33 -0
  124. package/test/test_mupdf_wasm.ts +30 -0
  125. package/test/test_net_event.js +57 -0
  126. package/test/test_net_event.ts +55 -0
  127. package/test/test_net_fetch.js +259 -0
  128. package/test/test_net_fetch.ts +238 -0
  129. package/test/test_net_websocket.js +180 -0
  130. package/test/test_net_websocket.ts +164 -0
  131. package/test/test_polyfill.js +144 -0
  132. package/test/test_polyfill.ts +159 -0
  133. package/test/test_react_complex.js +17440 -0
  134. package/test/test_react_counter.js +17331 -0
  135. package/test/test_react_flex.js +17643 -0
  136. package/test/test_react_hidden.js +17336 -0
  137. package/test/test_react_listview_link.js +17371 -0
  138. package/test/test_react_render.js +17326 -0
  139. package/test/test_url.js +173 -0
  140. package/test/test_url.ts +183 -0
  141. package/test/test_wasm_basic.js +85 -0
  142. package/test/test_wasm_basic.ts +73 -0
  143. package/test/test_wasm_import_global.js +41 -0
  144. package/test/test_wasm_import_global.ts +45 -0
  145. package/test/test_wasm_sjlj.js +145 -0
  146. package/test/test_wasm_sjlj.ts +125 -0
  147. package/test/test_wasm_types.js +97 -0
  148. package/test/test_wasm_types.ts +124 -0
  149. package/test/test_worker.js +21 -0
  150. package/test/test_worker.ts +24 -0
  151. package/test/test_worker_fetch.js +26 -0
  152. package/test/test_worker_fetch.ts +27 -0
  153. package/test/test_worker_net.js +51 -0
  154. package/test/test_worker_net.ts +54 -0
  155. package/test/test_worker_wasm_concurrent.js +44 -0
  156. package/test/test_worker_wasm_concurrent.ts +45 -0
  157. package/test/types.wasm +0 -0
  158. package/test/worker_fetch.js +13 -0
  159. package/test/worker_fetch.ts +13 -0
  160. package/test/worker_helper.js +1 -0
  161. package/test/worker_helper.ts +1 -0
  162. package/test/worker_http.js +18 -0
  163. package/test/worker_http.ts +20 -0
  164. package/test/worker_import_lib.js +12 -0
  165. package/test/worker_import_lib.ts +13 -0
  166. package/test/worker_module.js +16 -0
  167. package/test/worker_module.ts +17 -0
  168. package/test/worker_wasm_concurrent.js +22 -0
  169. package/test/worker_wasm_concurrent.ts +22 -0
  170. package/tsconfig.json +27 -0
  171. package/vendor/mupdf-wasm/mupdf-wasm.d.ts +571 -0
  172. package/vendor/mupdf-wasm/mupdf-wasm.js +2749 -0
  173. package/vendor/mupdf-wasm/mupdf-wasm.wasm +0 -0
  174. package/vendor/mupdf-wasm/mupdf.d.ts +939 -0
  175. package/vendor/mupdf-wasm/mupdf.js +3317 -0
@@ -0,0 +1,3 @@
1
+ import * as os from 'os';
2
+ const parent = os.Worker.parent;
3
+ parent.postMessage({ type: 'url', url: import.meta.url });
@@ -0,0 +1,4 @@
1
+ import * as os from 'os'
2
+
3
+ const parent = os.Worker.parent
4
+ parent.postMessage({ type: 'url', url: import.meta.url })
@@ -0,0 +1,69 @@
1
+ import * as std from 'std';
2
+ import '../lib/polyfill.js';
3
+ function loadWasmBytes(path) {
4
+ const fp = std.open(path, 'rb');
5
+ if (!fp)
6
+ throw new Error('Cannot open: ' + path);
7
+ fp.seek(0, 2);
8
+ const size = fp.tell();
9
+ fp.seek(0, 0);
10
+ const buffer = new ArrayBuffer(size);
11
+ fp.read(buffer, 0, size);
12
+ fp.close();
13
+ return buffer;
14
+ }
15
+ function setupMupdfModule(wasmPath) {
16
+ const wasmBinary = loadWasmBytes(wasmPath);
17
+ globalThis["$libmupdf_wasm_Module"] = {
18
+ wasmBinary,
19
+ locateFile: (p) => p
20
+ };
21
+ }
22
+ export const suite = {
23
+ name: 'mupdf-render',
24
+ run: async (t) => {
25
+ try {
26
+ setupMupdfModule('./vendor/mupdf-wasm/mupdf-wasm.wasm');
27
+ const mupdf = await import('../vendor/mupdf-wasm/mupdf.js');
28
+ const fp = std.open('./example.pdf', 'rb');
29
+ if (!fp) {
30
+ console.log('SKIP: no example.pdf');
31
+ return;
32
+ }
33
+ fp.seek(0, 2);
34
+ const size = fp.tell();
35
+ fp.seek(0, 0);
36
+ const buf = new ArrayBuffer(size);
37
+ fp.read(buf, 0, size);
38
+ fp.close();
39
+ console.log('pdf size:', size);
40
+ const doc = mupdf.Document.openDocument(new Uint8Array(buf), "application/pdf");
41
+ console.log('pages:', doc.countPages());
42
+ const page = doc.loadPage(0);
43
+ const bounds = page.getBounds();
44
+ if (bounds && bounds.length === 4)
45
+ console.log('page size:', bounds[2] - bounds[0], 'x', bounds[3] - bounds[1]);
46
+ const pixmap = page.toPixmap(mupdf.Matrix.scale(2, 2), mupdf.ColorSpace.DeviceRGB, false);
47
+ if (pixmap) {
48
+ console.log('pixmap:', pixmap.getWidth(), 'x', pixmap.getHeight());
49
+ const png = pixmap.asPNG();
50
+ console.log('png size:', png.byteLength);
51
+ const out = std.open('./output.png', 'wb');
52
+ if (out) {
53
+ const pngBuf = new ArrayBuffer(png.byteLength);
54
+ new Uint8Array(pngBuf).set(png);
55
+ out.write(pngBuf, 0, png.byteLength);
56
+ out.close();
57
+ }
58
+ console.log('saved to output.png');
59
+ }
60
+ doc.destroy();
61
+ console.log('done');
62
+ t.ok++;
63
+ }
64
+ catch (error) {
65
+ console.log('ERROR:', error);
66
+ t.fail++;
67
+ }
68
+ }
69
+ };
@@ -0,0 +1,74 @@
1
+ import * as std from 'std'
2
+ import { Tester } from './test_helper.js'
3
+ import '../lib/polyfill.js'
4
+
5
+ function loadWasmBytes(path: string): ArrayBuffer {
6
+ const fp = std.open(path, 'rb')
7
+ if (!fp) throw new Error('Cannot open: ' + path)
8
+ fp.seek(0, 2)
9
+ const size = fp.tell()
10
+ fp.seek(0, 0)
11
+ const buffer = new ArrayBuffer(size)
12
+ fp.read(buffer, 0, size)
13
+ fp.close()
14
+ return buffer
15
+ }
16
+
17
+ function setupMupdfModule(wasmPath: string) {
18
+ const wasmBinary = loadWasmBytes(wasmPath)
19
+ ;(globalThis as any)["$libmupdf_wasm_Module"] = {
20
+ wasmBinary,
21
+ locateFile: (p: string) => p
22
+ }
23
+ }
24
+
25
+ export const suite = {
26
+ name: 'mupdf-render',
27
+ run: async (t: Tester): Promise<void> => {
28
+ try {
29
+ setupMupdfModule('./vendor/mupdf-wasm/mupdf-wasm.wasm')
30
+
31
+ const mupdf: typeof import('../vendor/mupdf-wasm/mupdf.js') = await import('../vendor/mupdf-wasm/mupdf.js')
32
+
33
+ const fp = std.open('./example.pdf', 'rb')
34
+ if (!fp) { console.log('SKIP: no example.pdf'); return }
35
+ fp.seek(0, 2)
36
+ const size = fp.tell()
37
+ fp.seek(0, 0)
38
+ const buf = new ArrayBuffer(size)
39
+ fp.read(buf, 0, size)
40
+ fp.close()
41
+ console.log('pdf size:', size)
42
+
43
+ const doc = mupdf.Document.openDocument(new Uint8Array(buf), "application/pdf")
44
+ console.log('pages:', doc.countPages())
45
+
46
+ const page = doc.loadPage(0)
47
+ const bounds = page.getBounds()
48
+ if (bounds && bounds.length === 4)
49
+ console.log('page size:', bounds[2] - bounds[0], 'x', bounds[3] - bounds[1])
50
+
51
+ const pixmap = page.toPixmap(mupdf.Matrix.scale(2, 2), mupdf.ColorSpace.DeviceRGB, false)
52
+ if (pixmap) {
53
+ console.log('pixmap:', pixmap.getWidth(), 'x', pixmap.getHeight())
54
+ const png = pixmap.asPNG()
55
+ console.log('png size:', png.byteLength)
56
+ const out = std.open('./output.png', 'wb')
57
+ if (out) {
58
+ const pngBuf = new ArrayBuffer(png.byteLength)
59
+ new Uint8Array(pngBuf).set(png)
60
+ out.write(pngBuf, 0, png.byteLength)
61
+ out.close()
62
+ }
63
+ console.log('saved to output.png')
64
+ }
65
+
66
+ doc.destroy()
67
+ console.log('done')
68
+ t.ok++
69
+ } catch (error) {
70
+ console.log('ERROR:', error)
71
+ t.fail++
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,77 @@
1
+ import '../lib/polyfill.js';
2
+ import * as std from 'std';
3
+ function loadWasmBytes(path) {
4
+ const fp = std.open(path, 'rb');
5
+ if (!fp)
6
+ throw new Error('Cannot open: ' + path);
7
+ fp.seek(0, 2);
8
+ const size = fp.tell();
9
+ fp.seek(0, 0);
10
+ const buffer = new ArrayBuffer(size);
11
+ fp.read(buffer, 0, size);
12
+ fp.close();
13
+ return buffer;
14
+ }
15
+ export const suite = {
16
+ name: 'mupdf-twice',
17
+ run: async (t) => {
18
+ try {
19
+ console.log(' Loading WASM binary...');
20
+ const wasmBinary = loadWasmBytes('./vendor/mupdf-wasm/mupdf-wasm.wasm');
21
+ console.log(' WASM binary loaded, size:', wasmBinary.byteLength);
22
+ globalThis["$libmupdf_wasm_Module"] = {
23
+ wasmBinary,
24
+ locateFile: (p) => p
25
+ };
26
+ console.log(' Importing mupdf module...');
27
+ const mupdf = await import('../vendor/mupdf-wasm/mupdf.js');
28
+ console.log(' mupdf module imported ok');
29
+ const fp = std.open('./example.pdf', 'rb');
30
+ if (!fp) {
31
+ console.log('SKIP: no example.pdf');
32
+ return;
33
+ }
34
+ fp.seek(0, 2);
35
+ const size = fp.tell();
36
+ fp.seek(0, 0);
37
+ const pdfBuf = new ArrayBuffer(size);
38
+ fp.read(pdfBuf, 0, size);
39
+ fp.close();
40
+ console.log(' PDF loaded, size:', size);
41
+ t.section('Test 1: two toPixmap on same page (no destroy)');
42
+ try {
43
+ const doc = mupdf.Document.openDocument(new Uint8Array(pdfBuf), "application/pdf");
44
+ const page = doc.loadPage(0);
45
+ console.log(' 1: toPixmap #1...');
46
+ const pm1 = page.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false);
47
+ console.log(' 1: toPixmap #1 done:', pm1.getWidth(), 'x', pm1.getHeight());
48
+ t.check('toPixmap #1 ok', true, pm1 !== null);
49
+ console.log(' 1: toPixmap #2...');
50
+ const pm2 = page.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false);
51
+ console.log(' 1: toPixmap #2 done:', pm2.getWidth(), 'x', pm2.getHeight());
52
+ t.check('toPixmap #2 ok', true, pm2 !== null);
53
+ }
54
+ catch (e) {
55
+ console.log(' 1: ERROR:', e instanceof Error ? e.message : String(e));
56
+ }
57
+ t.section('Test 2: second openDocument + toPixmap (no destroy of first)');
58
+ try {
59
+ console.log(' 2: openDocument #2...');
60
+ const doc2 = mupdf.Document.openDocument(new Uint8Array(pdfBuf), "application/pdf");
61
+ console.log(' 2: loadPage #2...');
62
+ const page2 = doc2.loadPage(0);
63
+ console.log(' 2: toPixmap #3...');
64
+ const pm3 = page2.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false);
65
+ console.log(' 2: toPixmap #3 done:', pm3.getWidth(), 'x', pm3.getHeight());
66
+ t.check('toPixmap #3 ok', true, pm3 !== null);
67
+ }
68
+ catch (e) {
69
+ console.log(' 2: ERROR:', e instanceof Error ? e.message : String(e));
70
+ }
71
+ console.log('All mupdf-twice tests done');
72
+ }
73
+ catch (e) {
74
+ console.log('TOP-LEVEL ERROR:', e instanceof Error ? e.message : String(e));
75
+ }
76
+ }
77
+ };
@@ -0,0 +1,81 @@
1
+ import '../lib/polyfill.js'
2
+ import * as std from 'std'
3
+ import { Tester } from './test_helper.js'
4
+
5
+ function loadWasmBytes(path: string): ArrayBuffer {
6
+ const fp = std.open(path, 'rb')
7
+ if (!fp) throw new Error('Cannot open: ' + path)
8
+ fp.seek(0, 2)
9
+ const size = fp.tell()
10
+ fp.seek(0, 0)
11
+ const buffer = new ArrayBuffer(size)
12
+ fp.read(buffer, 0, size)
13
+ fp.close()
14
+ return buffer
15
+ }
16
+
17
+ export const suite = {
18
+ name: 'mupdf-twice',
19
+ run: async (t: Tester): Promise<void> => {
20
+ try {
21
+ console.log(' Loading WASM binary...')
22
+ const wasmBinary = loadWasmBytes('./vendor/mupdf-wasm/mupdf-wasm.wasm')
23
+ console.log(' WASM binary loaded, size:', wasmBinary.byteLength)
24
+
25
+ ;(globalThis as any)["$libmupdf_wasm_Module"] = {
26
+ wasmBinary,
27
+ locateFile: (p: string) => p
28
+ }
29
+
30
+ console.log(' Importing mupdf module...')
31
+ const mupdf: typeof import('../vendor/mupdf-wasm/mupdf.js') = await import('../vendor/mupdf-wasm/mupdf.js')
32
+ console.log(' mupdf module imported ok')
33
+
34
+ const fp = std.open('./example.pdf', 'rb')
35
+ if (!fp) { console.log('SKIP: no example.pdf'); return }
36
+ fp.seek(0, 2)
37
+ const size = fp.tell()
38
+ fp.seek(0, 0)
39
+ const pdfBuf = new ArrayBuffer(size)
40
+ fp.read(pdfBuf, 0, size)
41
+ fp.close()
42
+ console.log(' PDF loaded, size:', size)
43
+
44
+ t.section('Test 1: two toPixmap on same page (no destroy)')
45
+ try {
46
+ const doc = mupdf.Document.openDocument(new Uint8Array(pdfBuf), "application/pdf")
47
+ const page = doc.loadPage(0)
48
+
49
+ console.log(' 1: toPixmap #1...')
50
+ const pm1 = page.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false)
51
+ console.log(' 1: toPixmap #1 done:', pm1.getWidth(), 'x', pm1.getHeight())
52
+ t.check('toPixmap #1 ok', true, pm1 !== null)
53
+
54
+ console.log(' 1: toPixmap #2...')
55
+ const pm2 = page.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false)
56
+ console.log(' 1: toPixmap #2 done:', pm2.getWidth(), 'x', pm2.getHeight())
57
+ t.check('toPixmap #2 ok', true, pm2 !== null)
58
+ } catch (e: unknown) {
59
+ console.log(' 1: ERROR:', e instanceof Error ? e.message : String(e))
60
+ }
61
+
62
+ t.section('Test 2: second openDocument + toPixmap (no destroy of first)')
63
+ try {
64
+ console.log(' 2: openDocument #2...')
65
+ const doc2 = mupdf.Document.openDocument(new Uint8Array(pdfBuf), "application/pdf")
66
+ console.log(' 2: loadPage #2...')
67
+ const page2 = doc2.loadPage(0)
68
+ console.log(' 2: toPixmap #3...')
69
+ const pm3 = page2.toPixmap(mupdf.Matrix.scale(1, 1), mupdf.ColorSpace.DeviceRGB, false)
70
+ console.log(' 2: toPixmap #3 done:', pm3.getWidth(), 'x', pm3.getHeight())
71
+ t.check('toPixmap #3 ok', true, pm3 !== null)
72
+ } catch (e: unknown) {
73
+ console.log(' 2: ERROR:', e instanceof Error ? e.message : String(e))
74
+ }
75
+
76
+ console.log('All mupdf-twice tests done')
77
+ } catch (e: unknown) {
78
+ console.log('TOP-LEVEL ERROR:', e instanceof Error ? e.message : String(e))
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,33 @@
1
+ import { readWasmFile } from './test_helper.js';
2
+ export const suite = {
3
+ name: 'vendor/mupdf-wasm',
4
+ run: (t) => {
5
+ t.section('validate binary');
6
+ const buf = readWasmFile('../vendor/mupdf-wasm/mupdf-wasm.wasm');
7
+ if (!buf) {
8
+ t.fail++;
9
+ return;
10
+ }
11
+ t.check('file size > 0', true, buf.byteLength > 0);
12
+ const header = new Uint8Array(buf);
13
+ t.check('magic', true, header[0] === 0x00 && header[1] === 0x61 && header[2] === 0x73 && header[3] === 0x6d);
14
+ t.check('version 1', true, header[4] === 0x01 && header[5] === 0x00 && header[6] === 0x00 && header[7] === 0x00);
15
+ t.check('WebAssembly.validate', true, WebAssembly.validate(buf));
16
+ t.section('Module');
17
+ var mod = null;
18
+ try {
19
+ mod = new WebAssembly.Module(buf);
20
+ t.ok++;
21
+ }
22
+ catch (e) {
23
+ t.fail++;
24
+ }
25
+ t.section('imports/exports');
26
+ if (mod) {
27
+ const exps = WebAssembly.Module.exports(mod);
28
+ t.check('exports > 0', true, exps.length > 0);
29
+ const imps = WebAssembly.Module.imports(mod);
30
+ t.check('imports', imps.length, imps.length);
31
+ }
32
+ }
33
+ };
@@ -0,0 +1,30 @@
1
+ import { Tester, readWasmFile } from './test_helper.js'
2
+
3
+ export const suite = {
4
+ name: 'vendor/mupdf-wasm',
5
+ run: (t: Tester) => {
6
+ t.section('validate binary')
7
+ const buf = readWasmFile('../vendor/mupdf-wasm/mupdf-wasm.wasm')
8
+ if (!buf) { t.fail++; return }
9
+ t.check('file size > 0', true, buf.byteLength > 0)
10
+ const header = new Uint8Array(buf)
11
+ t.check('magic', true, header[0] === 0x00 && header[1] === 0x61 && header[2] === 0x73 && header[3] === 0x6d)
12
+ t.check('version 1', true, header[4] === 0x01 && header[5] === 0x00 && header[6] === 0x00 && header[7] === 0x00)
13
+ t.check('WebAssembly.validate', true, WebAssembly.validate(buf))
14
+
15
+ t.section('Module')
16
+ var mod: WebAssembly.Module | null = null
17
+ try {
18
+ mod = new WebAssembly.Module(buf)
19
+ t.ok++
20
+ } catch (e) { t.fail++ }
21
+
22
+ t.section('imports/exports')
23
+ if (mod) {
24
+ const exps = WebAssembly.Module.exports(mod)
25
+ t.check('exports > 0', true, exps.length > 0)
26
+ const imps = WebAssembly.Module.imports(mod)
27
+ t.check('imports', imps.length, imps.length)
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,57 @@
1
+ import * as sock from "sock";
2
+ import * as os from "os";
3
+ export const suite = {
4
+ name: 'net-event',
5
+ run: async (t) => {
6
+ await new Promise((resolve, reject) => {
7
+ const s = sock.socket();
8
+ if (s === null || s < 0) {
9
+ t.fail++;
10
+ reject(new Error('socket() failed'));
11
+ return;
12
+ }
13
+ var connected = false, gotData = false;
14
+ const timeoutId = os.setTimeout(() => {
15
+ if (!connected) {
16
+ sock.closesocket(s);
17
+ reject(new Error('connect timeout'));
18
+ }
19
+ }, 5000);
20
+ sock.set_on_event(s, (event) => {
21
+ if (event.lNetworkEvents & 16 /* sock.FdEvent.FD_CONNECT */) {
22
+ if (event.iErrorCode[0] === 0) {
23
+ connected = true;
24
+ t.ok++;
25
+ os.clearTimeout(timeoutId);
26
+ const req = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
27
+ const buf = new ArrayBuffer(req.length);
28
+ const v = new Uint8Array(buf);
29
+ for (let i = 0; i < req.length; i++)
30
+ v[i] = req.charCodeAt(i);
31
+ sock.send(s, buf);
32
+ }
33
+ else {
34
+ sock.closesocket(s);
35
+ reject(new Error('connect error: ' + event.iErrorCode[0]));
36
+ }
37
+ }
38
+ if (event.lNetworkEvents & 1 /* sock.FdEvent.FD_READ */ && connected && !gotData) {
39
+ const data = sock.recv(s, 4096);
40
+ if (data && data.byteLength > 0) {
41
+ gotData = true;
42
+ t.ok++;
43
+ }
44
+ }
45
+ if (event.lNetworkEvents & 32 /* sock.FdEvent.FD_CLOSE */) {
46
+ os.clearTimeout(timeoutId);
47
+ sock.closesocket(s);
48
+ if (gotData && connected)
49
+ resolve();
50
+ else
51
+ reject(new Error('test incomplete'));
52
+ }
53
+ });
54
+ sock.connect(s, '127.0.0.1', 18923);
55
+ });
56
+ }
57
+ };
@@ -0,0 +1,55 @@
1
+ import * as sock from "sock"
2
+ import * as os from "os"
3
+ import { Tester } from './test_helper.js'
4
+
5
+ interface WSAEvent {
6
+ lNetworkEvents: number;
7
+ iErrorCode: number[];
8
+ }
9
+
10
+ export const suite = {
11
+ name: 'net-event',
12
+ run: async (t: Tester): Promise<void> => {
13
+ await new Promise<void>((resolve, reject) => {
14
+ const s = sock.socket()
15
+ if (s === null || s < 0) { t.fail++; reject(new Error('socket() failed')); return }
16
+
17
+ var connected = false, gotData = false
18
+
19
+ const timeoutId = os.setTimeout(() => {
20
+ if (!connected) {
21
+ sock.closesocket(s)
22
+ reject(new Error('connect timeout'))
23
+ }
24
+ }, 5000)
25
+
26
+ sock.set_on_event(s, (event: WSAEvent) => {
27
+ if (event.lNetworkEvents & sock.FdEvent.FD_CONNECT) {
28
+ if (event.iErrorCode[0] === 0) {
29
+ connected = true; t.ok++
30
+ os.clearTimeout(timeoutId)
31
+ const req = "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n"
32
+ const buf = new ArrayBuffer(req.length)
33
+ const v = new Uint8Array(buf)
34
+ for (let i = 0; i < req.length; i++) v[i] = req.charCodeAt(i)
35
+ sock.send(s, buf)
36
+ } else {
37
+ sock.closesocket(s)
38
+ reject(new Error('connect error: ' + event.iErrorCode[0]))
39
+ }
40
+ }
41
+ if (event.lNetworkEvents & sock.FdEvent.FD_READ && connected && !gotData) {
42
+ const data = sock.recv(s, 4096)
43
+ if (data && data.byteLength > 0) { gotData = true; t.ok++ }
44
+ }
45
+ if (event.lNetworkEvents & sock.FdEvent.FD_CLOSE) {
46
+ os.clearTimeout(timeoutId)
47
+ sock.closesocket(s)
48
+ if (gotData && connected) resolve()
49
+ else reject(new Error('test incomplete'))
50
+ }
51
+ })
52
+ sock.connect(s, '127.0.0.1', 18923)
53
+ })
54
+ }
55
+ }