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.
- package/README.md +39 -0
- package/index.d.ts +11 -0
- package/index.js +29 -0
- 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
|
+
}
|