bullmq 5.5.2 → 5.5.3

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.
@@ -1,423 +0,0 @@
1
- import { createHash } from 'crypto';
2
- import * as path from 'path';
3
- import * as fs from 'fs';
4
- import { promisify } from 'util';
5
- const readFile = promisify(fs.readFile);
6
- const readdir = promisify(fs.readdir);
7
- const GlobOptions = { dot: true, silent: false };
8
- const IncludeRegex = /^[-]{2,3}[ \t]*@include[ \t]+(["'])(.+?)\1[; \t\n]*$/m;
9
- const EmptyLineRegex = /^\s*[\r\n]/gm;
10
- export class ScriptLoaderError extends Error {
11
- constructor(message, path, stack = [], line, position = 0) {
12
- super(message);
13
- // Ensure the name of this error is the same as the class name
14
- this.name = this.constructor.name;
15
- Error.captureStackTrace(this, this.constructor);
16
- this.includes = stack;
17
- this.line = line !== null && line !== void 0 ? line : 0;
18
- this.position = position;
19
- }
20
- }
21
- const isPossiblyMappedPath = (path) => path && ['~', '<'].includes(path[0]);
22
- /**
23
- * Lua script loader with include support
24
- */
25
- export class ScriptLoader {
26
- constructor() {
27
- /**
28
- * Map an alias to a path
29
- */
30
- this.pathMapper = new Map();
31
- this.clientScripts = new WeakMap();
32
- /**
33
- * Cache commands by dir
34
- */
35
- this.commandCache = new Map();
36
- this.rootPath = getPkgJsonDir();
37
- this.pathMapper.set('~', this.rootPath);
38
- this.pathMapper.set('rootDir', this.rootPath);
39
- this.pathMapper.set('base', __dirname);
40
- }
41
- /**
42
- * Add a script path mapping. Allows includes of the form "<includes>/utils.lua" where `includes` is a user
43
- * defined path
44
- * @param name - the name of the mapping. Note: do not include angle brackets
45
- * @param mappedPath - if a relative path is passed, it's relative to the *caller* of this function.
46
- * Mapped paths are also accepted, e.g. "~/server/scripts/lua" or "<base>/includes"
47
- */
48
- addPathMapping(name, mappedPath) {
49
- let resolved;
50
- if (isPossiblyMappedPath(mappedPath)) {
51
- resolved = this.resolvePath(mappedPath);
52
- }
53
- else {
54
- const caller = getCallerFile();
55
- const callerPath = path.dirname(caller);
56
- resolved = path.normalize(path.resolve(callerPath, mappedPath));
57
- }
58
- const last = resolved.length - 1;
59
- if (resolved[last] === path.sep) {
60
- resolved = resolved.substr(0, last);
61
- }
62
- this.pathMapper.set(name, resolved);
63
- }
64
- /**
65
- * Resolve the script path considering path mappings
66
- * @param scriptName - the name of the script
67
- * @param stack - the include stack, for nicer errors
68
- */
69
- resolvePath(scriptName, stack = []) {
70
- const first = scriptName[0];
71
- if (first === '~') {
72
- scriptName = path.join(this.rootPath, scriptName.substr(2));
73
- }
74
- else if (first === '<') {
75
- const p = scriptName.indexOf('>');
76
- if (p > 0) {
77
- const name = scriptName.substring(1, p);
78
- const mappedPath = this.pathMapper.get(name);
79
- if (!mappedPath) {
80
- throw new ScriptLoaderError(`No path mapping found for "${name}"`, scriptName, stack);
81
- }
82
- scriptName = path.join(mappedPath, scriptName.substring(p + 1));
83
- }
84
- }
85
- return path.normalize(scriptName);
86
- }
87
- /**
88
- * Recursively collect all scripts included in a file
89
- * @param file - the parent file
90
- * @param cache - a cache for file metadata to increase efficiency. Since a file can be included
91
- * multiple times, we make sure to load it only once.
92
- * @param stack - internal stack to prevent circular references
93
- */
94
- async resolveDependencies(file, cache, isInclude = false, stack = []) {
95
- cache = cache !== null && cache !== void 0 ? cache : new Map();
96
- if (stack.includes(file.path)) {
97
- throw new ScriptLoaderError(`circular reference: "${file.path}"`, file.path, stack);
98
- }
99
- stack.push(file.path);
100
- function findPos(content, match) {
101
- const pos = content.indexOf(match);
102
- const arr = content.slice(0, pos).split('\n');
103
- return {
104
- line: arr.length,
105
- column: arr[arr.length - 1].length + match.indexOf('@include') + 1,
106
- };
107
- }
108
- function raiseError(msg, match) {
109
- const pos = findPos(file.content, match);
110
- throw new ScriptLoaderError(msg, file.path, stack, pos.line, pos.column);
111
- }
112
- const minimatch = await import('minimatch');
113
- if (!minimatch) {
114
- console.warn('Install minimatch as dev-dependency');
115
- }
116
- const Minimatch = minimatch.Minimatch || class Empty {
117
- };
118
- const fg = await import('fast-glob');
119
- if (!fg) {
120
- console.warn('Install fast-glob as dev-dependency');
121
- }
122
- const nonOp = () => {
123
- return [''];
124
- };
125
- const glob = (fg === null || fg === void 0 ? void 0 : fg.default.glob) || nonOp;
126
- const hasMagic = (pattern) => {
127
- if (!Array.isArray(pattern)) {
128
- pattern = [pattern];
129
- }
130
- for (const p of pattern) {
131
- if (new Minimatch(p, GlobOptions).hasMagic()) {
132
- return true;
133
- }
134
- }
135
- return false;
136
- };
137
- const hasFilenamePattern = (path) => hasMagic(path);
138
- async function getFilenamesByPattern(pattern) {
139
- return glob(pattern, { dot: true });
140
- }
141
- let res;
142
- let content = file.content;
143
- while ((res = IncludeRegex.exec(content)) !== null) {
144
- const [match, , reference] = res;
145
- const includeFilename = isPossiblyMappedPath(reference)
146
- ? // mapped paths imply absolute reference
147
- this.resolvePath(ensureExt(reference), stack)
148
- : // include path is relative to the file being processed
149
- path.resolve(path.dirname(file.path), ensureExt(reference));
150
- let includePaths;
151
- if (hasFilenamePattern(includeFilename)) {
152
- const filesMatched = await getFilenamesByPattern(includeFilename);
153
- includePaths = filesMatched.map((x) => path.resolve(x));
154
- }
155
- else {
156
- includePaths = [includeFilename];
157
- }
158
- includePaths = includePaths.filter((file) => path.extname(file) === '.lua');
159
- if (includePaths.length === 0) {
160
- raiseError(`include not found: "${reference}"`, match);
161
- }
162
- const tokens = [];
163
- for (let i = 0; i < includePaths.length; i++) {
164
- const includePath = includePaths[i];
165
- const hasInclude = file.includes.find((x) => x.path === includePath);
166
- if (hasInclude) {
167
- /**
168
- * We have something like
169
- * --- \@include "a"
170
- * ...
171
- * --- \@include "a"
172
- */
173
- raiseError(`file "${reference}" already included in "${file.path}"`, match);
174
- }
175
- let includeMetadata = cache.get(includePath);
176
- let token;
177
- if (!includeMetadata) {
178
- const { name, numberOfKeys } = splitFilename(includePath);
179
- let childContent = '';
180
- try {
181
- const buf = await readFile(includePath, { flag: 'r' });
182
- childContent = buf.toString();
183
- }
184
- catch (err) {
185
- if (err.code === 'ENOENT') {
186
- raiseError(`include not found: "${reference}"`, match);
187
- }
188
- else {
189
- throw err;
190
- }
191
- }
192
- // this represents a normalized version of the path to make replacement easy
193
- token = getPathHash(includePath);
194
- includeMetadata = {
195
- name,
196
- numberOfKeys,
197
- path: includePath,
198
- content: childContent,
199
- token,
200
- includes: [],
201
- };
202
- cache.set(includePath, includeMetadata);
203
- }
204
- else {
205
- token = includeMetadata.token;
206
- }
207
- tokens.push(token);
208
- file.includes.push(includeMetadata);
209
- await this.resolveDependencies(includeMetadata, cache, true, stack);
210
- }
211
- // Replace @includes with normalized path hashes
212
- const substitution = tokens.join('\n');
213
- content = content.replace(match, substitution);
214
- }
215
- file.content = content;
216
- if (isInclude) {
217
- cache.set(file.path, file);
218
- }
219
- else {
220
- cache.set(file.name, file);
221
- }
222
- stack.pop();
223
- }
224
- /**
225
- * Parse a (top-level) lua script
226
- * @param filename - the full path to the script
227
- * @param content - the content of the script
228
- * @param cache - cache
229
- */
230
- async parseScript(filename, content, cache) {
231
- const { name, numberOfKeys } = splitFilename(filename);
232
- const meta = cache === null || cache === void 0 ? void 0 : cache.get(name);
233
- if ((meta === null || meta === void 0 ? void 0 : meta.content) === content) {
234
- return meta;
235
- }
236
- const fileInfo = {
237
- path: filename,
238
- token: getPathHash(filename),
239
- content,
240
- name,
241
- numberOfKeys,
242
- includes: [],
243
- };
244
- await this.resolveDependencies(fileInfo, cache);
245
- return fileInfo;
246
- }
247
- /**
248
- * Construct the final version of a file by interpolating its includes in dependency order.
249
- * @param file - the file whose content we want to construct
250
- * @param processed - a cache to keep track of which includes have already been processed
251
- */
252
- interpolate(file, processed) {
253
- processed = processed || new Set();
254
- let content = file.content;
255
- file.includes.forEach((child) => {
256
- const emitted = processed.has(child.path);
257
- const fragment = this.interpolate(child, processed);
258
- const replacement = emitted ? '' : fragment;
259
- if (!replacement) {
260
- content = replaceAll(content, child.token, '');
261
- }
262
- else {
263
- // replace the first instance with the dependency
264
- content = content.replace(child.token, replacement);
265
- // remove the rest
266
- content = replaceAll(content, child.token, '');
267
- }
268
- processed.add(child.path);
269
- });
270
- return content;
271
- }
272
- async loadCommand(filename, cache) {
273
- filename = path.resolve(filename);
274
- const { name: scriptName } = splitFilename(filename);
275
- let script = cache === null || cache === void 0 ? void 0 : cache.get(scriptName);
276
- if (!script) {
277
- const content = (await readFile(filename)).toString();
278
- script = await this.parseScript(filename, content, cache);
279
- }
280
- const lua = removeEmptyLines(this.interpolate(script));
281
- const { name, numberOfKeys } = script;
282
- return {
283
- name,
284
- options: { numberOfKeys: numberOfKeys, lua },
285
- };
286
- }
287
- /**
288
- * Load redis lua scripts.
289
- * The name of the script must have the following format:
290
- *
291
- * cmdName-numKeys.lua
292
- *
293
- * cmdName must be in camel case format.
294
- *
295
- * For example:
296
- * moveToFinish-3.lua
297
- *
298
- */
299
- async loadScripts(dir, cache) {
300
- dir = path.normalize(dir || __dirname);
301
- let commands = this.commandCache.get(dir);
302
- if (commands) {
303
- return commands;
304
- }
305
- const files = await readdir(dir);
306
- const luaFiles = files.filter((file) => path.extname(file) === '.lua');
307
- if (luaFiles.length === 0) {
308
- /**
309
- * To prevent unclarified runtime error "updateDelayset is not a function
310
- * @see https://github.com/OptimalBits/bull/issues/920
311
- */
312
- throw new ScriptLoaderError('No .lua files found!', dir, []);
313
- }
314
- commands = [];
315
- cache = cache !== null && cache !== void 0 ? cache : new Map();
316
- for (let i = 0; i < luaFiles.length; i++) {
317
- const file = path.join(dir, luaFiles[i]);
318
- const command = await this.loadCommand(file, cache);
319
- commands.push(command);
320
- }
321
- this.commandCache.set(dir, commands);
322
- return commands;
323
- }
324
- /**
325
- * Attach all lua scripts in a given directory to a client instance
326
- * @param client - redis client to attach script to
327
- * @param pathname - the path to the directory containing the scripts
328
- */
329
- async load(client, pathname, cache) {
330
- let paths = this.clientScripts.get(client);
331
- if (!paths) {
332
- paths = new Set();
333
- this.clientScripts.set(client, paths);
334
- }
335
- if (!paths.has(pathname)) {
336
- paths.add(pathname);
337
- const scripts = await this.loadScripts(pathname, cache !== null && cache !== void 0 ? cache : new Map());
338
- scripts.forEach((command) => {
339
- // Only define the command if not already defined
340
- if (!client[command.name]) {
341
- client.defineCommand(command.name, command.options);
342
- }
343
- });
344
- }
345
- }
346
- /**
347
- * Clears the command cache
348
- */
349
- clearCache() {
350
- this.commandCache.clear();
351
- }
352
- }
353
- function ensureExt(filename, ext = 'lua') {
354
- const foundExt = path.extname(filename);
355
- if (foundExt && foundExt !== '.') {
356
- return filename;
357
- }
358
- if (ext && ext[0] !== '.') {
359
- ext = `.${ext}`;
360
- }
361
- return `${filename}${ext}`;
362
- }
363
- function splitFilename(filePath) {
364
- const longName = path.basename(filePath, '.lua');
365
- const [name, num] = longName.split('-');
366
- const numberOfKeys = num ? parseInt(num, 10) : undefined;
367
- return { name, numberOfKeys };
368
- }
369
- // Determine the project root
370
- // https://stackoverflow.com/a/18721515
371
- function getPkgJsonDir() {
372
- for (const modPath of module.paths || []) {
373
- try {
374
- const prospectivePkgJsonDir = path.dirname(modPath);
375
- fs.accessSync(modPath, fs.constants.F_OK);
376
- return prospectivePkgJsonDir;
377
- // eslint-disable-next-line no-empty
378
- }
379
- catch (e) { }
380
- }
381
- return '';
382
- }
383
- // https://stackoverflow.com/a/66842927
384
- // some dark magic here :-)
385
- // this version is preferred to the simpler version because of
386
- // https://github.com/facebook/jest/issues/5303 -
387
- // tldr: dont assume you're the only one with the doing something like this
388
- function getCallerFile() {
389
- var _a, _b, _c;
390
- const originalFunc = Error.prepareStackTrace;
391
- let callerFile = '';
392
- try {
393
- Error.prepareStackTrace = (_, stack) => stack;
394
- const sites = new Error().stack;
395
- const currentFile = (_a = sites.shift()) === null || _a === void 0 ? void 0 : _a.getFileName();
396
- while (sites.length) {
397
- callerFile = (_c = (_b = sites.shift()) === null || _b === void 0 ? void 0 : _b.getFileName()) !== null && _c !== void 0 ? _c : '';
398
- if (currentFile !== callerFile) {
399
- break;
400
- }
401
- }
402
- // eslint-disable-next-line no-empty
403
- }
404
- catch (e) {
405
- }
406
- finally {
407
- Error.prepareStackTrace = originalFunc;
408
- }
409
- return callerFile;
410
- }
411
- function sha1(data) {
412
- return createHash('sha1').update(data).digest('hex');
413
- }
414
- function getPathHash(normalizedPath) {
415
- return `@@${sha1(normalizedPath)}`;
416
- }
417
- function replaceAll(str, find, replace) {
418
- return str.replace(new RegExp(find, 'g'), replace);
419
- }
420
- function removeEmptyLines(str) {
421
- return str.replace(EmptyLineRegex, '');
422
- }
423
- //# sourceMappingURL=script-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"script-loader.js","sourceRoot":"","sources":["../../../src/commands/script-loader.ts"],"names":[],"mappings":"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"}