@nmtjs/common 0.15.0-beta.5 → 0.15.0-beta.51
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/README.md +31 -1
- package/dist/abortSignal.js +7 -6
- package/dist/abortSignal.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/streams.d.ts +2 -2
- package/dist/streams.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/utils.js.map +1 -1
- package/package.json +8 -5
- package/src/abortSignal.ts +11 -6
- package/src/streams.ts +2 -2
- package/src/types.ts +8 -10
package/README.md
CHANGED
|
@@ -6,4 +6,34 @@
|
|
|
6
6
|
- binary data streaming and event subscriptions
|
|
7
7
|
- contract-based API
|
|
8
8
|
- end-to-end type safety
|
|
9
|
-
- CPU-intensive task execution on separate workers
|
|
9
|
+
- CPU-intensive task execution on separate workers
|
|
10
|
+
|
|
11
|
+
## Jobs E2E (Local Docker)
|
|
12
|
+
|
|
13
|
+
Prerequisites:
|
|
14
|
+
- Docker Desktop (or Docker Engine) with `docker compose` available
|
|
15
|
+
|
|
16
|
+
No host ports are exposed in this setup. Tests run fully inside Docker containers.
|
|
17
|
+
The test image is optimized for Docker layer caching with `pnpm fetch` + offline install.
|
|
18
|
+
|
|
19
|
+
Run both backends with one command:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm run test:e2e:jobs:docker
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This command rebuilds the test image on each run and executes Redis + Valkey suites in one pass.
|
|
26
|
+
|
|
27
|
+
Run Jobs E2E directly in Docker:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
docker compose -f docker-compose.jobs-e2e.yml run --rm --build test-jobs
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Manual Docker control:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
docker compose -f docker-compose.jobs-e2e.yml up -d --wait redis valkey
|
|
37
|
+
docker compose -f docker-compose.jobs-e2e.yml run --rm --build test-jobs
|
|
38
|
+
docker compose -f docker-compose.jobs-e2e.yml down -v --remove-orphans
|
|
39
|
+
```
|
package/dist/abortSignal.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const isNode = !('Bun' in globalThis) && globalThis.process?.release?.name === 'node';
|
|
1
2
|
/**
|
|
2
3
|
* Combines multiple AbortSignals into one that aborts when any of the source signals abort.
|
|
3
4
|
*
|
|
@@ -9,13 +10,13 @@
|
|
|
9
10
|
export function anyAbortSignal(...signals) {
|
|
10
11
|
const filtered = signals.filter(Boolean);
|
|
11
12
|
if (filtered.length === 0) {
|
|
12
|
-
|
|
13
|
+
throw new Error('No AbortSignals provided');
|
|
13
14
|
}
|
|
14
15
|
if (filtered.length === 1) {
|
|
15
16
|
return filtered[0];
|
|
16
17
|
}
|
|
17
18
|
// Use native implementation on Bun (no memory leak there)
|
|
18
|
-
if (
|
|
19
|
+
if (!isNode) {
|
|
19
20
|
return AbortSignal.any(filtered);
|
|
20
21
|
}
|
|
21
22
|
// Custom implementation for Node.js to avoid memory leaks
|
|
@@ -29,8 +30,8 @@ export function anyAbortSignal(...signals) {
|
|
|
29
30
|
}
|
|
30
31
|
// Track cleanup functions
|
|
31
32
|
const cleanups = [];
|
|
32
|
-
const onAbort = () => {
|
|
33
|
-
controller.abort();
|
|
33
|
+
const onAbort = (signal) => {
|
|
34
|
+
controller.abort(signal.reason);
|
|
34
35
|
// Clean up all listeners immediately after abort
|
|
35
36
|
cleanup();
|
|
36
37
|
};
|
|
@@ -42,8 +43,8 @@ export function anyAbortSignal(...signals) {
|
|
|
42
43
|
};
|
|
43
44
|
// Attach listeners to all signals
|
|
44
45
|
for (const signal of filtered) {
|
|
45
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
46
|
-
cleanups.push(() => signal.removeEventListener('abort', onAbort));
|
|
46
|
+
signal.addEventListener('abort', () => onAbort(signal), { once: true });
|
|
47
|
+
cleanups.push(() => signal.removeEventListener('abort', () => onAbort(signal)));
|
|
47
48
|
}
|
|
48
49
|
return controller.signal;
|
|
49
50
|
}
|
package/dist/abortSignal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abortSignal.js","sourceRoot":"","sources":["../src/abortSignal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAG,OAAoC;
|
|
1
|
+
{"version":3,"file":"abortSignal.js","sourceRoot":"","sources":["../src/abortSignal.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GACV,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,KAAK,MAAM,CAAA;AAExE;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAG,OAAoC,EAC1B;IACb,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAkB,CAAA;IAEzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,0DAA0D;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,yCAAyC;IACzC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,KAAK,EAAE,CAAA;YAClB,OAAO,UAAU,CAAC,MAAM,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAmB,EAAE,CAAA;IAEnC,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAE,EAAE,CAAC;QACvC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/B,iDAAiD;QACjD,OAAO,EAAE,CAAA;IAAA,CACV,CAAA;IAED,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,EAAE,EAAE,CAAA;QACN,CAAC;QACD,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IAAA,CACpB,CAAA;IAED,kCAAkC;IAClC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CACjB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAC3D,CAAA;IACH,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAA;AAAA,CACzB"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
1
|
+
export * from './abortSignal.js';
|
|
2
|
+
export * from './constants.js';
|
|
3
|
+
export * from './streams.js';
|
|
4
|
+
export * from './types.js';
|
|
5
|
+
export * from './utils.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/streams.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MaybePromise } from './types.ts';
|
|
2
2
|
export interface DuplexStreamOptions<O = unknown, I = O> {
|
|
3
3
|
start?: (controller: ReadableStreamDefaultController<O>) => void;
|
|
4
|
-
pull?: (controller: ReadableStreamDefaultController<O>) =>
|
|
4
|
+
pull?: (controller: ReadableStreamDefaultController<O>) => MaybePromise<void>;
|
|
5
5
|
cancel?: (reason: unknown) => void;
|
|
6
6
|
transform?: (chunk: I) => O;
|
|
7
7
|
close?: () => void;
|
package/dist/streams.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAc1D,MAAM,OAAO,YAAY;IACd,QAAQ,CAAmB;IAC3B,QAAQ,CAAoB;IAErC,YAAY,
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAc1D,MAAM,OAAO,YAAY;IACd,QAAQ,CAAmB;IAC3B,QAAQ,CAAoB;IAErC,YAAY,OAAO,GAA8B,EAAE,EAAE;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAChC;YACE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBACrB,mBAAmB;gBACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAChC;oBACE,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;wBACjB,MAAM,KAAK,GAAG,OAAO,EAAE,SAAS;4BAC9B,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC;4BAC5B,CAAC,CAAC,MAAM,CAAA;wBACV,UAAU,CAAC,OAAO,CAAC,KAAU,CAAC,CAAA;oBAAA,CAC/B;oBACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC3C,KAAK,EAAE,GAAG,EAAE,CAAC;wBACX,OAAO,EAAE,KAAK,EAAE,EAAE,CAAA;wBAClB,IAAI,CAAC;4BACH,UAAU,CAAC,KAAK,EAAE,CAAA;wBACpB,CAAC;wBAAC,MAAM,CAAC;4BACP,sDAAsD;wBACxD,CAAC;oBAAA,CACF;iBACF,EACD,OAAO,CAAC,gBAAgB,CACzB,CAAA;gBACD,OAAO,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAA;YAAA,CAC5B;YACD,IAAI,EAAE,OAAO,EAAE,IAAI;SACpB,EACD,OAAO,CAAC,gBAAgB,CACzB,CAAA;IAAA,CACF;CACF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
declare const TSErrorSymbol: unique symbol;
|
|
2
|
-
export type TSError<
|
|
2
|
+
export type TSError<ErrorMessage extends string = string, TagType = never> = `TS Error: ${ErrorMessage}` & {
|
|
3
3
|
[TSErrorSymbol]: true;
|
|
4
4
|
};
|
|
5
5
|
export interface TypeProvider {
|
|
@@ -16,7 +16,7 @@ export type Callback<T extends any[] = any[], R = any> = (...args: T) => R;
|
|
|
16
16
|
export type OmitFirstItem<T extends any[]> = T extends [any, ...infer U] ? U : [];
|
|
17
17
|
export type ErrorClass = new (...args: any[]) => Error;
|
|
18
18
|
export type Extra = Record<string, any>;
|
|
19
|
-
export type
|
|
19
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
20
20
|
export type ArrayMap<T extends readonly any[], K extends keyof T[number]> = {
|
|
21
21
|
[I in keyof T]: T[I][K];
|
|
22
22
|
};
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nmtjs/common",
|
|
3
|
+
"description": "Shared zero-dependency utilities for Neemata packages.",
|
|
3
4
|
"type": "module",
|
|
4
5
|
"exports": {
|
|
5
|
-
".":
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"import": "./dist/index.js",
|
|
9
|
+
"module-sync": "./dist/index.js"
|
|
10
|
+
}
|
|
6
11
|
},
|
|
7
12
|
"files": [
|
|
8
13
|
"dist",
|
|
@@ -10,10 +15,8 @@
|
|
|
10
15
|
"LICENSE.md",
|
|
11
16
|
"README.md"
|
|
12
17
|
],
|
|
13
|
-
"version": "0.15.0-beta.
|
|
18
|
+
"version": "0.15.0-beta.51",
|
|
14
19
|
"scripts": {
|
|
15
|
-
"clean-build": "rm -rf ./dist"
|
|
16
|
-
"build": "tsc --declaration --sourceMap",
|
|
17
|
-
"type-check": "tsc --noEmit"
|
|
20
|
+
"clean-build": "rm -rf ./dist"
|
|
18
21
|
}
|
|
19
22
|
}
|
package/src/abortSignal.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
const isNode =
|
|
2
|
+
!('Bun' in globalThis) && globalThis.process?.release?.name === 'node'
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Combines multiple AbortSignals into one that aborts when any of the source signals abort.
|
|
3
6
|
*
|
|
@@ -12,7 +15,7 @@ export function anyAbortSignal(
|
|
|
12
15
|
const filtered = signals.filter(Boolean) as AbortSignal[]
|
|
13
16
|
|
|
14
17
|
if (filtered.length === 0) {
|
|
15
|
-
|
|
18
|
+
throw new Error('No AbortSignals provided')
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
if (filtered.length === 1) {
|
|
@@ -20,7 +23,7 @@ export function anyAbortSignal(
|
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
// Use native implementation on Bun (no memory leak there)
|
|
23
|
-
if (
|
|
26
|
+
if (!isNode) {
|
|
24
27
|
return AbortSignal.any(filtered)
|
|
25
28
|
}
|
|
26
29
|
|
|
@@ -38,8 +41,8 @@ export function anyAbortSignal(
|
|
|
38
41
|
// Track cleanup functions
|
|
39
42
|
const cleanups: (() => void)[] = []
|
|
40
43
|
|
|
41
|
-
const onAbort = () => {
|
|
42
|
-
controller.abort()
|
|
44
|
+
const onAbort = (signal: AbortSignal) => {
|
|
45
|
+
controller.abort(signal.reason)
|
|
43
46
|
// Clean up all listeners immediately after abort
|
|
44
47
|
cleanup()
|
|
45
48
|
}
|
|
@@ -53,8 +56,10 @@ export function anyAbortSignal(
|
|
|
53
56
|
|
|
54
57
|
// Attach listeners to all signals
|
|
55
58
|
for (const signal of filtered) {
|
|
56
|
-
signal.addEventListener('abort', onAbort, { once: true })
|
|
57
|
-
cleanups.push(() =>
|
|
59
|
+
signal.addEventListener('abort', () => onAbort(signal), { once: true })
|
|
60
|
+
cleanups.push(() =>
|
|
61
|
+
signal.removeEventListener('abort', () => onAbort(signal)),
|
|
62
|
+
)
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
return controller.signal
|
package/src/streams.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// TODO: add proper queueing/backpressure strategy support
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { MaybePromise } from './types.ts'
|
|
4
4
|
|
|
5
5
|
export interface DuplexStreamOptions<O = unknown, I = O> {
|
|
6
6
|
start?: (controller: ReadableStreamDefaultController<O>) => void
|
|
7
|
-
pull?: (controller: ReadableStreamDefaultController<O>) =>
|
|
7
|
+
pull?: (controller: ReadableStreamDefaultController<O>) => MaybePromise<void>
|
|
8
8
|
cancel?: (reason: unknown) => void
|
|
9
9
|
transform?: (chunk: I) => O
|
|
10
10
|
close?: () => void
|
package/src/types.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
const TSErrorSymbol: unique symbol = Symbol('TSError')
|
|
2
2
|
|
|
3
|
-
export type TSError<
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
export type TSError<
|
|
4
|
+
ErrorMessage extends string = string,
|
|
5
|
+
// biome-ignore lint/correctness/noUnusedVariables: this is used to tag the type
|
|
6
|
+
TagType = never,
|
|
7
|
+
> = `TS Error: ${ErrorMessage}` & { [TSErrorSymbol]: true }
|
|
6
8
|
|
|
7
9
|
export interface TypeProvider {
|
|
8
10
|
readonly input: unknown
|
|
@@ -22,12 +24,8 @@ export type ClassConstructor<T = any, A extends any[] = any[]> =
|
|
|
22
24
|
) => T)
|
|
23
25
|
|
|
24
26
|
export type ClassInstance<T> = T extends ClassConstructor<infer U> ? U : never
|
|
25
|
-
export type ClassConstructorArgs<T, A = never> =
|
|
26
|
-
any,
|
|
27
|
-
infer U
|
|
28
|
-
>
|
|
29
|
-
? U
|
|
30
|
-
: A
|
|
27
|
+
export type ClassConstructorArgs<T, A = never> =
|
|
28
|
+
T extends ClassConstructor<any, infer U> ? U : A
|
|
31
29
|
|
|
32
30
|
export type Callback<T extends any[] = any[], R = any> = (...args: T) => R
|
|
33
31
|
export type OmitFirstItem<T extends any[]> = T extends [any, ...infer U]
|
|
@@ -35,7 +33,7 @@ export type OmitFirstItem<T extends any[]> = T extends [any, ...infer U]
|
|
|
35
33
|
: []
|
|
36
34
|
export type ErrorClass = new (...args: any[]) => Error
|
|
37
35
|
export type Extra = Record<string, any>
|
|
38
|
-
export type
|
|
36
|
+
export type MaybePromise<T> = T | Promise<T>
|
|
39
37
|
|
|
40
38
|
export type ArrayMap<T extends readonly any[], K extends keyof T[number]> = {
|
|
41
39
|
[I in keyof T]: T[I][K]
|