postext-epub 0.1.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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/dist/__tests__/sampleBook.d.ts +17 -0
  4. package/dist/__tests__/sampleBook.d.ts.map +1 -0
  5. package/dist/__tests__/sampleBook.js +103 -0
  6. package/dist/__tests__/sampleBook.js.map +1 -0
  7. package/dist/epubcheck.test.d.ts +2 -0
  8. package/dist/epubcheck.test.d.ts.map +1 -0
  9. package/dist/epubcheck.test.js +69 -0
  10. package/dist/epubcheck.test.js.map +1 -0
  11. package/dist/fixed/fixed.test.d.ts +2 -0
  12. package/dist/fixed/fixed.test.d.ts.map +1 -0
  13. package/dist/fixed/fixed.test.js +225 -0
  14. package/dist/fixed/fixed.test.js.map +1 -0
  15. package/dist/fixed/fontUse.d.ts +21 -0
  16. package/dist/fixed/fontUse.d.ts.map +1 -0
  17. package/dist/fixed/fontUse.js +82 -0
  18. package/dist/fixed/fontUse.js.map +1 -0
  19. package/dist/fixed/index.d.ts +3 -0
  20. package/dist/fixed/index.d.ts.map +1 -0
  21. package/dist/fixed/index.js +254 -0
  22. package/dist/fixed/index.js.map +1 -0
  23. package/dist/fixed/outline.d.ts +40 -0
  24. package/dist/fixed/outline.d.ts.map +1 -0
  25. package/dist/fixed/outline.js +88 -0
  26. package/dist/fixed/outline.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +29 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/package/pack.d.ts +25 -0
  32. package/dist/package/pack.d.ts.map +1 -0
  33. package/dist/package/pack.js +253 -0
  34. package/dist/package/pack.js.map +1 -0
  35. package/dist/package/pack.test.d.ts +2 -0
  36. package/dist/package/pack.test.d.ts.map +1 -0
  37. package/dist/package/pack.test.js +164 -0
  38. package/dist/package/pack.test.js.map +1 -0
  39. package/dist/package/read.d.ts +15 -0
  40. package/dist/package/read.d.ts.map +1 -0
  41. package/dist/package/read.js +198 -0
  42. package/dist/package/read.js.map +1 -0
  43. package/dist/package/strings.d.ts +17 -0
  44. package/dist/package/strings.d.ts.map +1 -0
  45. package/dist/package/strings.js +24 -0
  46. package/dist/package/strings.js.map +1 -0
  47. package/dist/reflowable/__tests__/vdt.d.ts +13 -0
  48. package/dist/reflowable/__tests__/vdt.d.ts.map +1 -0
  49. package/dist/reflowable/__tests__/vdt.js +55 -0
  50. package/dist/reflowable/__tests__/vdt.js.map +1 -0
  51. package/dist/reflowable/__tests__/xml.d.ts +8 -0
  52. package/dist/reflowable/__tests__/xml.d.ts.map +1 -0
  53. package/dist/reflowable/__tests__/xml.js +107 -0
  54. package/dist/reflowable/__tests__/xml.js.map +1 -0
  55. package/dist/reflowable/css.d.ts +45 -0
  56. package/dist/reflowable/css.d.ts.map +1 -0
  57. package/dist/reflowable/css.js +491 -0
  58. package/dist/reflowable/css.js.map +1 -0
  59. package/dist/reflowable/index.d.ts +4 -0
  60. package/dist/reflowable/index.d.ts.map +1 -0
  61. package/dist/reflowable/index.js +257 -0
  62. package/dist/reflowable/index.js.map +1 -0
  63. package/dist/reflowable/inline.d.ts +56 -0
  64. package/dist/reflowable/inline.d.ts.map +1 -0
  65. package/dist/reflowable/inline.js +334 -0
  66. package/dist/reflowable/inline.js.map +1 -0
  67. package/dist/reflowable/model.d.ts +261 -0
  68. package/dist/reflowable/model.d.ts.map +1 -0
  69. package/dist/reflowable/model.js +6 -0
  70. package/dist/reflowable/model.js.map +1 -0
  71. package/dist/reflowable/reflowable.test.d.ts +2 -0
  72. package/dist/reflowable/reflowable.test.d.ts.map +1 -0
  73. package/dist/reflowable/reflowable.test.js +469 -0
  74. package/dist/reflowable/reflowable.test.js.map +1 -0
  75. package/dist/reflowable/rtl.test.d.ts +2 -0
  76. package/dist/reflowable/rtl.test.d.ts.map +1 -0
  77. package/dist/reflowable/rtl.test.js +217 -0
  78. package/dist/reflowable/rtl.test.js.map +1 -0
  79. package/dist/reflowable/walk.d.ts +42 -0
  80. package/dist/reflowable/walk.d.ts.map +1 -0
  81. package/dist/reflowable/walk.js +1096 -0
  82. package/dist/reflowable/walk.js.map +1 -0
  83. package/dist/reflowable/xhtml.d.ts +33 -0
  84. package/dist/reflowable/xhtml.d.ts.map +1 -0
  85. package/dist/reflowable/xhtml.js +472 -0
  86. package/dist/reflowable/xhtml.js.map +1 -0
  87. package/dist/shared/accessibility.d.ts +20 -0
  88. package/dist/shared/accessibility.d.ts.map +1 -0
  89. package/dist/shared/accessibility.js +30 -0
  90. package/dist/shared/accessibility.js.map +1 -0
  91. package/dist/shared/assets.d.ts +46 -0
  92. package/dist/shared/assets.d.ts.map +1 -0
  93. package/dist/shared/assets.js +143 -0
  94. package/dist/shared/assets.js.map +1 -0
  95. package/dist/shared/assets.test.d.ts +2 -0
  96. package/dist/shared/assets.test.d.ts.map +1 -0
  97. package/dist/shared/assets.test.js +106 -0
  98. package/dist/shared/assets.test.js.map +1 -0
  99. package/dist/shared/media.d.ts +11 -0
  100. package/dist/shared/media.d.ts.map +1 -0
  101. package/dist/shared/media.js +52 -0
  102. package/dist/shared/media.js.map +1 -0
  103. package/dist/shared/uuid.d.ts +7 -0
  104. package/dist/shared/uuid.d.ts.map +1 -0
  105. package/dist/shared/uuid.js +63 -0
  106. package/dist/shared/uuid.js.map +1 -0
  107. package/dist/shared/xml.d.ts +54 -0
  108. package/dist/shared/xml.d.ts.map +1 -0
  109. package/dist/shared/xml.js +214 -0
  110. package/dist/shared/xml.js.map +1 -0
  111. package/dist/shared/xml.test.d.ts +2 -0
  112. package/dist/shared/xml.test.d.ts.map +1 -0
  113. package/dist/shared/xml.test.js +71 -0
  114. package/dist/shared/xml.test.js.map +1 -0
  115. package/dist/shared/xmlRead.d.ts +19 -0
  116. package/dist/shared/xmlRead.d.ts.map +1 -0
  117. package/dist/shared/xmlRead.js +85 -0
  118. package/dist/shared/xmlRead.js.map +1 -0
  119. package/dist/types.d.ts +205 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +15 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/worker/client.d.ts +39 -0
  124. package/dist/worker/client.d.ts.map +1 -0
  125. package/dist/worker/client.js +184 -0
  126. package/dist/worker/client.js.map +1 -0
  127. package/dist/worker/epub.worker.d.ts +2 -0
  128. package/dist/worker/epub.worker.d.ts.map +1 -0
  129. package/dist/worker/epub.worker.js +7 -0
  130. package/dist/worker/epub.worker.js.map +1 -0
  131. package/dist/worker/protocol.d.ts +44 -0
  132. package/dist/worker/protocol.d.ts.map +1 -0
  133. package/dist/worker/protocol.js +6 -0
  134. package/dist/worker/protocol.js.map +1 -0
  135. package/dist/worker/serve.d.ts +11 -0
  136. package/dist/worker/serve.d.ts.map +1 -0
  137. package/dist/worker/serve.js +53 -0
  138. package/dist/worker/serve.js.map +1 -0
  139. package/dist/worker/worker.test.d.ts +2 -0
  140. package/dist/worker/worker.test.d.ts.map +1 -0
  141. package/dist/worker/worker.test.js +168 -0
  142. package/dist/worker/worker.test.js.map +1 -0
  143. package/package.json +68 -0
