Skip to content
Merged

V3 #25

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions benchmark/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ import { execSync as exec } from 'node:child_process';
import { arch, cpus, freemem, platform, totalmem } from 'node:os';
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { parseArgs } from 'node:util';
import { run } from './redis-test';
import { run } from './redis-test.js';
import { resolve } from 'node:path';
import { randomUUID as uuid } from 'node:crypto';
import { AnyJson } from '..';
import { setAffinity } from './affinity';
import { type AnyJson } from '../index.js';
import { setAffinity } from './affinity.js';

/**
* Command line options: canonical long name -> parseArgs config and description
Expand Down
8 changes: 6 additions & 2 deletions benchmark/redis-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@
* <support@imqueue.com> to get commercial licensing options.
*/
import { randomUUID as uuid } from 'node:crypto';
import IMQ, { IMQOptions, JsonObject, AnyJson } from '../index';
import { pack } from '../src/helpers';
import IMQ, {
type IMQOptions,
type JsonObject,
type AnyJson,
} from '../index.js';
import { pack } from '../src/helpers/index.js';

/**
* Sample message used within tests
Expand Down
32 changes: 24 additions & 8 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,24 @@
* <support@imqueue.com> to get commercial licensing options.
*/
import {
IMessageQueue,
IMessageQueueConstructor,
type IMessageQueue,
type IMessageQueueConstructor,
IMQMode,
IMQOptions,
} from './src';
type IMQOptions,
} from './src/index.js';
import { ClusteredRedisQueue } from './src/index.js';
import { RedisQueue } from './src/index.js';

export * from './src';
export * from './src/index.js';

// ES modules provide no synchronous dynamic loading, so the queue adapters
// are registered statically; the map key matches the previously used
// `${vendor}Queue` / `Clustered${vendor}Queue` file naming convention
const ADAPTERS: { [name: string]: IMessageQueueConstructor } = {
RedisQueue: RedisQueue as unknown as IMessageQueueConstructor,
ClusteredRedisQueue:
ClusteredRedisQueue as unknown as IMessageQueueConstructor,
};

/**
* Message Queue Factory
Expand Down Expand Up @@ -64,9 +75,14 @@ export default class IMQ {
ClassName = `Clustered${ClassName}`;
}

const Adapter: IMessageQueueConstructor = require(
`${__dirname}/src/${ClassName}.js`,
)[ClassName];
const Adapter: IMessageQueueConstructor | undefined =
ADAPTERS[ClassName];

if (!Adapter) {
throw new TypeError(
`IMQ: unknown queue vendor requested: ${options.vendor}`,
);
}

return new Adapter(name, options, mode);
}
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 20 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@imqueue/core",
"version": "3.1.1",
"version": "3.2.0",
"description": "Simple JSON-based messaging queue for inter service communication",
"keywords": [
"message-queue",
Expand All @@ -18,9 +18,9 @@
"lint": "oxlint",
"format": "oxfmt \"index.ts\" \"src/**/*.ts\" \"test/**/*.ts\" \"benchmark/**/*.ts\"",
"format:check": "oxfmt --check \"index.ts\" \"src/**/*.ts\" \"test/**/*.ts\" \"benchmark/**/*.ts\"",
"test": "npm run build && node --experimental-test-module-mocks --test --test-timeout=15000 $(find test -name '*.spec.js')",
"test-coverage": "npm run build && node --experimental-test-module-mocks --enable-source-maps --test --experimental-test-coverage --test-timeout=15000 $(find test -name '*.spec.js')",
"test-lcov": "npm run build && mkdir -p coverage && node --experimental-test-module-mocks --enable-source-maps --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=coverage/lcov.info --test-timeout=15000 $(find test -name '*.spec.js'); node scripts/strip-comment-coverage.mjs coverage/lcov.info",
"test": "npm run build && node --experimental-test-module-mocks --import ./test/mocks/index.js --test --test-timeout=15000 $(find test -name '*.spec.js')",
"test-coverage": "npm run build && node --experimental-test-module-mocks --enable-source-maps --import ./test/mocks/index.js --test --experimental-test-coverage --test-timeout=15000 $(find test -name '*.spec.js')",
"test-lcov": "npm run build && mkdir -p coverage && node --experimental-test-module-mocks --enable-source-maps --import ./test/mocks/index.js --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=coverage/lcov.info --test-timeout=15000 $(find test -name '*.spec.js'); node scripts/strip-comment-coverage.mjs coverage/lcov.info",
"test-coverage-html": "npm run test-lcov; genhtml coverage/lcov.info --output-directory coverage/html --ignore-errors inconsistent,corrupt,format,mismatch && echo \"Coverage report: file://$(pwd)/coverage/html/index.html\"",
"test-dev": "npm run test && npm run clean-js && npm run clean-typedefs && npm run clean-maps",
"clean-typedefs": "find . -name '*.d.ts' -not -wholename '*node_modules*' -not -wholename '*generator*' -type f -delete",
Expand Down Expand Up @@ -50,5 +50,20 @@
"typescript": "^7.0.2"
},
"main": "index.js",
"types": "index.d.ts"
"types": "index.d.ts",
"type": "module",
"engines": {
"node": ">=22.12.0"
},
"exports": {
".": {
"types": "./index.d.ts",
"default": "./index.js"
},
"./debug": {
"types": "./debug.d.ts",
"default": "./debug.js"
},
"./package.json": "./package.json"
}
}
5 changes: 4 additions & 1 deletion src/ClusterManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
import { IMessageQueueConnection, IServerInput } from './IMessageQueue';
import { randomUUID } from 'node:crypto';
import {
type IMessageQueueConnection,
type IServerInput,
} from './IMessageQueue.js';

