jdisposer 0.0.1

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 (4) hide show
  1. package/README.md +39 -0
  2. package/index.d.ts +11 -0
  3. package/index.js +29 -0
  4. package/package.json +21 -0
package/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # jdisposer - A Resource Management Library
2
+
3
+ Manage cleanup of resources with AbortSignal integration.
4
+
5
+ ### Sample Usage
6
+
7
+ ```typescript
8
+ import { makeDisposer } from 'jdisposer'
9
+
10
+ const disposer = makeDisposer()
11
+
12
+ // Use with fetch API
13
+ fetch('/api/data', { signal: disposer.signal })
14
+
15
+ // Add cleanup functions
16
+ disposer.add(() => console.log('Cleanup 1'))
17
+ disposer.add(() => console.log('Cleanup 2'))
18
+
19
+ // Clean up everything (aborts signal and calls cleanup functions)
20
+ disposer.dispose() // Subsequent calls are no-op
21
+ ```
22
+
23
+ ### API
24
+
25
+ `makeDisposer()`: Creates a new Disposer instance
26
+ `Disposer` object has the following properties:
27
+ - `dispose()`: Abort signal and call all cleanup functions (no-op if already disposed)
28
+ - `signal`: AbortSignal that's aborted when disposed
29
+ - `add(fn?)`: Add cleanup function
30
+ - Ignores falsy values
31
+ - Calls immediately if already disposed
32
+ - Functions called in reverse order on dispose
33
+
34
+ `makeReset()`: Creates a resettable disposer pattern
35
+ - Returns a reset function that when called:
36
+ - Disposes the current disposer
37
+ - Creates and returns a new disposer instance
38
+ - Useful for managing resources that need periodic cleanup and recreation
39
+
package/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export type Disposer = ReturnType<typeof makeDisposer>;
2
+ export declare function makeDisposer(): {
3
+ add(this: void, dispose?: void | (() => void)): void;
4
+ dispose(this: void): void;
5
+ signal: AbortSignal;
6
+ };
7
+ export declare function makeReset(): () => {
8
+ add(this: void, dispose?: void | (() => void)): void;
9
+ dispose(this: void): void;
10
+ signal: AbortSignal;
11
+ };
package/index.js ADDED
@@ -0,0 +1,29 @@
1
+ export function makeDisposer() {
2
+ const disposeFns = [];
3
+ const abortController = new AbortController();
4
+ return {
5
+ add(dispose) {
6
+ if (!dispose)
7
+ return;
8
+ if (abortController.signal.aborted)
9
+ dispose();
10
+ else
11
+ disposeFns.push(dispose);
12
+ },
13
+ dispose() {
14
+ if (abortController.signal.aborted)
15
+ return;
16
+ abortController.abort();
17
+ for (const dispose of disposeFns.slice().reverse())
18
+ dispose();
19
+ },
20
+ signal: abortController.signal,
21
+ };
22
+ }
23
+ export function makeReset() {
24
+ let disposer = makeDisposer();
25
+ return () => {
26
+ disposer.dispose();
27
+ return (disposer = makeDisposer());
28
+ };
29
+ }
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "jdisposer",
3
+ "version": "0.0.1",
4
+ "scripts": {
5
+ "prepublishOnly": "npx tsc index.ts --lib esnext,dom --target esnext --declaration --skipLibCheck",
6
+ "test": "node --test *.test.ts",
7
+ "test:coverage": "node --test --experimental-test-coverage *.test.ts"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/tranvansang/jdisposer.git"
12
+ },
13
+ "files": [
14
+ "index.js",
15
+ "index.d.ts"
16
+ ],
17
+ "devDependencies": {
18
+ "@types/node": "^24.10.1",
19
+ "typescript": "^5.9.3"
20
+ }
21
+ }