@@ -0,0 +1,205 @@
1
+ import type { VDTDocument } from 'postext';
2
+ /** The two values of the EPUB 3 `rendition:layout` property, as the
3
+ * industry names them: a fixed layout (`pre-paginated`, FXL) reproduces
4
+ * every printed page; a reflowable book (the EPUB default) reflows its text
5
+ * to the reader's screen and settings. */
6
+ export type EpubLayout = 'fixed' | 'reflowable';
7
+ /** Book metadata written to the package document. */
8
+ export interface EpubMetadata {
9
+ title: string;
10
+ subtitle?: string;
11
+ /** Authors, in order (`dc:creator`, role `aut`). */
12
+ creators?: string[];
13
+ /** BCP 47 tag of the book's language (`dc:language`, `xml:lang`). */
14
+ language: string;
15
+ /** Unique identifier: an ISBN (`urn:isbn:…` or bare digits), a URN or a
16
+ * URL. When absent, a stable `urn:uuid:` is derived from the title,
17
+ * creators and language, so regenerating a book keeps its identity. */
18
+ identifier?: string;
19
+ /** Publication date (`dc:date`), ISO 8601. */
20
+ date?: string;
21
+ publisher?: string;
22
+ rights?: string;
23
+ description?: string;
24
+ /** `dcterms:modified`; defaults to now (pass one for reproducible output). */
25
+ modified?: Date;
26
+ }
27
+ /** One font face the book embeds: every family its pages or styles use. */
28
+ export interface EpubFontFile {
29
+ family: string;
30
+ /** A weight (`400`) or a variable range (`'100 900'`). */
31
+ weight: number | string;
32
+ style: 'normal' | 'italic';
33
+ bytes: Uint8Array;
34
+ format: 'woff2' | 'woff' | 'ttf' | 'otf';
35
+ /** CSS `unicode-range` of a subset file (Google Fonts slices). */
36
+ unicodeRange?: string;
37
+ }
38
+ /** Bytes of a resource picture by its `fileId` (bitmap or SVG source), with
39
+ * its media type (`image/png`, `image/jpeg`, `image/webp`, `image/gif`,
40
+ * `image/svg+xml`). Undefined when the host has none. */
41
+ export type EpubResourceBytes = (fileId: string) => {
42
+ bytes: Uint8Array;
43
+ mediaType: string;
44
+ } | undefined | Promise<{
45
+ bytes: Uint8Array;
46
+ mediaType: string;
47
+ } | undefined>;
48
+ export interface EpubCover {
49
+ bytes: Uint8Array;
50
+ mediaType: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/svg+xml';
51
+ /** Text alternative of the cover picture; defaults to the title. */
52
+ alt?: string;
53
+ /** The picture shows the book's first printed page (a capture of it).
54
+ * The fixed layout then gives it no page of its own, which would show
55
+ * the cover twice: it is only the package's cover image (the reading
56
+ * system's thumbnail) and the first page is the cover document. The
57
+ * reflowable book, which has no printed pages, opens with it all the
58
+ * same. */
59
+ showsFirstPage?: boolean;
60
+ }
61
+ export interface EpubProgress {
62
+ /** `documents`: content documents being written (pages for the fixed
63
+ * layout, chapters when reflowable); `resources`: fonts and pictures;
64
+ * `package`: OPF, navigation and the zip. */
65
+ phase: 'documents' | 'resources' | 'package';
66
+ done: number;
67
+ total: number;
68
+ }
69
+ export type EpubWarning =
70
+ /** A picture the host gave no bytes for: set as a placeholder. */
71
+ {
72
+ kind: 'missingImage';
73
+ fileId: string;
74
+ resourceId?: string;
75
+ }
76
+ /** A family the documents use with no embedded face: readers fall back. */
77
+ | {
78
+ kind: 'missingFont';
79
+ family: string;
80
+ weight?: number | string;
81
+ style?: string;
82
+ }
83
+ /** Something the rendition could not express (named in `detail`). */
84
+ | {
85
+ kind: 'unsupported';
86
+ detail: string;
87
+ };
88
+ export interface RenderToEpubOptions {
89
+ layout: EpubLayout;
90
+ metadata: EpubMetadata;
91
+ fonts?: EpubFontFile[];
92
+ resourceBytes?: EpubResourceBytes;
93
+ /** The cover picture. Without one, the fixed layout uses the book's first
94
+ * page as its cover document and the reflowable book has no cover image. */
95
+ cover?: EpubCover;
96
+ onProgress?: (progress: EpubProgress) => void;
97
+ onWarning?: (warning: EpubWarning) => void;
98
+ signal?: AbortSignal;
99
+ }
100
+ /** The input both renditions read. */
101
+ export type EpubSource = readonly VDTDocument[];
102
+ export interface EpubItem {
103
+ /** Manifest id (an XML NCName). */
104
+ id: string;
105
+ href: string;
106
+ mediaType: string;
107
+ data: Uint8Array | string;
108
+ /** Manifest properties (`nav`, `cover-image`, `svg`, `mathml`,
109
+ * `remote-resources`…). */
110
+ properties?: string[];
111
+ }
112
+ export interface EpubSpineEntry {
113
+ idref: string;
114
+ linear?: boolean;
115
+ /** Spine itemref properties (`page-spread-left`, `page-spread-right`,
116
+ * `rendition:page-spread-center`, `rendition:layout-pre-paginated`…). */
117
+ properties?: string[];
118
+ }
119
+ export interface EpubNavPoint {
120
+ label: string;
121
+ href: string;
122
+ children?: EpubNavPoint[];
123
+ }
124
+ /** One printed page in the `page-list` navigation. */
125
+ export interface EpubPageTarget {
126
+ label: string;
127
+ href: string;
128
+ }
129
+ export interface EpubLandmark {
130
+ /** `epub:type` value: `cover`, `titlepage`, `toc`, `frontmatter`,
131
+ * `bodymatter`, `backmatter`, `index`, `bibliography`… */
132
+ type: string;
133
+ label: string;
134
+ href: string;
135
+ }
136
+ /** Accessibility metadata (EPUB Accessibility 1.1, schema.org terms). */
137
+ export interface EpubAccessibility {
138
+ accessModes: string[];
139
+ accessModesSufficient: string[];
140
+ features: string[];
141
+ hazards: string[];
142
+ summary: string;
143
+ /** `dcterms:conformsTo`, e.g. `EPUB Accessibility 1.1 - WCAG 2.2 Level AA`;
144
+ * omitted when the book makes no claim. */
145
+ conformsTo?: string;
146
+ }
147
+ export interface EpubPublication {
148
+ layout: EpubLayout;
149
+ metadata: EpubMetadata;
150
+ items: EpubItem[];
151
+ spine: EpubSpineEntry[];
152
+ toc: EpubNavPoint[];
153
+ pageList: EpubPageTarget[];
154
+ landmarks: EpubLandmark[];
155
+ pageProgression: 'ltr' | 'rtl';
156
+ /** Fixed-layout rendition properties. */
157
+ fixed?: {
158
+ spread: 'none' | 'landscape' | 'both' | 'auto';
159
+ orientation?: 'auto' | 'portrait' | 'landscape';
160
+ /** Page size in CSS px, for readers that look at it. */
161
+ viewport: {
162
+ width: number;
163
+ height: number;
164
+ };
165
+ };
166
+ accessibility: EpubAccessibility;
167
+ }
168
+ export interface ReadEpubResult {
169
+ layout: EpubLayout;
170
+ metadata: {
171
+ title: string;
172
+ language: string;
173
+ identifier: string;
174
+ creators: string[];
175
+ };
176
+ pageProgression: 'ltr' | 'rtl';
177
+ /** Every file by its zip path. */
178
+ files: Map<string, Uint8Array>;
179
+ /** Directory of the package document inside the zip (`OEBPS/`). */
180
+ root: string;
181
+ /** Manifest by id: zip path and media type. */
182
+ manifest: Map<string, {
183
+ path: string;
184
+ mediaType: string;
185
+ properties: string[];
186
+ }>;
187
+ /** Spine in reading order: zip path and itemref properties. */
188
+ spine: {
189
+ id: string;
190
+ path: string;
191
+ linear: boolean;
192
+ properties: string[];
193
+ }[];
194
+ /** Table of contents from the nav document (`path#fragment` targets). */
195
+ toc: EpubNavPoint[];
196
+ pageList: EpubPageTarget[];
197
+ /** Fixed layout page size (from the OPF/first page viewport). */
198
+ viewport?: {
199
+ width: number;
200
+ height: number;
201
+ };
202
+ /** Path of the cover picture, if any. */
203
+ coverPath?: string;
204
+ }
205
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,15 @@
1
+ // The public contract of postext-epub and the publication model shared by
2
+ // the two renditions and the package writer.
3
+ //
4
+ // renderToEpub(docs, options) public entry (index.ts)
5
+ // ├─ buildFixedPublication(...) fixed/ one XHTML per printed page
6
+ // ├─ buildReflowablePublication(...) reflowable/ one XHTML per chapter
7
+ // └─ packEpub(publication) package/ OCF zip, OPF, nav, NCX
8
+ // readEpub(bytes) package/ what a viewer needs
9
+ //
10
+ // Both renditions read the same input: the book's laid-out print documents,
11
+ // one VDTDocument per chapter in book order (the chain the PDF backend
12
+ // renders), so numbering, footnotes, citations, cross-references, the TOC and
13
+ // the index arrive resolved.
14
+ export {};
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6CAA6C;AAC7C,EAAE;AACF,iEAAiE;AACjE,gFAAgF;AAChF,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,uEAAuE;AACvE,8EAA8E;AAC9E,6BAA6B"}
@@ -0,0 +1,39 @@
1
+ import type { EpubResourceBytes, EpubSource, RenderToEpubOptions } from '../types';
2
+ import type { EpubResourcePayload } from './protocol';
3
+ export type { EpubResourcePayload } from './protocol';
4
+ export type { EpubProgress, EpubWarning, EpubLayout, EpubMetadata, EpubFontFile, EpubCover } from '../types';
5
+ export interface EpubWorkerRenderOptions extends Omit<RenderToEpubOptions, 'resourceBytes'> {
6
+ /** Picture bytes: a map by `fileId`, or the provider `renderToEpub`
7
+ * takes, asked on this thread for every picture the pages place before
8
+ * the worker starts (the worker cannot reach the host's stores). */
9
+ resourceBytes?: EpubResourceBytes | ReadonlyMap<string, EpubResourcePayload>;
10
+ }
11
+ export interface EpubWorkerHandle {
12
+ /** Write the book on the worker. The buffers of the fonts, the pictures
13
+ * and the cover are transferred, not copied: the caller's views of them
14
+ * are empty afterwards, so pass copies of bytes it keeps. Aborting the
15
+ * signal rejects at once with an `AbortError` and stops the worker. */
16
+ render(docs: EpubSource, options: EpubWorkerRenderOptions): Promise<Uint8Array>;
17
+ dispose(): void;
18
+ }
19
+ export interface CreateEpubWorkerOptions {
20
+ /** A worker of the caller's own (build tooling that controls the worker
21
+ * URL), or a function that makes one. With a function, an aborted render
22
+ * ends the worker at once and the next render starts a fresh one; a
23
+ * given worker is only asked to stop. */
24
+ worker?: Worker | (() => Worker);
25
+ }
26
+ /** A failure of the worker itself (it could not load or it crashed), as
27
+ * opposed to an error of the render: the caller may write the book on
28
+ * its own thread instead. */
29
+ export declare class EpubWorkerError extends Error {
30
+ name: string;
31
+ }
32
+ /** The pictures' bytes as the worker receives them: every `fileId` the
33
+ * pages place, asked of the provider once (a map is taken as it is). */
34
+ export declare function gatherResourceBytes(docs: EpubSource, source: EpubWorkerRenderOptions['resourceBytes']): Promise<[string, EpubResourcePayload][]>;
35
+ /** The buffers to transfer with a request: those of the fonts, the
36
+ * pictures and the cover, each once. */
37
+ export declare function transferablesOf(options: Pick<EpubWorkerRenderOptions, 'fonts' | 'cover'>, resources: readonly [string, EpubResourcePayload][]): ArrayBuffer[];
38
+ export declare function createEpubWorker(options?: CreateEpubWorkerOptions): EpubWorkerHandle;
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,KAAK,EAAsB,mBAAmB,EAAuB,MAAM,YAAY,CAAC;AAE/F,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE7G,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC;IACzF;;yEAEqE;IACrE,aAAa,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;4EAGwE;IACxE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;8CAG0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;CAClC;AAED;;8BAE8B;AAC9B,qBAAa,eAAgB,SAAQ,KAAK;IAC/B,IAAI,SAAqB;CACnC;AAYD;yEACyE;AACzE,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAC/C,OAAO,CAAC,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAM1C;AAED;yCACyC;AACzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,GAAG,WAAW,EAAE,CAS7J;AAID,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAqIpF"}
@@ -0,0 +1,184 @@
1
+ // Write EPUB files on a worker: `createEpubWorker().render(docs, options)`
2
+ // takes what `renderToEpub` takes and returns the same bytes, with the
3
+ // page itself left free while the book is written.
4
+ import { placedFileIds } from '../shared/assets';
5
+ /** A failure of the worker itself (it could not load or it crashed), as
6
+ * opposed to an error of the render: the caller may write the book on
7
+ * its own thread instead. */
8
+ export class EpubWorkerError extends Error {
9
+ name = 'EpubWorkerError';
10
+ }
11
+ const abortError = (signal) => signal?.reason ?? new DOMException('The EPUB render was aborted', 'AbortError');
12
+ /** The pictures' bytes as the worker receives them: every `fileId` the
13
+ * pages place, asked of the provider once (a map is taken as it is). */
14
+ export async function gatherResourceBytes(docs, source) {
15
+ if (!source)
16
+ return [];
17
+ if (typeof source !== 'function')
18
+ return [...source];
19
+ const fileIds = [...new Set(docs.flatMap(placedFileIds))];
20
+ const found = await Promise.all(fileIds.map(async (fileId) => [fileId, await source(fileId)]));
21
+ return found.filter((entry) => entry[1] !== undefined);
22
+ }
23
+ /** The buffers to transfer with a request: those of the fonts, the
24
+ * pictures and the cover, each once. */
25
+ export function transferablesOf(options, resources) {
26
+ const buffers = new Set();
27
+ const add = (bytes) => {
28
+ if (bytes && bytes.buffer instanceof ArrayBuffer && bytes.buffer.byteLength > 0)
29
+ buffers.add(bytes.buffer);
30
+ };
31
+ for (const font of options.fonts ?? [])
32
+ add(font.bytes);
33
+ for (const [, payload] of resources)
34
+ add(payload.bytes);
35
+ add(options.cover?.bytes);
36
+ return [...buffers];
37
+ }
38
+ const defaultWorker = () => new Worker(new URL('./epub.worker.js', import.meta.url), { type: 'module' });
39
+ export function createEpubWorker(options) {
40
+ const given = options?.worker;
41
+ const make = typeof given === 'function' ? given : given ? null : defaultWorker;
42
+ let worker = null;
43
+ let nextId = 1;
44
+ let disposed = false;
45
+ const pending = new Map();
46
+ const settle = (id) => {
47
+ const entry = pending.get(id);
48
+ pending.delete(id);
49
+ return entry;
50
+ };
51
+ const listen = (w) => {
52
+ w.addEventListener('message', (event) => {
53
+ const msg = event.data;
54
+ switch (msg.kind) {
55
+ case 'progress':
56
+ pending.get(msg.id)?.options.onProgress?.(msg.progress);
57
+ return;
58
+ case 'warning':
59
+ pending.get(msg.id)?.options.onWarning?.(msg.warning);
60
+ return;
61
+ case 'rendered':
62
+ settle(msg.id)?.resolve(msg.bytes);
63
+ return;
64
+ case 'error': {
65
+ const entry = settle(msg.id);
66
+ if (!entry)
67
+ return;
68
+ if (msg.aborted)
69
+ entry.reject(abortError(entry.options.signal));
70
+ else
71
+ entry.reject(Object.assign(new Error(msg.message), msg.stack ? { stack: msg.stack } : {}));
72
+ return;
73
+ }
74
+ }
75
+ });
76
+ w.addEventListener('error', (event) => {
77
+ // A script that fails to load or throws at the top level.
78
+ event.preventDefault();
79
+ fail(w, new EpubWorkerError(event.message || 'EPUB worker error'));
80
+ });
81
+ w.addEventListener('messageerror', () => fail(w, new EpubWorkerError('EPUB worker could not read a message')));
82
+ };
83
+ /** Reject every render on `w` and let the next render start afresh. */
84
+ const fail = (w, err) => {
85
+ for (const [id, entry] of pending) {
86
+ if (entry.worker !== w)
87
+ continue;
88
+ pending.delete(id);
89
+ entry.reject(err);
90
+ }
91
+ if (worker === w && make) {
92
+ w.terminate();
93
+ worker = null;
94
+ }
95
+ };
96
+ const current = () => {
97
+ if (disposed)
98
+ throw new Error('EPUB worker has been disposed');
99
+ if (!worker) {
100
+ try {
101
+ worker = make();
102
+ }
103
+ catch (err) {
104
+ // No module workers here, or a policy forbids the script.
105
+ throw new EpubWorkerError(err instanceof Error ? err.message : String(err));
106
+ }
107
+ listen(worker);
108
+ }
109
+ return worker;
110
+ };
111
+ if (typeof given === 'object') {
112
+ worker = given;
113
+ listen(given);
114
+ }
115
+ return {
116
+ async render(input, renderOptions) {
117
+ const docs = [...input];
118
+ const { signal } = renderOptions;
119
+ signal?.throwIfAborted();
120
+ const resourceBytes = await gatherResourceBytes(docs, renderOptions.resourceBytes);
121
+ signal?.throwIfAborted();
122
+ const w = current();
123
+ const id = nextId++;
124
+ return new Promise((resolve, reject) => {
125
+ const entry = { resolve, reject, options: renderOptions, worker: w };
126
+ pending.set(id, entry);
127
+ const onAbort = () => {
128
+ if (!pending.has(id))
129
+ return;
130
+ pending.delete(id);
131
+ reject(abortError(signal));
132
+ try {
133
+ w.postMessage({ kind: 'cancel', id });
134
+ }
135
+ catch { /* ended */ }
136
+ // The writer checks its signal between steps, which a long
137
+ // synchronous stretch delays: a worker of our own is ended now,
138
+ // unless another render is using it.
139
+ if (make && worker === w && ![...pending.values()].some((p) => p.worker === w)) {
140
+ w.terminate();
141
+ worker = null;
142
+ }
143
+ };
144
+ signal?.addEventListener('abort', onAbort, { once: true });
145
+ const done = () => signal?.removeEventListener('abort', onAbort);
146
+ entry.resolve = (bytes) => { done(); resolve(bytes); };
147
+ entry.reject = (err) => { done(); reject(err); };
148
+ const { layout, metadata, fonts, cover } = renderOptions;
149
+ const message = {
150
+ kind: 'render',
151
+ id,
152
+ docs,
153
+ settings: { layout, metadata, ...(fonts ? { fonts } : {}), ...(cover ? { cover } : {}) },
154
+ resourceBytes,
155
+ };
156
+ try {
157
+ w.postMessage(message, transferablesOf(renderOptions, resourceBytes));
158
+ }
159
+ catch (err) {
160
+ pending.delete(id);
161
+ entry.reject(err);
162
+ }
163
+ });
164
+ },
165
+ dispose() {
166
+ if (disposed)
167
+ return;
168
+ disposed = true;
169
+ const w = worker;
170
+ worker = null;
171
+ if (w) {
172
+ try {
173
+ w.postMessage({ kind: 'dispose' });
174
+ }
175
+ catch { /* ended */ }
176
+ w.terminate();
177
+ }
178
+ for (const entry of pending.values())
179
+ entry.reject(new DOMException('Worker disposed', 'AbortError'));
180
+ pending.clear();
181
+ },
182
+ };
183
+ }
184
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=epub.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epub.worker.d.ts","sourceRoot":"","sources":["../../src/worker/epub.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /// <reference lib="webworker" />
2
+ // The worker entry of `createEpubWorker` (`postext-epub/worker/entry`).
3
+ // Bundlers that resolve `new Worker(new URL(…, import.meta.url))` pick it up
4
+ // from the client; hosts that build their own worker import this module.
5
+ import { serveEpubRequests } from './serve';
6
+ serveEpubRequests(self);
7
+ //# sourceMappingURL=epub.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epub.worker.js","sourceRoot":"","sources":["../../src/worker/epub.worker.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,wEAAwE;AACxE,6EAA6E;AAC7E,yEAAyE;AAEzE,OAAO,EAAE,iBAAiB,EAAuB,MAAM,SAAS,CAAC;AAEjE,iBAAiB,CAAC,IAAiC,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { VDTDocument } from 'postext';
2
+ import type { EpubProgress, EpubWarning, RenderToEpubOptions } from '../types';
3
+ /** A picture's bytes and media type, as `EpubResourceBytes` answers. */
4
+ export interface EpubResourcePayload {
5
+ bytes: Uint8Array;
6
+ mediaType: string;
7
+ }
8
+ /** The render options that travel to the worker as data. */
9
+ export type EpubRenderSettings = Pick<RenderToEpubOptions, 'layout' | 'metadata' | 'fonts' | 'cover'>;
10
+ export type EpubRequestMessage = {
11
+ kind: 'render';
12
+ id: number;
13
+ docs: VDTDocument[];
14
+ settings: EpubRenderSettings;
15
+ /** Picture bytes by file id, gathered by the host beforehand. */
16
+ resourceBytes: [string, EpubResourcePayload][];
17
+ }
18
+ /** Stop the render `id`: the writer throws at its next check. */
19
+ | {
20
+ kind: 'cancel';
21
+ id: number;
22
+ } | {
23
+ kind: 'dispose';
24
+ };
25
+ export type EpubResponseMessage = {
26
+ kind: 'progress';
27
+ id: number;
28
+ progress: EpubProgress;
29
+ } | {
30
+ kind: 'warning';
31
+ id: number;
32
+ warning: EpubWarning;
33
+ } | {
34
+ kind: 'rendered';
35
+ id: number;
36
+ bytes: Uint8Array;
37
+ } | {
38
+ kind: 'error';
39
+ id: number;
40
+ message: string;
41
+ stack?: string;
42
+ aborted?: boolean;
43
+ };
44
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/E,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;AAEtG,MAAM,MAAM,kBAAkB,GAC1B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,iEAAiE;IACjE,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC;CAChD;AACH,iEAAiE;GAC/D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Messages between `createEpubWorker` (client.ts) and the worker
2
+ // (epub.worker.ts, serve.ts). Everything travels as data: the documents are
3
+ // cloned, the bytes of fonts, pictures and the cover are transferred, and
4
+ // the finished file comes back transferred.
5
+ export {};
6
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,4EAA4E;AAC5E,0EAA0E;AAC1E,4CAA4C"}
@@ -0,0 +1,11 @@
1
+ import type { EpubRequestMessage, EpubResponseMessage } from './protocol';
2
+ /** What the worker needs of its scope. */
3
+ export interface EpubWorkerPort {
4
+ postMessage(message: EpubResponseMessage, transfer: Transferable[]): void;
5
+ addEventListener(type: 'message', listener: (event: MessageEvent<EpubRequestMessage>) => void): void;
6
+ close(): void;
7
+ }
8
+ /** Write the books asked for on `port`, one `renderToEpub` per request,
9
+ * with progress and warnings posted as they happen. */
10
+ export declare function serveEpubRequests(port: EpubWorkerPort): void;
11
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/worker/serve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC1E,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,kBAAkB,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACrG,KAAK,IAAI,IAAI,CAAC;CACf;AAED;wDACwD;AACxD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CA4C5D"}
@@ -0,0 +1,53 @@
1
+ // The worker side of `createEpubWorker`: answers render requests on a
2
+ // message port (the worker's global scope, or a MessagePort in tests).
3
+ import { renderToEpub } from '../index';
4
+ /** Write the books asked for on `port`, one `renderToEpub` per request,
5
+ * with progress and warnings posted as they happen. */
6
+ export function serveEpubRequests(port) {
7
+ const running = new Map();
8
+ const post = (msg, transfer = []) => port.postMessage(msg, transfer);
9
+ port.addEventListener('message', async (event) => {
10
+ const msg = event.data;
11
+ switch (msg.kind) {
12
+ case 'render': {
13
+ const controller = new AbortController();
14
+ running.set(msg.id, controller);
15
+ const bytesById = new Map(msg.resourceBytes);
16
+ try {
17
+ const bytes = await renderToEpub(msg.docs, {
18
+ ...msg.settings,
19
+ resourceBytes: (fileId) => bytesById.get(fileId),
20
+ onProgress: (progress) => post({ kind: 'progress', id: msg.id, progress }),
21
+ onWarning: (warning) => post({ kind: 'warning', id: msg.id, warning }),
22
+ signal: controller.signal,
23
+ });
24
+ post({ kind: 'rendered', id: msg.id, bytes }, [bytes.buffer]);
25
+ }
26
+ catch (err) {
27
+ post({
28
+ kind: 'error',
29
+ id: msg.id,
30
+ message: err instanceof Error ? err.message : String(err),
31
+ ...(err instanceof Error && err.stack ? { stack: err.stack } : {}),
32
+ ...(controller.signal.aborted ? { aborted: true } : {}),
33
+ });
34
+ }
35
+ finally {
36
+ running.delete(msg.id);
37
+ }
38
+ return;
39
+ }
40
+ case 'cancel': {
41
+ running.get(msg.id)?.abort();
42
+ return;
43
+ }
44
+ case 'dispose': {
45
+ for (const controller of running.values())
46
+ controller.abort();
47
+ port.close();
48
+ return;
49
+ }
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/worker/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.test.d.ts","sourceRoot":"","sources":["../../src/worker/worker.test.ts"],"names":[],"mappings":""}