@lexmata/micropdf 0.4.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 (170) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +985 -0
  3. package/binding.gyp +73 -0
  4. package/dist/annot.d.ts +458 -0
  5. package/dist/annot.d.ts.map +1 -0
  6. package/dist/annot.js +697 -0
  7. package/dist/annot.js.map +1 -0
  8. package/dist/archive.d.ts +128 -0
  9. package/dist/archive.d.ts.map +1 -0
  10. package/dist/archive.js +268 -0
  11. package/dist/archive.js.map +1 -0
  12. package/dist/buffer.d.ts +572 -0
  13. package/dist/buffer.d.ts.map +1 -0
  14. package/dist/buffer.js +971 -0
  15. package/dist/buffer.js.map +1 -0
  16. package/dist/colorspace.d.ts +287 -0
  17. package/dist/colorspace.d.ts.map +1 -0
  18. package/dist/colorspace.js +542 -0
  19. package/dist/colorspace.js.map +1 -0
  20. package/dist/context.d.ts +184 -0
  21. package/dist/context.d.ts.map +1 -0
  22. package/dist/context.js +320 -0
  23. package/dist/context.js.map +1 -0
  24. package/dist/cookie.d.ts +164 -0
  25. package/dist/cookie.d.ts.map +1 -0
  26. package/dist/cookie.js +306 -0
  27. package/dist/cookie.js.map +1 -0
  28. package/dist/device.d.ts +169 -0
  29. package/dist/device.d.ts.map +1 -0
  30. package/dist/device.js +350 -0
  31. package/dist/device.js.map +1 -0
  32. package/dist/display-list.d.ts +202 -0
  33. package/dist/display-list.d.ts.map +1 -0
  34. package/dist/display-list.js +410 -0
  35. package/dist/display-list.js.map +1 -0
  36. package/dist/document.d.ts +637 -0
  37. package/dist/document.d.ts.map +1 -0
  38. package/dist/document.js +902 -0
  39. package/dist/document.js.map +1 -0
  40. package/dist/easy.d.ts +423 -0
  41. package/dist/easy.d.ts.map +1 -0
  42. package/dist/easy.js +644 -0
  43. package/dist/easy.js.map +1 -0
  44. package/dist/enhanced.d.ts +226 -0
  45. package/dist/enhanced.d.ts.map +1 -0
  46. package/dist/enhanced.js +368 -0
  47. package/dist/enhanced.js.map +1 -0
  48. package/dist/filter.d.ts +51 -0
  49. package/dist/filter.d.ts.map +1 -0
  50. package/dist/filter.js +381 -0
  51. package/dist/filter.js.map +1 -0
  52. package/dist/font.d.ts +222 -0
  53. package/dist/font.d.ts.map +1 -0
  54. package/dist/font.js +381 -0
  55. package/dist/font.js.map +1 -0
  56. package/dist/form.d.ts +214 -0
  57. package/dist/form.d.ts.map +1 -0
  58. package/dist/form.js +497 -0
  59. package/dist/form.js.map +1 -0
  60. package/dist/geometry.d.ts +469 -0
  61. package/dist/geometry.d.ts.map +1 -0
  62. package/dist/geometry.js +780 -0
  63. package/dist/geometry.js.map +1 -0
  64. package/dist/image.d.ts +172 -0
  65. package/dist/image.d.ts.map +1 -0
  66. package/dist/image.js +348 -0
  67. package/dist/image.js.map +1 -0
  68. package/dist/index.d.ts +171 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +339 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/link.d.ts +168 -0
  73. package/dist/link.d.ts.map +1 -0
  74. package/dist/link.js +343 -0
  75. package/dist/link.js.map +1 -0
  76. package/dist/micropdf.d.ts +40 -0
  77. package/dist/micropdf.d.ts.map +1 -0
  78. package/dist/micropdf.js +45 -0
  79. package/dist/micropdf.js.map +1 -0
  80. package/dist/nanopdf.d.ts +40 -0
  81. package/dist/nanopdf.d.ts.map +1 -0
  82. package/dist/nanopdf.js +45 -0
  83. package/dist/nanopdf.js.map +1 -0
  84. package/dist/native.d.ts +242 -0
  85. package/dist/native.d.ts.map +1 -0
  86. package/dist/native.js +509 -0
  87. package/dist/native.js.map +1 -0
  88. package/dist/output.d.ts +166 -0
  89. package/dist/output.d.ts.map +1 -0
  90. package/dist/output.js +365 -0
  91. package/dist/output.js.map +1 -0
  92. package/dist/path.d.ts +420 -0
  93. package/dist/path.d.ts.map +1 -0
  94. package/dist/path.js +687 -0
  95. package/dist/path.js.map +1 -0
  96. package/dist/pdf/object.d.ts +489 -0
  97. package/dist/pdf/object.d.ts.map +1 -0
  98. package/dist/pdf/object.js +1045 -0
  99. package/dist/pdf/object.js.map +1 -0
  100. package/dist/pixmap.d.ts +315 -0
  101. package/dist/pixmap.d.ts.map +1 -0
  102. package/dist/pixmap.js +590 -0
  103. package/dist/pixmap.js.map +1 -0
  104. package/dist/profiler.d.ts +159 -0
  105. package/dist/profiler.d.ts.map +1 -0
  106. package/dist/profiler.js +380 -0
  107. package/dist/profiler.js.map +1 -0
  108. package/dist/render-options.d.ts +227 -0
  109. package/dist/render-options.d.ts.map +1 -0
  110. package/dist/render-options.js +130 -0
  111. package/dist/render-options.js.map +1 -0
  112. package/dist/resource-tracking.d.ts +332 -0
  113. package/dist/resource-tracking.d.ts.map +1 -0
  114. package/dist/resource-tracking.js +653 -0
  115. package/dist/resource-tracking.js.map +1 -0
  116. package/dist/simple.d.ts +276 -0
  117. package/dist/simple.d.ts.map +1 -0
  118. package/dist/simple.js +343 -0
  119. package/dist/simple.js.map +1 -0
  120. package/dist/stext.d.ts +290 -0
  121. package/dist/stext.d.ts.map +1 -0
  122. package/dist/stext.js +312 -0
  123. package/dist/stext.js.map +1 -0
  124. package/dist/stream.d.ts +174 -0
  125. package/dist/stream.d.ts.map +1 -0
  126. package/dist/stream.js +476 -0
  127. package/dist/stream.js.map +1 -0
  128. package/dist/text.d.ts +337 -0
  129. package/dist/text.d.ts.map +1 -0
  130. package/dist/text.js +454 -0
  131. package/dist/text.js.map +1 -0
  132. package/dist/typed-arrays.d.ts +127 -0
  133. package/dist/typed-arrays.d.ts.map +1 -0
  134. package/dist/typed-arrays.js +410 -0
  135. package/dist/typed-arrays.js.map +1 -0
  136. package/dist/types.d.ts +358 -0
  137. package/dist/types.d.ts.map +1 -0
  138. package/dist/types.js +216 -0
  139. package/dist/types.js.map +1 -0
  140. package/native/annot.cc +557 -0
  141. package/native/buffer.cc +204 -0
  142. package/native/colorspace.cc +166 -0
  143. package/native/context.cc +84 -0
  144. package/native/cookie.cc +179 -0
  145. package/native/device.cc +179 -0
  146. package/native/display_list.cc +179 -0
  147. package/native/document.cc +268 -0
  148. package/native/enhanced.cc +70 -0
  149. package/native/font.cc +282 -0
  150. package/native/form.cc +523 -0
  151. package/native/geometry.cc +255 -0
  152. package/native/image.cc +216 -0
  153. package/native/include/micropdf/enhanced.h +38 -0
  154. package/native/include/micropdf/types.h +36 -0
  155. package/native/include/micropdf.h +106 -0
  156. package/native/include/mupdf-ffi.h +39 -0
  157. package/native/include/mupdf.h +11 -0
  158. package/native/include/mupdf_minimal.h +381 -0
  159. package/native/lib/linux-x64/libmicropdf.a +0 -0
  160. package/native/link.cc +234 -0
  161. package/native/micropdf.cc +71 -0
  162. package/native/output.cc +229 -0
  163. package/native/page.cc +572 -0
  164. package/native/path.cc +259 -0
  165. package/native/pixmap.cc +240 -0
  166. package/native/stext.cc +610 -0
  167. package/native/stream.cc +239 -0
  168. package/package.json +120 -0
  169. package/scripts/build-from-rust.js +97 -0
  170. package/scripts/install.js +184 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Advanced Rendering Options