export interface ICluster {
add: (server: IServerInput) => IMessageQueueConnection;
Expand Down
20 changes: 10 additions & 10 deletions src/ClusteredRedisQueue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,20 @@
* <support@imqueue.com> to get commercial licensing options.
*/
import { EventEmitter } from 'node:events';
import { InitializedCluster } from './ClusterManager';
import { buildOptions, copyEventEmitter } from './helpers';
import { type InitializedCluster } from './ClusterManager.js';
import { buildOptions, copyEventEmitter } from './helpers/index.js';
import {
DEFAULT_IMQ_OPTIONS,
EventMap,
ILogger,
IMessageQueue,
IMessageQueueConnection,
type EventMap,
type ILogger,
type IMessageQueue,
type IMessageQueueConnection,
IMQMode,
IMQOptions,
IServerInput,
JsonObject,
type IMQOptions,
type IServerInput,
type JsonObject,
RedisQueue,
} from '.';
} from './index.js';

/**
* Time (ms) send() waits for the first cluster server to become available
Expand Down
4 changes: 2 additions & 2 deletions src/IMessageQueue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
* <support@imqueue.com> to get commercial licensing options.
*/
import { EventEmitter } from 'node:events';
import { IMQMode } from './IMQMode';
import { ClusterManager } from './ClusterManager';
import { IMQMode } from './IMQMode.js';
import { ClusterManager } from './ClusterManager.js';

export { EventEmitter } from 'node:events';

Expand Down
20 changes: 10 additions & 10 deletions src/RedisQueue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@ import { EventEmitter } from 'node:events';
import { randomUUID } from 'node:crypto';
import { hostname } from 'node:os';
import {
IMessageQueue,
IRedisClient,
JsonObject,
IMQOptions,
IMessage,
ILogger,
type IMessageQueue,
type IRedisClient,
type JsonObject,
type IMQOptions,
type IMessage,
type ILogger,
IMQMode,
EventMap,
type EventMap,
profile,
} from '.';
} from './index.js';
import {
buildOptions,
escapeRegExp,
Expand All @@ -43,8 +43,8 @@ import {
sha1,
unpack,
envInt,
} from './helpers';
import Redis from './redis';
} from './helpers/index.js';
import Redis from './redis.js';

