@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,653 @@
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
+ // Types
15
+ // ============================================================================
16
+ /**
17
+ * Resource types that can be tracked
18
+ */
19
+ export var ResourceType;
20
+ (function (ResourceType) {
21
+ ResourceType["Context"] = "Context";
22
+ ResourceType["Buffer"] = "Buffer";
23
+ ResourceType["Stream"] = "Stream";
24
+ ResourceType["Pixmap"] = "Pixmap";
25
+ ResourceType["Document"] = "Document";
26
+ ResourceType["Page"] = "Page";
27
+ ResourceType["Font"] = "Font";
28
+ ResourceType["Image"] = "Image";
29
+ ResourceType["Path"] = "Path";
30
+ ResourceType["Text"] = "Text";
31
+ ResourceType["Device"] = "Device";
32
+ ResourceType["DisplayList"] = "DisplayList";
33
+ ResourceType["Colorspace"] = "Colorspace";
34
+ ResourceType["PdfObject"] = "PdfObject";
35
+ ResourceType["Annotation"] = "Annotation";
36
+ ResourceType["Link"] = "Link";
37
+ ResourceType["Outline"] = "Outline";
38
+ ResourceType["Cookie"] = "Cookie";
39
+ ResourceType["Archive"] = "Archive";
40
+ ResourceType["StextPage"] = "StextPage";
41
+ ResourceType["Other"] = "Other";
42
+ })(ResourceType || (ResourceType = {}));
43
+ /**
44
+ * Global handle registry for tracking unreleased resources
45
+ */
46
+ class HandleRegistry {
47
+ registry;
48
+ allocations = new Map();
49
+ weakRefs = new Map();
50
+ stats = {
51
+ totalHandlesCreated: 0,
52
+ totalHandlesDestroyed: 0,
53
+ currentHandles: 0,
54
+ peakHandles: 0,
55
+ leakWarnings: 0
56
+ };
57
+ typeStats = new Map();
58
+ enabled = false;
59
+ captureStacks = false;
60
+ leakWarnings = [];
61
+ constructor() {
62
+ this.registry = new FinalizationRegistry((data) => {
63
+ this.handleFinalized(data);
64
+ });
65
+ }
66
+ /**
67
+ * Enable or disable resource tracking
68
+ */
69
+ setEnabled(enabled) {
70
+ this.enabled = enabled;
71
+ }
72
+ /**
73
+ * Check if tracking is enabled
74
+ */
75
+ isEnabled() {
76
+ return this.enabled;
77
+ }
78
+ /**
79
+ * Enable or disable stack trace capture (expensive)
80
+ */
81
+ setCaptureStacks(capture) {
82
+ this.captureStacks = capture;
83
+ }
84
+ /**
85
+ * Register an object for tracking
86
+ */
87
+ register(target, handle, type, tag) {
88
+ if (!this.enabled)
89
+ return;
90
+ const data = { handle, type, tag };
91
+ this.registry.register(target, data, target);
92
+ // Store allocation info
93
+ const info = {
94
+ handle,
95
+ type,
96
+ createdAt: Date.now(),
97
+ tag
98
+ };
99
+ if (this.captureStacks) {
100
+ info.stackTrace = new Error().stack;
101
+ }
102
+ this.allocations.set(handle, info);
103
+ this.weakRefs.set(handle, new WeakRef(target));
104
+ // Update stats
105
+ this.stats.totalHandlesCreated++;
106
+ this.stats.currentHandles++;
107
+ if (this.stats.currentHandles > this.stats.peakHandles) {
108
+ this.stats.peakHandles = this.stats.currentHandles;
109
+ }
110
+ // Update type stats
111
+ let typeStats = this.typeStats.get(type);
112
+ if (!typeStats) {
113
+ typeStats = { currentCount: 0, totalAllocated: 0, totalDeallocated: 0 };
114
+ this.typeStats.set(type, typeStats);
115
+ }
116
+ typeStats.currentCount++;
117
+ typeStats.totalAllocated++;
118
+ }
119
+ /**
120
+ * Unregister an object (called when properly disposed)
121
+ */
122
+ unregister(target, handle) {
123
+ if (!this.enabled)
124
+ return;
125
+ this.registry.unregister(target);
126
+ const info = this.allocations.get(handle);
127
+ if (info) {
128
+ this.allocations.delete(handle);
129
+ this.weakRefs.delete(handle);
130
+ // Update stats
131
+ this.stats.totalHandlesDestroyed++;
132
+ this.stats.currentHandles--;
133
+ // Update type stats
134
+ const typeStats = this.typeStats.get(info.type);
135
+ if (typeStats) {
136
+ typeStats.currentCount--;
137
+ typeStats.totalDeallocated++;
138
+ }
139
+ }
140
+ }
141
+ /**
142
+ * Called when an object is garbage collected without being properly disposed
143
+ */
144
+ handleFinalized(data) {
145
+ const info = this.allocations.get(data.handle);
146
+ if (info) {
147
+ // This is a leak - the object was GC'd without being disposed
148
+ const warning = `[LEAK] ${data.type} (handle=${data.handle}${data.tag ? `, tag=${data.tag}` : ''}) was garbage collected without being disposed`;
149
+ this.leakWarnings.push(warning);
150
+ this.stats.leakWarnings++;
151
+ // Log in development
152
+ if (process.env['NODE_ENV'] !== 'production') {
153
+ console.warn(warning);
154
+ if (info.stackTrace) {
155
+ console.warn(' Allocation stack:', info.stackTrace);
156
+ }
157
+ }
158
+ // Clean up tracking
159
+ this.allocations.delete(data.handle);
160
+ this.weakRefs.delete(data.handle);
161
+ this.stats.currentHandles--;
162
+ const typeStats = this.typeStats.get(data.type);
163
+ if (typeStats) {
164
+ typeStats.currentCount--;
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * Get current global statistics
170
+ */
171
+ getStats() {
172
+ return { ...this.stats };
173
+ }
174
+ /**
175
+ * Get statistics by resource type
176
+ */
177
+ getTypeStats() {
178
+ return new Map(this.typeStats);
179
+ }
180
+ /**
181
+ * Get all current allocations
182
+ */
183
+ getAllocations() {
184
+ return Array.from(this.allocations.values());
185
+ }
186
+ /**
187
+ * Get potential leaks (allocations older than threshold)
188
+ */
189
+ getPotentialLeaks(minAgeMs) {
190
+ const cutoff = Date.now() - minAgeMs;
191
+ return Array.from(this.allocations.values()).filter((info) => info.createdAt < cutoff);
192
+ }
193
+ /**
194
+ * Get and clear leak warnings
195
+ */
196
+ getLeakWarnings() {
197
+ const warnings = [...this.leakWarnings];
198
+ this.leakWarnings = [];
199
+ return warnings;
200
+ }
201
+ /**
202
+ * Reset all tracking data
203
+ */
204
+ reset() {
205
+ this.allocations.clear();
206
+ this.weakRefs.clear();
207
+ this.typeStats.clear();
208
+ this.leakWarnings = [];
209
+ this.stats = {
210
+ totalHandlesCreated: 0,
211
+ totalHandlesDestroyed: 0,
212
+ currentHandles: 0,
213
+ peakHandles: 0,
214
+ leakWarnings: 0
215
+ };
216
+ }
217
+ }
218
+ /**
219
+ * Global handle registry instance
220
+ */
221
+ export const handleRegistry = new HandleRegistry();
222
+ /**
223
+ * Enable resource tracking
224
+ */
225
+ export function enableTracking(enabled) {
226
+ handleRegistry.setEnabled(enabled);
227
+ }
228
+ /**
229
+ * Enable stack trace capture for allocations
230
+ */
231
+ export function enableStackTraces(enabled) {
232
+ handleRegistry.setCaptureStacks(enabled);
233
+ }
234
+ /**
235
+ * Check if tracking is enabled
236
+ */
237
+ export function isTrackingEnabled() {
238
+ return handleRegistry.isEnabled();
239
+ }
240
+ // ============================================================================
241
+ // Object Pools for Geometry Types
242
+ // ============================================================================
243
+ /**
244
+ * Generic object pool
245
+ */
246
+ class ObjectPool {
247
+ pool = [];
248
+ maxSize;
249
+ factory;
250
+ reset;
251
+ // Stats
252
+ hits = 0;
253
+ misses = 0;
254
+ returns = 0;
255
+ constructor(factory, reset, maxSize = 100) {
256
+ this.factory = factory;
257
+ this.reset = reset;
258
+ this.maxSize = maxSize;
259
+ }
260
+ /**
261
+ * Get an object from the pool or create a new one
262
+ */
263
+ acquire() {
264
+ if (this.pool.length > 0) {
265
+ this.hits++;
266
+ return this.pool.pop();
267
+ }
268
+ this.misses++;
269
+ return this.factory();
270
+ }
271
+ /**
272
+ * Return an object to the pool
273
+ */
274
+ release(obj) {
275
+ if (this.pool.length < this.maxSize) {
276
+ this.reset(obj);
277
+ this.pool.push(obj);
278
+ this.returns++;
279
+ }
280
+ }
281
+ /**
282
+ * Get pool statistics
283
+ */
284
+ getStats() {
285
+ const total = this.hits + this.misses;
286
+ return {
287
+ size: this.pool.length,
288
+ hits: this.hits,
289
+ misses: this.misses,
290
+ returns: this.returns,
291
+ hitRate: total > 0 ? this.hits / total : 0
292
+ };
293
+ }
294
+ /**
295
+ * Clear the pool
296
+ */
297
+ clear() {
298
+ this.pool = [];
299
+ }
300
+ }
301
+ /**
302
+ * Mutable Point for pooling (internal use only)
303
+ */
304
+ class MutablePoint {
305
+ x = 0;
306
+ y = 0;
307
+ reset() {
308
+ this.x = 0;
309
+ this.y = 0;
310
+ }
311
+ toPoint() {
312
+ return new Point(this.x, this.y);
313
+ }
314
+ }
315
+ /**
316
+ * Mutable Rect for pooling (internal use only)
317
+ */
318
+ class MutableRect {
319
+ x0 = 0;
320
+ y0 = 0;
321
+ x1 = 0;
322
+ y1 = 0;
323
+ reset() {
324
+ this.x0 = 0;
325
+ this.y0 = 0;
326
+ this.x1 = 0;
327
+ this.y1 = 0;
328
+ }
329
+ toRect() {
330
+ return new Rect(this.x0, this.y0, this.x1, this.y1);
331
+ }
332
+ }
333
+ /**
334
+ * Mutable Matrix for pooling (internal use only)
335
+ */
336
+ class MutableMatrix {
337
+ a = 1;
338
+ b = 0;
339
+ c = 0;
340
+ d = 1;
341
+ e = 0;
342
+ f = 0;
343
+ reset() {
344
+ this.a = 1;
345
+ this.b = 0;
346
+ this.c = 0;
347
+ this.d = 1;
348
+ this.e = 0;
349
+ this.f = 0;
350
+ }
351
+ toMatrix() {
352
+ return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);
353
+ }
354
+ }
355
+ /**
356
+ * Mutable Quad for pooling (internal use only)
357
+ */
358
+ class MutableQuad {
359
+ ulX = 0;
360
+ ulY = 0;
361
+ urX = 0;
362
+ urY = 0;
363
+ llX = 0;
364
+ llY = 0;
365
+ lrX = 0;
366
+ lrY = 0;
367
+ reset() {
368
+ this.ulX = 0;
369
+ this.ulY = 0;
370
+ this.urX = 0;
371
+ this.urY = 0;
372
+ this.llX = 0;
373
+ this.llY = 0;
374
+ this.lrX = 0;
375
+ this.lrY = 0;
376
+ }
377
+ toQuad() {
378
+ return new Quad(new Point(this.ulX, this.ulY), new Point(this.urX, this.urY), new Point(this.llX, this.llY), new Point(this.lrX, this.lrY));
379
+ }
380
+ }
381
+ // Create pools
382
+ const pointPool = new ObjectPool(() => new MutablePoint(), (p) => p.reset(), 200);
383
+ const rectPool = new ObjectPool(() => new MutableRect(), (r) => r.reset(), 100);
384
+ const matrixPool = new ObjectPool(() => new MutableMatrix(), (m) => m.reset(), 50);
385
+ const quadPool = new ObjectPool(() => new MutableQuad(), (q) => q.reset(), 50);
386
+ /**
387
+ * Acquire a mutable point from the pool
388
+ */
389
+ export function acquirePoint() {
390
+ return pointPool.acquire();
391
+ }
392
+ /**
393
+ * Release a mutable point back to the pool
394
+ */
395
+ export function releasePoint(p) {
396
+ pointPool.release(p);
397
+ }
398
+ /**
399
+ * Acquire a mutable rect from the pool
400
+ */
401
+ export function acquireRect() {
402
+ return rectPool.acquire();
403
+ }
404
+ /**
405
+ * Release a mutable rect back to the pool
406
+ */
407
+ export function releaseRect(r) {
408
+ rectPool.release(r);
409
+ }
410
+ /**
411
+ * Acquire a mutable matrix from the pool
412
+ */
413
+ export function acquireMatrix() {
414
+ return matrixPool.acquire();
415
+ }
416
+ /**
417
+ * Release a mutable matrix back to the pool
418
+ */
419
+ export function releaseMatrix(m) {
420
+ matrixPool.release(m);
421
+ }
422
+ /**
423
+ * Acquire a mutable quad from the pool
424
+ */
425
+ export function acquireQuad() {
426
+ return quadPool.acquire();
427
+ }
428
+ /**
429
+ * Release a mutable quad back to the pool
430
+ */
431
+ export function releaseQuad(q) {
432
+ quadPool.release(q);
433
+ }
434
+ /**
435
+ * Get pool statistics
436
+ */
437
+ export function getPoolStats() {
438
+ return {
439
+ point: pointPool.getStats(),
440
+ rect: rectPool.getStats(),
441
+ matrix: matrixPool.getStats(),
442
+ quad: quadPool.getStats()
443
+ };
444
+ }
445
+ /**
446
+ * Clear all pools
447
+ */
448
+ export function clearPools() {
449
+ pointPool.clear();
450
+ rectPool.clear();
451
+ matrixPool.clear();
452
+ quadPool.clear();
453
+ }
454
+ // ============================================================================
455
+ // Byte Array Pool
456
+ // ============================================================================
457
+ /**
458
+ * Pool for reusable byte arrays
459
+ */
460
+ class ByteArrayPool {
461
+ pools = new Map();
462
+ sizes = [64, 256, 1024, 4096, 16384, 65536];
463
+ maxPerSize = 10;
464
+ /**
465
+ * Get the size class for a given length
466
+ */
467
+ getSizeClass(length) {
468
+ for (const size of this.sizes) {
469
+ if (size >= length)
470
+ return size;
471
+ }
472
+ return -1; // No suitable size class
473
+ }
474
+ /**
475
+ * Acquire a byte array with at least the specified length
476
+ */
477
+ acquire(minLength) {
478
+ const sizeClass = this.getSizeClass(minLength);
479
+ if (sizeClass === -1) {
480
+ // Too large for pooling
481
+ return new Uint8Array(minLength);
482
+ }
483
+ const pool = this.pools.get(sizeClass);
484
+ if (pool && pool.length > 0) {
485
+ return pool.pop();
486
+ }
487
+ return new Uint8Array(sizeClass);
488
+ }
489
+ /**
490
+ * Release a byte array back to the pool
491
+ */
492
+ release(arr) {
493
+ const sizeClass = this.getSizeClass(arr.length);
494
+ if (sizeClass === -1 || arr.length !== sizeClass)
495
+ return;
496
+ let pool = this.pools.get(sizeClass);
497
+ if (!pool) {
498
+ pool = [];
499
+ this.pools.set(sizeClass, pool);
500
+ }
501
+ if (pool.length < this.maxPerSize) {
502
+ pool.push(arr);
503
+ }
504
+ }
505
+ /**
506
+ * Clear all pools
507
+ */
508
+ clear() {
509
+ this.pools.clear();
510
+ }
511
+ }
512
+ /**
513
+ * Global byte array pool
514
+ */
515
+ export const byteArrayPool = new ByteArrayPool();
516
+ // ============================================================================
517
+ // Buffer Optimization Utilities
518
+ // ============================================================================
519
+ /**
520
+ * Shared TextDecoder instance for efficient string conversion
521
+ */
522
+ const textDecoder = new TextDecoder('utf-8');
523
+ /**
524
+ * Threshold for using TextDecoder vs simple conversion (bytes)
525
+ */
526
+ const TEXT_DECODER_THRESHOLD = 1024;
527
+ /**
528
+ * Convert a Uint8Array to string efficiently
529
+ *
530
+ * Uses TextDecoder for larger buffers (> 1KB) which is more efficient,
531
+ * and falls back to simple string conversion for smaller buffers.
532
+ */
533
+ export function uint8ArrayToString(data) {
534
+ if (data.length > TEXT_DECODER_THRESHOLD) {
535
+ return textDecoder.decode(data);
536
+ }
537
+ // For small buffers, direct conversion is faster due to TextDecoder overhead
538
+ return String.fromCharCode.apply(null, data);
539
+ }
540
+ /**
541
+ * Convert a Buffer to string efficiently
542
+ *
543
+ * Uses TextDecoder for larger buffers (> 1KB) which is more efficient.
544
+ */
545
+ export function bufferToString(data, encoding = 'utf-8') {
546
+ if (encoding === 'utf-8' || encoding === 'utf8') {
547
+ if (data.length > TEXT_DECODER_THRESHOLD) {
548
+ return textDecoder.decode(data);
549
+ }
550
+ }
551
+ return data.toString(encoding);
552
+ }
553
+ // ============================================================================
554
+ // Reusable Array Utilities
555
+ // ============================================================================
556
+ /**
557
+ * Reusable number array pool for hot paths
558
+ */
559
+ class NumberArrayPool {
560
+ pools = new Map();
561
+ maxPerSize = 20;
562
+ acquire(size) {
563
+ const pool = this.pools.get(size);
564
+ if (pool && pool.length > 0) {
565
+ const arr = pool.pop();
566
+ arr.length = size; // Reset length
567
+ return arr;
568
+ }
569
+ return new Array(size);
570
+ }
571
+ release(arr) {
572
+ const size = arr.length;
573
+ let pool = this.pools.get(size);
574
+ if (!pool) {
575
+ pool = [];
576
+ this.pools.set(size, pool);
577
+ }
578
+ if (pool.length < this.maxPerSize) {
579
+ // Clear array content
580
+ arr.fill(0);
581
+ pool.push(arr);
582
+ }
583
+ }
584
+ clear() {
585
+ this.pools.clear();
586
+ }
587
+ }
588
+ /**
589
+ * Global number array pool
590
+ */
591
+ export const numberArrayPool = new NumberArrayPool();
592
+ // ============================================================================
593
+ // Leak Detection Report
594
+ // ============================================================================
595
+ /**
596
+ * Generate a comprehensive leak report
597
+ */
598
+ export function generateLeakReport(minAgeMs = 60000) {
599
+ const stats = handleRegistry.getStats();
600
+ const typeStats = handleRegistry.getTypeStats();
601
+ const potentialLeaks = handleRegistry.getPotentialLeaks(minAgeMs);
602
+ const leakWarnings = handleRegistry.getLeakWarnings();
603
+ const lines = [
604
+ '=== MicroPDF Memory Leak Report (Node.js) ===',
605
+ '',
606
+ `Generated: ${new Date().toISOString()}`,
607
+ `Min age threshold: ${minAgeMs}ms`,
608
+ '',
609
+ '--- Global Statistics ---',
610
+ `Handles created: ${stats.totalHandlesCreated}`,
611
+ `Handles destroyed: ${stats.totalHandlesDestroyed}`,
612
+ `Current handles: ${stats.currentHandles}`,
613
+ `Peak handles: ${stats.peakHandles}`,
614
+ `Leak warnings: ${stats.leakWarnings}`,
615
+ '',
616
+ '--- By Resource Type ---'
617
+ ];
618
+ for (const [type, tStats] of typeStats) {
619
+ if (tStats.totalAllocated > 0) {
620
+ lines.push(` ${type}: ${tStats.currentCount} current (${tStats.totalAllocated} allocated, ${tStats.totalDeallocated} freed)`);
621
+ }
622
+ }
623
+ if (potentialLeaks.length > 0) {
624
+ lines.push('', `--- Potential Leaks (${potentialLeaks.length}) ---`);
625
+ for (const leak of potentialLeaks.slice(0, 20)) {
626
+ const age = Date.now() - leak.createdAt;
627
+ lines.push(` ${leak.type} (handle=${leak.handle}): age ${Math.round(age / 1000)}s${leak.tag ? `, tag=${leak.tag}` : ''}`);
628
+ }
629
+ if (potentialLeaks.length > 20) {
630
+ lines.push(` ... and ${potentialLeaks.length - 20} more`);
631
+ }
632
+ }
633
+ if (leakWarnings.length > 0) {
634
+ lines.push('', `--- Recent Leak Warnings (${leakWarnings.length}) ---`);
635
+ for (const warning of leakWarnings.slice(0, 10)) {
636
+ lines.push(` ${warning}`);
637
+ }
638
+ }
639
+ // Pool stats
640
+ const poolStats = getPoolStats();
641
+ lines.push('', '--- Object Pool Statistics ---');
642
+ for (const [name, pStats] of Object.entries(poolStats)) {
643
+ lines.push(` ${name}: ${pStats.size} pooled, ${pStats.hits} hits, ${pStats.misses} misses, ${(pStats.hitRate * 100).toFixed(1)}% hit rate`);
644
+ }
645
+ return lines.join('\n');
646
+ }
647
+ /**
648
+ * Print leak report to console
649
+ */
650
+ export function printLeakReport(minAgeMs = 60000) {
651
+ console.log(generateLeakReport(minAgeMs));
652
+ }
653
+ //# sourceMappingURL=resource-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-tracking.js","sourceRoot":"","sources":["../src/resource-tracking.ts"],"names":[],"mappings":"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"}