3
+ *
4
+ * Provides fine-grained control over PDF rendering quality, colorspace,
5
+ * and performance characteristics.
6
+ */
7
+ import type { Colorspace } from './colorspace.js';
8
+ import type { Matrix } from './geometry.js';
9
+ /**
10
+ * Anti-aliasing level
11
+ *
12
+ * Controls the quality of anti-aliasing applied during rendering.
13
+ * Higher levels produce smoother output but are slower.
14
+ */
15
+ export declare enum AntiAliasLevel {
16
+ /** No anti-aliasing - fastest, lowest quality */
17
+ None = 0,
18
+ /** Low anti-aliasing - 2x2 sampling */
19
+ Low = 2,
20
+ /** Medium anti-aliasing - 4x4 sampling */
21
+ Medium = 4,
22
+ /** High anti-aliasing - 8x8 sampling - best quality, slowest */
23
+ High = 8
24
+ }
25
+ /**
26
+ * Rendering options
27
+ *
28
+ * Configures how a PDF page is rendered to a pixmap.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const options: RenderOptions = {
33
+ * dpi: 300,
34
+ * colorspace: Colorspace.deviceRGB(),
35
+ * alpha: true,
36
+ * antiAlias: AntiAliasLevel.High
37
+ * };
38
+ *
39
+ * const pixmap = page.renderWithOptions(options);
40
+ * ```
41
+ */
42
+ export interface RenderOptions {
43
+ /**
44
+ * Resolution in dots per inch
45
+ *
46
+ * Common values:
47
+ * - 72: Screen resolution (1:1)
48
+ * - 150: Low-quality print
49
+ * - 300: Standard print quality
50
+ * - 600: High-quality print
51
+ *
52
+ * @default 72
53
+ */
54
+ dpi?: number;
55
+ /**
56
+ * Target colorspace
57
+ *
58
+ * Determines the color model of the output pixmap.
59
+ *
60
+ * @default Colorspace.deviceRGB()
61
+ */
62
+ colorspace?: Colorspace;
63
+ /**
64
+ * Include alpha channel
65
+ *
66
+ * If true, the output pixmap will have an alpha (transparency) channel.
67
+ *
68
+ * @default false
69
+ */
70
+ alpha?: boolean;
71
+ /**
72
+ * Anti-aliasing level
73
+ *
74
+ * Controls the quality of anti-aliasing applied during rendering.
75
+ *
76
+ * @default AntiAliasLevel.High
77
+ */
78
+ antiAlias?: AntiAliasLevel;
79
+ /**
80
+ * Transformation matrix
81
+ *
82
+ * Optional matrix to transform the page before rendering.
83
+ * If provided, DPI is ignored.
84
+ */
85
+ transform?: Matrix;
86
+ /**
87
+ * Render annotations
88
+ *
89
+ * If true, annotations will be rendered on the page.
90
+ *
91
+ * @default true
92
+ */
93
+ renderAnnotations?: boolean;
94
+ /**
95
+ * Render form fields
96
+ *
97
+ * If true, form fields will be rendered on the page.
98
+ *
99
+ * @default true
100
+ */
101
+ renderFormFields?: boolean;
102
+ }
103
+ /**
104
+ * Render progress callback
105
+ *
106
+ * Called periodically during rendering to report progress.
107
+ *
108
+ * @param current - Current progress value
109
+ * @param total - Total progress value
110
+ * @returns true to continue rendering, false to abort
111
+ */
112
+ export type RenderProgressCallback = (current: number, total: number) => boolean;
113
+ /**
114
+ * Render error callback
115
+ *
116
+ * Called when an error occurs during rendering.
117
+ *
118
+ * @param error - Error message
119
+ */
120
+ export type RenderErrorCallback = (error: string) => void;
121
+ /**
122
+ * Extended rendering options with progress tracking
123
+ *
124
+ * Adds progress and error callbacks for long-running render operations.
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * const options: ExtendedRenderOptions = {
129
+ * dpi: 300,
130
+ * alpha: true,
131
+ * onProgress: (current, total) => {
132
+ * console.log(`Rendering: ${current}/${total}`);
133
+ * return true; // Continue
134
+ * },
135
+ * onError: (error) => {
136
+ * console.error('Render error:', error);
137
+ * }
138
+ * };
139
+ * ```
140
+ */
141
+ export interface ExtendedRenderOptions extends RenderOptions {
142
+ /**
143
+ * Progress callback
144
+ *
145
+ * Called periodically during rendering to report progress.
146
+ * Return false to abort rendering.
147
+ */
148
+ onProgress?: RenderProgressCallback;
149
+ /**
150
+ * Error callback
151
+ *
152
+ * Called when an error occurs during rendering.
153
+ */
154
+ onError?: RenderErrorCallback;
155
+ /**
156
+ * Timeout in milliseconds
157
+ *
158
+ * If rendering takes longer than this, it will be aborted.
159
+ *
160
+ * @default undefined (no timeout)
161
+ */
162
+ timeout?: number;
163
+ }
164
+ /**
165
+ * Get default render options
166
+ *
167
+ * @returns Default rendering options
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const defaults = getDefaultRenderOptions();
172
+ * const custom = { ...defaults, dpi: 300 };
173
+ * ```
174
+ */
175
+ export declare function getDefaultRenderOptions(): RenderOptions;
176
+ /**
177
+ * Calculate scale matrix from DPI
178
+ *
179
+ * @param dpi - Target resolution in dots per inch
180
+ * @returns Scale factor
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * const scale = dpiToScale(300); // 4.166... (300/72)
185
+ * ```
186
+ */
187
+ export declare function dpiToScale(dpi: number): number;
188
+ /**
189
+ * Calculate DPI from scale matrix
190
+ *
191
+ * @param scale - Scale factor
192
+ * @returns Resolution in dots per inch
193
+ *
194
+ * @example
195
+ * ```typescript
196
+ * const dpi = scaleToDpi(2.0); // 144 (72 * 2)
197
+ * ```
198
+ */
199
+ export declare function scaleToDpi(scale: number): number;
200
+ /**
201
+ * Validate render options
202
+ *
203
+ * Checks that all options are within valid ranges.
204
+ *
205
+ * @param options - Options to validate
206
+ * @throws Error if options are invalid
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * validateRenderOptions({ dpi: 300, alpha: true });
211
+ * ```
212
+ */
213
+ export declare function validateRenderOptions(options: RenderOptions): void;
214
+ /**
215
+ * Merge render options with defaults
216
+ *
217
+ * @param options - User-provided options
218
+ * @returns Complete options with defaults filled in
219
+ *
220
+ * @example
221
+ * ```typescript
222
+ * const options = mergeRenderOptions({ dpi: 300 });
223
+ * // { dpi: 300, alpha: false, antiAlias: 8, ... }
224
+ * ```
225
+ */
226
+ export declare function mergeRenderOptions(options: RenderOptions): Required<RenderOptions>;
227
+ //# sourceMappingURL=render-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-options.d.ts","sourceRoot":"","sources":["../src/render-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;GAKG;AACH,oBAAY,cAAc;IACxB,iDAAiD;IACjD,IAAI,IAAI;IACR,uCAAuC;IACvC,GAAG,IAAI;IACP,0CAA0C;IAC1C,MAAM,IAAI;IACV,gEAAgE;IAChE,IAAI,IAAI;CACT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;OAUG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAEpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAQvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAqBlE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAWlF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Advanced Rendering Options
3
+ *
4
+ * Provides fine-grained control over PDF rendering quality, colorspace,
5
+ * and performance characteristics.
6
+ */
7
+ /**
8
+ * Anti-aliasing level
9
+ *
10
+ * Controls the quality of anti-aliasing applied during rendering.
11
+ * Higher levels produce smoother output but are slower.
12
+ */
13
+ export var AntiAliasLevel;
14
+ (function (AntiAliasLevel) {
15
+ /** No anti-aliasing - fastest, lowest quality */
16
+ AntiAliasLevel[AntiAliasLevel["None"] = 0] = "None";
17
+ /** Low anti-aliasing - 2x2 sampling */
18
+ AntiAliasLevel[AntiAliasLevel["Low"] = 2] = "Low";
19
+ /** Medium anti-aliasing - 4x4 sampling */
20
+ AntiAliasLevel[AntiAliasLevel["Medium"] = 4] = "Medium";
21
+ /** High anti-aliasing - 8x8 sampling - best quality, slowest */
22
+ AntiAliasLevel[AntiAliasLevel["High"] = 8] = "High";
23
+ })(AntiAliasLevel || (AntiAliasLevel = {}));
24
+ /**
25
+ * Get default render options
26
+ *
27
+ * @returns Default rendering options
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const defaults = getDefaultRenderOptions();
32
+ * const custom = { ...defaults, dpi: 300 };
33
+ * ```
34
+ */
35
+ export function getDefaultRenderOptions() {
36
+ return {
37
+ dpi: 72,
38
+ alpha: false,
39
+ antiAlias: AntiAliasLevel.High,
40
+ renderAnnotations: true,
41
+ renderFormFields: true
42
+ };
43
+ }
44
+ /**
45
+ * Calculate scale matrix from DPI
46
+ *
47
+ * @param dpi - Target resolution in dots per inch
48
+ * @returns Scale factor
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const scale = dpiToScale(300); // 4.166... (300/72)
53
+ * ```
54
+ */
55
+ export function dpiToScale(dpi) {
56
+ return dpi / 72.0;
57
+ }
58
+ /**
59
+ * Calculate DPI from scale matrix
60
+ *
61
+ * @param scale - Scale factor
62
+ * @returns Resolution in dots per inch
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const dpi = scaleToDpi(2.0); // 144 (72 * 2)
67
+ * ```
68
+ */
69
+ export function scaleToDpi(scale) {
70
+ return scale * 72.0;
71
+ }
72
+ /**
73
+ * Validate render options
74
+ *
75
+ * Checks that all options are within valid ranges.
76
+ *
77
+ * @param options - Options to validate
78
+ * @throws Error if options are invalid
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * validateRenderOptions({ dpi: 300, alpha: true });
83
+ * ```
84
+ */
85
+ export function validateRenderOptions(options) {
86
+ if (options.dpi !== undefined) {
87
+ if (options.dpi <= 0) {
88
+ throw new Error('DPI must be positive');
89
+ }
90
+ if (options.dpi > 2400) {
91
+ throw new Error('DPI too high (max 2400)');
92
+ }
93
+ }
94
+ if (options.antiAlias !== undefined) {
95
+ const validLevels = [
96
+ AntiAliasLevel.None,
97
+ AntiAliasLevel.Low,
98
+ AntiAliasLevel.Medium,
99
+ AntiAliasLevel.High
100
+ ];
101
+ if (!validLevels.includes(options.antiAlias)) {
102
+ throw new Error(`Invalid anti-alias level: ${options.antiAlias}`);
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Merge render options with defaults
108
+ *
109
+ * @param options - User-provided options
110
+ * @returns Complete options with defaults filled in
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const options = mergeRenderOptions({ dpi: 300 });
115
+ * // { dpi: 300, alpha: false, antiAlias: 8, ... }
116
+ * ```
117
+ */
118
+ export function mergeRenderOptions(options) {
119
+ const defaults = getDefaultRenderOptions();
120
+ return {
121
+ dpi: options.dpi ?? defaults.dpi,
122
+ colorspace: options.colorspace ?? defaults.colorspace,
123
+ alpha: options.alpha ?? defaults.alpha,
124
+ antiAlias: options.antiAlias ?? defaults.antiAlias,
125
+ transform: options.transform ?? defaults.transform,
126
+ renderAnnotations: options.renderAnnotations ?? defaults.renderAnnotations,
127
+ renderFormFields: options.renderFormFields ?? defaults.renderFormFields
128
+ };
129
+ }
130
+ //# sourceMappingURL=render-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-options.js","sourceRoot":"","sources":["../src/render-options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;GAKG;AACH,MAAM,CAAN,IAAY,cASX;AATD,WAAY,cAAc;IACxB,iDAAiD;IACjD,mDAAQ,CAAA;IACR,uCAAuC;IACvC,iDAAO,CAAA;IACP,0CAA0C;IAC1C,uDAAU,CAAA;IACV,gEAAgE;IAChE,mDAAQ,CAAA;AACV,CAAC,EATW,cAAc,KAAd,cAAc,QASzB;AAyJD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,cAAc,CAAC,IAAI;QAC9B,iBAAiB,EAAE,IAAI;QACvB,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,GAAG,IAAI,CAAC;AACpB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG;YAClB,cAAc,CAAC,IAAI;YACnB,cAAc,CAAC,GAAG;YAClB,cAAc,CAAC,MAAM;YACrB,cAAc,CAAC,IAAI;SACpB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAI;QACjC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAW;QACtD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAM;QACvC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAU;QACnD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAU;QACnD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,iBAAkB;QAC3E,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAiB;KACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Resource Tracking and Memory Optimization for MicroPDF
3
+ *
4
+ * This module provides:
5
+ * - FinalizationRegistry-based handle tracking for leak detection
6
+ * - Object pools for geometry types (Point, Rect, Matrix, Quad)
7
+ * - WeakRef-based leak detection warnings
8
+ * - Buffer optimization utilities
9
+ *
10
+ * @module resource-tracking
11
+ */
12
+ import { Point, Rect, Matrix, Quad } from './geometry.js';
13
+ /**
14
+ * Resource types that can be tracked
15
+ */
16
+ export declare enum ResourceType {
17
+ Context = "Context",
18
+ Buffer = "Buffer",
19
+ Stream = "Stream",
20
+ Pixmap = "Pixmap",
21
+ Document = "Document",
22
+ Page = "Page",
23
+ Font = "Font",
24
+ Image = "Image",
25
+ Path = "Path",
26
+ Text = "Text",
27
+ Device = "Device",
28
+ DisplayList = "DisplayList",
29
+ Colorspace = "Colorspace",
30
+ PdfObject = "PdfObject",
31
+ Annotation = "Annotation",
32
+ Link = "Link",
33
+ Outline = "Outline",
34
+ Cookie = "Cookie",
35
+ Archive = "Archive",
36
+ StextPage = "StextPage",
37
+ Other = "Other"
38
+ }
39
+ /**
40
+ * Information about a tracked allocation
41
+ */
42
+ export interface AllocationInfo {
43
+ handle: number;
44
+ type: ResourceType;
45
+ createdAt: number;
46
+ stackTrace?: string | undefined;
47
+ tag?: string | undefined;
48
+ }
49
+ /**
50
+ * Statistics for a resource type
51
+ */
52
+ export interface TypeStats {
53
+ currentCount: number;
54
+ totalAllocated: number;
55
+ totalDeallocated: number;
56
+ }
57
+ /**
58
+ * Global tracking statistics
59
+ */
60
+ export interface GlobalStats {
61
+ totalHandlesCreated: number;
62
+ totalHandlesDestroyed: number;
63
+ currentHandles: number;
64
+ peakHandles: number;
65
+ leakWarnings: number;
66
+ }
67
+ /**
68
+ * Global handle registry for tracking unreleased resources
69
+ */
70
+ declare class HandleRegistry {
71
+ private registry;
72
+ private allocations;
73
+ private weakRefs;
74
+ private stats;
75
+ private typeStats;
76
+ private enabled;
77
+ private captureStacks;
78
+ private leakWarnings;
79
+ constructor();
80
+ /**
81
+ * Enable or disable resource tracking
82
+ */
83
+ setEnabled(enabled: boolean): void;
84
+ /**
85
+ * Check if tracking is enabled
86
+ */
87
+ isEnabled(): boolean;
88
+ /**
89
+ * Enable or disable stack trace capture (expensive)
90
+ */
91
+ setCaptureStacks(capture: boolean): void;
92
+ /**
93
+ * Register an object for tracking
94
+ */
95
+ register(target: object, handle: number, type: ResourceType, tag?: string): void;
96
+ /**
97
+ * Unregister an object (called when properly disposed)
98
+ */
99
+ unregister(target: object, handle: number): void;
100
+ /**
101
+ * Called when an object is garbage collected without being properly disposed
102
+ */
103
+ private handleFinalized;
104
+ /**
105
+ * Get current global statistics
106
+ */
107
+ getStats(): GlobalStats;
108
+ /**
109
+ * Get statistics by resource type
110
+ */
111
+ getTypeStats(): Map<ResourceType, TypeStats>;
112
+ /**
113
+ * Get all current allocations
114
+ */
115
+ getAllocations(): AllocationInfo[];
116
+ /**
117
+ * Get potential leaks (allocations older than threshold)
118
+ */
119
+ getPotentialLeaks(minAgeMs: number): AllocationInfo[];
120
+ /**
121
+ * Get and clear leak warnings
122
+ */
123
+ getLeakWarnings(): string[];
124
+ /**
125
+ * Reset all tracking data
126
+ */
127
+ reset(): void;
128
+ }
129
+ /**
130
+ * Global handle registry instance
131
+ */
132
+ export declare const handleRegistry: HandleRegistry;
133
+ /**
134
+ * Enable resource tracking
135
+ */
136
+ export declare function enableTracking(enabled: boolean): void;
137
+ /**
138
+ * Enable stack trace capture for allocations
139
+ */
140
+ export declare function enableStackTraces(enabled: boolean): void;
141
+ /**
142
+ * Check if tracking is enabled
143
+ */
144
+ export declare function isTrackingEnabled(): boolean;
145
+ /**
146
+ * Generic object pool
147
+ */
148
+ declare class ObjectPool<T> {
149
+ private pool;
150
+ private maxSize;
151
+ private factory;
152
+ private reset;
153
+ private hits;
154
+ private misses;
155
+ private returns;
156
+ constructor(factory: () => T, reset: (obj: T) => void, maxSize?: number);
157
+ /**
158
+ * Get an object from the pool or create a new one
159
+ */
160
+ acquire(): T;
161
+ /**
162
+ * Return an object to the pool
163
+ */
164
+ release(obj: T): void;
165
+ /**
166
+ * Get pool statistics
167
+ */
168
+ getStats(): {
169
+ size: number;
170
+ hits: number;
171
+ misses: number;
172
+ returns: number;
173
+ hitRate: number;
174
+ };
175
+ /**
176
+ * Clear the pool
177
+ */
178
+ clear(): void;
179
+ }
180
+ /**
181
+ * Mutable Point for pooling (internal use only)
182
+ */
183
+ declare class MutablePoint {
184
+ x: number;
185
+ y: number;
186
+ reset(): void;
187
+ toPoint(): Point;
188
+ }
189
+ /**
190
+ * Mutable Rect for pooling (internal use only)
191
+ */
192
+ declare class MutableRect {
193
+ x0: number;
194
+ y0: number;
195
+ x1: number;
196
+ y1: number;
197
+ reset(): void;
198
+ toRect(): Rect;
199
+ }
200
+ /**
201
+ * Mutable Matrix for pooling (internal use only)
202
+ */
203
+ declare class MutableMatrix {
204
+ a: number;
205
+ b: number;
206
+ c: number;
207
+ d: number;
208
+ e: number;
209
+ f: number;
210
+ reset(): void;
211
+ toMatrix(): Matrix;
212
+ }
213
+ /**
214
+ * Mutable Quad for pooling (internal use only)
215
+ */
216
+ declare class MutableQuad {
217
+ ulX: number;
218
+ ulY: number;
219
+ urX: number;
220
+ urY: number;
221
+ llX: number;
222
+ llY: number;
223
+ lrX: number;
224
+ lrY: number;
225
+ reset(): void;
226
+ toQuad(): Quad;
227
+ }
228
+ /**
229
+ * Acquire a mutable point from the pool
230
+ */
231
+ export declare function acquirePoint(): MutablePoint;
232
+ /**
233
+ * Release a mutable point back to the pool
234
+ */
235
+ export declare function releasePoint(p: MutablePoint): void;
236
+ /**
237
+ * Acquire a mutable rect from the pool
238
+ */
239
+ export declare function acquireRect(): MutableRect;
240
+ /**
241
+ * Release a mutable rect back to the pool
242
+ */
243
+ export declare function releaseRect(r: MutableRect): void;
244
+ /**
245
+ * Acquire a mutable matrix from the pool
246
+ */
247
+ export declare function acquireMatrix(): MutableMatrix;
248
+ /**
249
+ * Release a mutable matrix back to the pool
250
+ */
251
+ export declare function releaseMatrix(m: MutableMatrix): void;
252
+ /**
253
+ * Acquire a mutable quad from the pool
254
+ */
255
+ export declare function acquireQuad(): MutableQuad;
256
+ /**
257
+ * Release a mutable quad back to the pool
258
+ */
259
+ export declare function releaseQuad(q: MutableQuad): void;
260
+ /**
261
+ * Get pool statistics
262
+ */
263
+ export declare function getPoolStats(): Record<string, ReturnType<ObjectPool<unknown>['getStats']>>;
264
+ /**
265
+ * Clear all pools
266
+ */
267
+ export declare function clearPools(): void;
268
+ /**
269
+ * Pool for reusable byte arrays
270
+ */
271
+ declare class ByteArrayPool {
272
+ private pools;
273
+ private sizes;
274
+ private maxPerSize;
275
+ /**
276
+ * Get the size class for a given length
277
+ */
278
+ private getSizeClass;
279
+ /**
280
+ * Acquire a byte array with at least the specified length
281
+ */
282
+ acquire(minLength: number): Uint8Array;
283
+ /**
284
+ * Release a byte array back to the pool
285
+ */
286
+ release(arr: Uint8Array): void;
287
+ /**
288
+ * Clear all pools
289
+ */
290
+ clear(): void;
291
+ }
292
+ /**
293
+ * Global byte array pool
294
+ */
295
+ export declare const byteArrayPool: ByteArrayPool;
296
+ /**
297
+ * Convert a Uint8Array to string efficiently
298
+ *
299
+ * Uses TextDecoder for larger buffers (> 1KB) which is more efficient,
300
+ * and falls back to simple string conversion for smaller buffers.
301
+ */
302
+ export declare function uint8ArrayToString(data: Uint8Array): string;
303
+ /**
304
+ * Convert a Buffer to string efficiently
305
+ *
306
+ * Uses TextDecoder for larger buffers (> 1KB) which is more efficient.
307
+ */
308
+ export declare function bufferToString(data: globalThis.Buffer, encoding?: BufferEncoding): string;
309
+ /**
310
+ * Reusable number array pool for hot paths
311
+ */
312
+ declare class NumberArrayPool {
313
+ private pools;
314
+ private maxPerSize;
315
+ acquire(size: number): number[];
316
+ release(arr: number[]): void;
317
+ clear(): void;
318
+ }
319
+ /**
320
+ * Global number array pool
321
+ */
322
+ export declare const numberArrayPool: NumberArrayPool;
323
+ /**
324
+ * Generate a comprehensive leak report
325
+ */
326
+ export declare function generateLeakReport(minAgeMs?: number): string;
327
+ /**
328
+ * Print leak report to console
329
+ */
330
+ export declare function printLeakReport(minAgeMs?: number): void;
331
+ export {};
332
+ //# sourceMappingURL=resource-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-tracking.d.ts","sourceRoot":"","sources":["../src/resource-tracking.ts"],"names":[],"mappings":"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"}