const RX_CLIENT_NAME = /name=(\S+)/g;
const RX_CLIENT_TEST = /:(reader|writer|watcher)/;
Expand Down
6 changes: 3 additions & 3 deletions src/UDPClusterManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
*/
import { join } from 'node:path';
import { Worker } from 'node:worker_threads';
import { ClusterManager, ICluster } from './ClusterManager';
import { ILogger, IServerInput } from './IMessageQueue';
import { ClusterManager, type ICluster } from './ClusterManager.js';
import { type ILogger, type IServerInput } from './IMessageQueue.js';

/** Shape of a message posted from the UDP worker thread */
interface WorkerMessage {
Expand Down Expand Up @@ -270,7 +270,7 @@ export class UDPClusterManager extends ClusterManager {
aliveTimeoutCorrection: this.options.aliveTimeoutCorrection,
useAliveCheck: this.options.useAliveCheck,
};
const worker = new Worker(join(__dirname, './UDPWorker.js'), {
const worker = new Worker(join(import.meta.dirname, './UDPWorker.js'), {
workerData,
});
const workerKey = this.workerKey;
Expand Down
4 changes: 2 additions & 2 deletions src/UDPWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ import {
workerData,
MessagePort,
} from 'node:worker_threads';
import { createSocket, Socket } from 'node:dgram';
import { createSocket, type Socket } from 'node:dgram';
import { networkInterfaces } from 'node:os';
import { randomUUID } from 'node:crypto';
import { UDPWorkerOptions } from './UDPClusterManager';
import { type UDPWorkerOptions } from './UDPClusterManager.js';

enum MessageType {
Up = 'up',
Expand Down
16 changes: 8 additions & 8 deletions src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
export * from './buildOptions';
export * from './sha1';
export * from './randomInt';
export * from './pack';
export * from './unpack';
export * from './escapeRegExp';
export * from './copyEventEmitter';
export * from './envInt';
export * from './buildOptions.js';
export * from './sha1.js';
export * from './randomInt.js';
export * from './pack.js';
export * from './unpack.js';
export * from './escapeRegExp.js';
export * from './copyEventEmitter.js';
export * from './envInt.js';
14 changes: 7 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
export * from './profile';
export * from './redis';
export * from './IMQMode';
export * from './IMessageQueue';
export * from './RedisQueue';
export * from './ClusteredRedisQueue';
export * from './UDPClusterManager';
export * from './profile.js';
export * from './redis.js';
export * from './IMQMode.js';
export * from './IMessageQueue.js';
export * from './RedisQueue.js';
export * from './ClusteredRedisQueue.js';
export * from './UDPClusterManager.js';
2 changes: 1 addition & 1 deletion src/profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
import { ILogger } from '.';
import { type ILogger } from './index.js';

export enum LogLevel {
LOG = 'log',
Expand Down
2 changes: 1 addition & 1 deletion src/redis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
import Redis from 'ioredis';
import { Redis } from 'ioredis';

/**
* Extends the default Redis type to allow dynamic properties access on it
Expand Down
2 changes: 1 addition & 1 deletion test/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
export * from './makeLogger';
export * from './makeLogger.js';
2 changes: 1 addition & 1 deletion test/helpers/makeLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
import { ILogger } from '../../src';
import { type ILogger } from '../../src/index.js';

/**
* Builds a fresh no-op logger suitable for spying on in unit tests.
Expand Down
2 changes: 1 addition & 1 deletion test/mocks/dgram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* <support@imqueue.com> to get commercial licensing options.
*/
import { EventEmitter } from 'node:events';
import { mockBuiltin } from './mockBuiltin';
import { mockBuiltin } from './mockBuiltin.js';

class Socket extends EventEmitter {
public bindArgs: any[] = [];
Expand Down
10 changes: 5 additions & 5 deletions test/mocks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
* purchase a proprietary commercial license. Please contact us at
* <support@imqueue.com> to get commercial licensing options.
*/
export * from './mockBuiltin';
export * from './redis';
export * from './logger';
export * from './dgram';
export * from './os';
export * from './mockBuiltin.js';
export * from './redis.js';
export * from './logger.js';
export * from './dgram.js';
export * from './os.js';
Loading
Loading