@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.
- package/LICENSE +191 -0
- package/README.md +985 -0
- package/binding.gyp +73 -0
- package/dist/annot.d.ts +458 -0
- package/dist/annot.d.ts.map +1 -0
- package/dist/annot.js +697 -0
- package/dist/annot.js.map +1 -0
- package/dist/archive.d.ts +128 -0
- package/dist/archive.d.ts.map +1 -0
- package/dist/archive.js +268 -0
- package/dist/archive.js.map +1 -0
- package/dist/buffer.d.ts +572 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +971 -0
- package/dist/buffer.js.map +1 -0
- package/dist/colorspace.d.ts +287 -0
- package/dist/colorspace.d.ts.map +1 -0
- package/dist/colorspace.js +542 -0
- package/dist/colorspace.js.map +1 -0
- package/dist/context.d.ts +184 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +320 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie.d.ts +164 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +306 -0
- package/dist/cookie.js.map +1 -0
- package/dist/device.d.ts +169 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +350 -0
- package/dist/device.js.map +1 -0
- package/dist/display-list.d.ts +202 -0
- package/dist/display-list.d.ts.map +1 -0
- package/dist/display-list.js +410 -0
- package/dist/display-list.js.map +1 -0
- package/dist/document.d.ts +637 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +902 -0
- package/dist/document.js.map +1 -0
- package/dist/easy.d.ts +423 -0
- package/dist/easy.d.ts.map +1 -0
- package/dist/easy.js +644 -0
- package/dist/easy.js.map +1 -0
- package/dist/enhanced.d.ts +226 -0
- package/dist/enhanced.d.ts.map +1 -0
- package/dist/enhanced.js +368 -0
- package/dist/enhanced.js.map +1 -0
- package/dist/filter.d.ts +51 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +381 -0
- package/dist/filter.js.map +1 -0
- package/dist/font.d.ts +222 -0
- package/dist/font.d.ts.map +1 -0
- package/dist/font.js +381 -0
- package/dist/font.js.map +1 -0
- package/dist/form.d.ts +214 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +497 -0
- package/dist/form.js.map +1 -0
- package/dist/geometry.d.ts +469 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +780 -0
- package/dist/geometry.js.map +1 -0
- package/dist/image.d.ts +172 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +348 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +171 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +168 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +343 -0
- package/dist/link.js.map +1 -0
- package/dist/micropdf.d.ts +40 -0
- package/dist/micropdf.d.ts.map +1 -0
- package/dist/micropdf.js +45 -0
- package/dist/micropdf.js.map +1 -0
- package/dist/nanopdf.d.ts +40 -0
- package/dist/nanopdf.d.ts.map +1 -0
- package/dist/nanopdf.js +45 -0
- package/dist/nanopdf.js.map +1 -0
- package/dist/native.d.ts +242 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +509 -0
- package/dist/native.js.map +1 -0
- package/dist/output.d.ts +166 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +365 -0
- package/dist/output.js.map +1 -0
- package/dist/path.d.ts +420 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +687 -0
- package/dist/path.js.map +1 -0
- package/dist/pdf/object.d.ts +489 -0
- package/dist/pdf/object.d.ts.map +1 -0
- package/dist/pdf/object.js +1045 -0
- package/dist/pdf/object.js.map +1 -0
- package/dist/pixmap.d.ts +315 -0
- package/dist/pixmap.d.ts.map +1 -0
- package/dist/pixmap.js +590 -0
- package/dist/pixmap.js.map +1 -0
- package/dist/profiler.d.ts +159 -0
- package/dist/profiler.d.ts.map +1 -0
- package/dist/profiler.js +380 -0
- package/dist/profiler.js.map +1 -0
- package/dist/render-options.d.ts +227 -0
- package/dist/render-options.d.ts.map +1 -0
- package/dist/render-options.js +130 -0
- package/dist/render-options.js.map +1 -0
- package/dist/resource-tracking.d.ts +332 -0
- package/dist/resource-tracking.d.ts.map +1 -0
- package/dist/resource-tracking.js +653 -0
- package/dist/resource-tracking.js.map +1 -0
- package/dist/simple.d.ts +276 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +343 -0
- package/dist/simple.js.map +1 -0
- package/dist/stext.d.ts +290 -0
- package/dist/stext.d.ts.map +1 -0
- package/dist/stext.js +312 -0
- package/dist/stext.js.map +1 -0
- package/dist/stream.d.ts +174 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +476 -0
- package/dist/stream.js.map +1 -0
- package/dist/text.d.ts +337 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +454 -0
- package/dist/text.js.map +1 -0
- package/dist/typed-arrays.d.ts +127 -0
- package/dist/typed-arrays.d.ts.map +1 -0
- package/dist/typed-arrays.js +410 -0
- package/dist/typed-arrays.js.map +1 -0
- package/dist/types.d.ts +358 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +216 -0
- package/dist/types.js.map +1 -0
- package/native/annot.cc +557 -0
- package/native/buffer.cc +204 -0
- package/native/colorspace.cc +166 -0
- package/native/context.cc +84 -0
- package/native/cookie.cc +179 -0
- package/native/device.cc +179 -0
- package/native/display_list.cc +179 -0
- package/native/document.cc +268 -0
- package/native/enhanced.cc +70 -0
- package/native/font.cc +282 -0
- package/native/form.cc +523 -0
- package/native/geometry.cc +255 -0
- package/native/image.cc +216 -0
- package/native/include/micropdf/enhanced.h +38 -0
- package/native/include/micropdf/types.h +36 -0
- package/native/include/micropdf.h +106 -0
- package/native/include/mupdf-ffi.h +39 -0
- package/native/include/mupdf.h +11 -0
- package/native/include/mupdf_minimal.h +381 -0
- package/native/lib/linux-x64/libmicropdf.a +0 -0
- package/native/link.cc +234 -0
- package/native/micropdf.cc +71 -0
- package/native/output.cc +229 -0
- package/native/page.cc +572 -0
- package/native/path.cc +259 -0
- package/native/pixmap.cc +240 -0
- package/native/stext.cc +610 -0
- package/native/stream.cc +239 -0
- package/package.json +120 -0
- package/scripts/build-from-rust.js +97 -0
- 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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"}
|