@adviser/cement 0.4.64-dev → 0.4.65

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 (44) hide show
  1. package/README.md +168 -23
  2. package/cjs/on-func.cjs +24 -3
  3. package/cjs/on-func.cjs.map +1 -1
  4. package/cjs/on-func.d.ts +9 -4
  5. package/cjs/on-func.d.ts.map +1 -1
  6. package/cjs/on-func.test.cjs +39 -0
  7. package/cjs/on-func.test.cjs.map +1 -1
  8. package/cjs/on-func.test.d.ts.map +1 -1
  9. package/cjs/version.cjs +1 -1
  10. package/cjs/version.cjs.map +1 -1
  11. package/cjs/version.d.ts.map +1 -1
  12. package/deno.json +1 -1
  13. package/esm/on-func.d.ts +9 -4
  14. package/esm/on-func.d.ts.map +1 -1
  15. package/esm/on-func.js +23 -3
  16. package/esm/on-func.js.map +1 -1
  17. package/esm/on-func.test.d.ts.map +1 -1
  18. package/esm/on-func.test.js +40 -1
  19. package/esm/on-func.test.js.map +1 -1
  20. package/esm/version.d.ts.map +1 -1
  21. package/esm/version.js +1 -1
  22. package/esm/version.js.map +1 -1
  23. package/package.json +2 -2
  24. package/src/on-func.ts +41 -13
  25. package/ts/cjs/on-func.d.ts +9 -4
  26. package/ts/cjs/on-func.d.ts.map +1 -1
  27. package/ts/cjs/on-func.js +24 -3
  28. package/ts/cjs/on-func.js.map +1 -1
  29. package/ts/cjs/on-func.test.d.ts.map +1 -1
  30. package/ts/cjs/on-func.test.js +39 -0
  31. package/ts/cjs/on-func.test.js.map +1 -1
  32. package/ts/cjs/version.d.ts.map +1 -1
  33. package/ts/cjs/version.js +1 -1
  34. package/ts/cjs/version.js.map +1 -1
  35. package/ts/esm/on-func.d.ts +9 -4
  36. package/ts/esm/on-func.d.ts.map +1 -1
  37. package/ts/esm/on-func.js +23 -3
  38. package/ts/esm/on-func.js.map +1 -1
  39. package/ts/esm/on-func.test.d.ts.map +1 -1
  40. package/ts/esm/on-func.test.js +40 -1
  41. package/ts/esm/on-func.test.js.map +1 -1
  42. package/ts/esm/version.d.ts.map +1 -1
  43. package/ts/esm/version.js +1 -1
  44. package/ts/esm/version.js.map +1 -1
package/README.md CHANGED
@@ -1,12 +1,19 @@
1
- # cement
1
+ # Cement
2
2
 
3
- An Agnostic Platform Wrapper
3
+ An agnostic platform abstraction layer for TypeScript/JavaScript and Go that provides consistent APIs across Node.js, Deno, Cloudflare Workers, and other runtimes.
4
4
 
5
- which Provides:
5
+ ## Overview
6
+
7
+ Cement provides a unified interface for common system operations, logging, and utilities across different JavaScript/TypeScript runtimes and Go. Write your code once and run it anywhere - whether that's Node.js, Deno, browsers, or Cloudflare Workers.
8
+
9
+ ## Key Features
10
+
11
+ ### System Abstraction
12
+
13
+ Cross-platform system operations through a unified interface:
6
14
 
7
- - SysAbstraction
8
15
  ```typescript
9
- export interface SysAbstraction {
16
+ interface SysAbstraction {
10
17
  Time(): Time;
11
18
  Stdout(): WritableStream<Uint8Array>;
12
19
  Stderr(): WritableStream<Uint8Array>;
@@ -16,24 +23,162 @@ export interface SysAbstraction {
16
23
  FileSystem(): FileService;
17
24
  }
18
25
  ```
19
- - Logger inspired from golang zlogger
26
+
27
+ ### Structured Logging
28
+
29
+ Inspired by Go's zerolog, providing efficient structured logging:
30
+
31
+ ```typescript
32
+ logger
33
+ .Str("user", "john")
34
+ .Uint64("id", 123)
35
+ .Info()
36
+ .Log("User logged in");
37
+ ```
38
+
39
+ ### Additional Utilities
40
+
41
+ - **Result & Option Types**: Type-safe error handling inspired by Rust
42
+ - **Future**: Promise-based async utilities
43
+ - **URI Handling**: Mutable URL utilities for safe URL manipulation
44
+ - **Crypto**: Platform-agnostic cryptographic operations
45
+ - **Tracer**: Distributed tracing support
46
+ - **LRU Cache**: Efficient least-recently-used cache implementation
47
+ - **Path Operations**: Cross-platform path manipulation
48
+ - **HTTP Headers**: Type-safe HTTP header utilities
49
+ - **Poller**: Polling utilities with configurable intervals
50
+ - **Timeouted**: Timeout wrapper for async operations
51
+
52
+ ## Installation
53
+
54
+ ### npm (Node.js)
55
+
56
+ ```bash
57
+ npm install @adviser/cement
58
+ ```
59
+
60
+ ### pnpm
61
+
62
+ ```bash
63
+ pnpm add @adviser/cement
64
+ ```
65
+
66
+ ### Deno
67
+
68
+ ```typescript
69
+ import { ... } from "jsr:@adviser/cement";
70
+ ```
71
+
72
+ ### Go
73
+
74
+ ```bash
75
+ go get github.com/mabels/cement
76
+ ```
77
+
78
+ ## Usage
79
+
80
+ ### Basic Example
81
+
82
+ ```typescript
83
+ import { BuildBasicSystemService } from "@adviser/cement/node";
84
+
85
+ const sys = BuildBasicSystemService();
86
+ const logger = sys.Logger();
87
+
88
+ logger
89
+ .Str("module", "app")
90
+ .Info()
91
+ .Log("Application started");
92
+
93
+ // Use file system operations
94
+ const fs = sys.FileSystem();
95
+ await fs.writeFile("output.txt", "Hello World");
96
+ ```
97
+
98
+ ### Platform-Specific Imports
99
+
100
+ ```typescript
101
+ // Node.js
102
+ import { BuildBasicSystemService } from "@adviser/cement/node";
103
+
104
+ // Deno
105
+ import { BuildBasicSystemService } from "@adviser/cement/deno";
106
+
107
+ // Cloudflare Workers
108
+ import { BuildBasicSystemService } from "@adviser/cement/cf";
109
+
110
+ // Browser/Web
111
+ import { BuildBasicSystemService } from "@adviser/cement/web";
112
+ ```
113
+
114
+ ### Result Type for Error Handling
115
+
20
116
  ```typescript
21
- export interface LoggerInterface<R> {
22
- Module(key: string): R;
23
- SetDebug(...modules: (string | string[])[]): R;
24
-
25
- Str(key: string, value: string): R;
26
- Error(): R;
27
- Warn(): R;
28
- Debug(): R;
29
- Log(): R;
30
- WithLevel(level: Level): R;
31
-
32
- Err(err: unknown): R; // could be Error, or something which coerces to string
33
- Info(): R;
34
- Timestamp(): R;
35
- Any(key: string, value: unknown): R;
36
- Dur(key: string, nsec: number): R;
37
- Uint64(key: string, value: number): R;
117
+ import { Result } from "@adviser/cement";
118
+
119
+ function divide(a: number, b: number): Result<number> {
120
+ if (b === 0) {
121
+ return Result.Err(new Error("Division by zero"));
122
+ }
123
+ return Result.Ok(a / b);
124
+ }
125
+
126
+ const result = divide(10, 2);
127
+ if (result.isOk()) {
128
+ console.log("Result:", result.unwrap());
129
+ } else {
130
+ console.error("Error:", result.unwrapErr());
38
131
  }
39
132
  ```
133
+
134
+ ## Documentation
135
+
136
+ For comprehensive documentation, API references, and advanced usage examples, visit:
137
+
138
+ **[https://mabels.github.io/cement](https://mabels.github.io/cement)**
139
+
140
+ ## Supported Platforms
141
+
142
+ - **Node.js** (>= 20.19.0)
143
+ - **Deno**
144
+ - **Cloudflare Workers**
145
+ - **Web Browsers**
146
+ - **Go** (>= 1.22.0)
147
+
148
+ ## Development
149
+
150
+ ```bash
151
+ # Install dependencies
152
+ pnpm install
153
+
154
+ # Run tests
155
+ pnpm test
156
+
157
+ # Run tests for specific platform
158
+ pnpm test:js # Node.js/JavaScript tests
159
+ pnpm test:deno # Deno tests
160
+
161
+ # Build
162
+ pnpm build
163
+
164
+ # Lint
165
+ pnpm lint
166
+
167
+ # Format code
168
+ pnpm format
169
+ ```
170
+
171
+ ## Contributing
172
+
173
+ Contributions are welcome! Please feel free to submit a Pull Request.
174
+
175
+ ## License
176
+
177
+ Apache License 2.0 - See [LICENSE](LICENSE) for details.
178
+
179
+ ## Repository
180
+
181
+ - **GitHub**: [https://github.com/mabels/cement](https://github.com/mabels/cement)
182
+ - **Issues**: [https://github.com/mabels/cement/issues](https://github.com/mabels/cement/issues)
183
+ - **npm**: [@adviser/cement](https://www.npmjs.com/package/@adviser/cement)
184
+ - **JSR**: [@adviser/cement](https://jsr.io/@adviser/cement)
package/cjs/on-func.cjs CHANGED
@@ -1,18 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnFuncReturn = void 0;
3
4
  exports.OnFunc = OnFunc;
5
+ const is_promise_js_1 = require("./is-promise.cjs");
4
6
  class OnFuncInstance {
5
7
  #fns = new Set();
6
8
  addFunction(fn) {
7
9
  this.#fns.add(fn);
8
10
  return () => {
9
- this.#fns.delete(fn);
11
+ this.unreg(exports.OnFuncReturn.UNREGISTER, fn);
10
12
  };
11
13
  }
14
+ unreg(ret, fn) {
15
+ if (ret === exports.OnFuncReturn.UNREGISTER || ret === exports.OnFuncReturn.ONCE) {
16
+ this.#fns.delete(fn);
17
+ return undefined;
18
+ }
19
+ return ret;
20
+ }
12
21
  invoke(...a) {
13
22
  for (const fn of this.#fns) {
14
23
  try {
15
- fn(...a);
24
+ const couldByPlainOrPromise = fn(...a);
25
+ if ((0, is_promise_js_1.isPromise)(couldByPlainOrPromise)) {
26
+ void couldByPlainOrPromise.then((ret) => {
27
+ this.unreg(ret, fn);
28
+ });
29
+ }
30
+ else {
31
+ this.unreg(couldByPlainOrPromise, fn);
32
+ }
16
33
  }
17
34
  catch (e) {
18
35
  // ignore errors
@@ -23,9 +40,13 @@ class OnFuncInstance {
23
40
  this.#fns.clear();
24
41
  }
25
42
  async invokeAsync(...a) {
26
- await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a))));
43
+ await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a)).then((ret) => this.unreg(ret, fn))));
27
44
  }
28
45
  }
46
+ exports.OnFuncReturn = {
47
+ UNREGISTER: Symbol("ONFUNC_UNREGISTER"),
48
+ ONCE: Symbol("ONFUNC_ONCE"),
49
+ };
29
50
  function OnFunc() {
30
51
  const instance = new OnFuncInstance();
31
52
  const ret = instance.addFunction.bind(instance);
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":";;;AACA,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAA,CACtB,CAAC;IAAA,CACH;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CACxF;CACF;AAmDD,kBAAgG;IAC9F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAmB,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAkC,CAAC;IACjF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA4C,CAAC;IACvF,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAiD,CAAC;IACtG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA2C,CAAC;IACpF,OAAO,GAAG,CAAC;AAAA,CACZ"}
1
+ {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":";;;;AAAA,mDAA4C;AAG5C,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,QAAA,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAAA,CACzC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,GAAY,EAAE,EAA2B,EAAW;QAEhE,IAAI,GAAG,KAAK,QAAA,YAAY,CAAC,UAAU,IAAI,GAAG,KAAK,QAAA,YAAY,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACZ;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,IAAI,IAAA,yBAAS,EAAC,qBAAqB,CAAC,EAAE,CAAC;oBACrC,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAAA,CACrB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3H;CACF;AAEY,QAAA,YAAY,GAGrB;IACF,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;CACnB,CAAC;AAqDX,kBAAyH;IACvH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAsB,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAqC,CAAC;IACpF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA+C,CAAC;IAC1F,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAoD,CAAC;IACzG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA8C,CAAC;IACvF,OAAO,GAAG,CAAC;AAAA,CACZ"}
package/cjs/on-func.d.ts CHANGED
@@ -1,10 +1,15 @@
1
- interface ReturnOnFunc<Args extends any[]> {
2
- (fn: (...a: Args) => unknown): () => void;
1
+ export declare const OnFuncReturn: {
2
+ readonly UNREGISTER: symbol;
3
+ readonly ONCE: symbol;
4
+ };
5
+ export type OnFuncReturn = (typeof OnFuncReturn)[keyof typeof OnFuncReturn];
6
+ interface ReturnOnFunc<Args extends any[], X = unknown> {
7
+ (fn: (...a: Args) => OnFuncReturn | X): () => unknown;
3
8
  invoke(...a: Args): void;
4
9
  invokeAsync(...a: Args): Promise<void>;
5
10
  clear(): void;
6
11
  }
7
- type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
8
- export declare function OnFunc<Fn extends (...args: any[]) => unknown>(): ReturnOnFunc<ExtractArgs<Fn>>;
12
+ type ExtractArgs<T, X> = T extends (...args: infer A) => OnFuncReturn | X ? A : never;
13
+ export declare function OnFunc<Fn extends (...args: any[]) => OnFuncReturn | X, X = unknown>(): ReturnOnFunc<ExtractArgs<Fn, X>>;
9
14
  export {};
10
15
  //# sourceMappingURL=on-func.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AA+BA,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE;IACvC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAyC1E,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAO9F"}
1
+ {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,YAAY,EAAE;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CAId,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAG5E,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO;IACpD,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AA0CtF,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAOvH"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const future_js_1 = require("./future.cjs");
3
4
  const on_func_js_1 = require("./on-func.cjs");
4
5
  const promise_sleep_js_1 = require("./promise-sleep.cjs");
5
6
  class OnFunctionTest {
@@ -55,4 +56,42 @@ it("OnFunctionTest clear", () => {
55
56
  test.onFunAction.invoke(1, "23");
56
57
  expect(fn.mock.calls).toEqual([]);
57
58
  });
59
+ it("OnFunctionTest unregister from the callback", async () => {
60
+ const test = new OnFunctionTest();
61
+ const fn2 = vi.fn();
62
+ let fn1Stop = 2;
63
+ const fn1 = vi.fn(() => {
64
+ return --fn1Stop === 0 ? on_func_js_1.OnFuncReturn.UNREGISTER : undefined;
65
+ });
66
+ let fn3Stop = 2;
67
+ const waitForFn3 = new future_js_1.Future();
68
+ const fn3 = vi.fn(() => {
69
+ if (--fn3Stop === 0) {
70
+ waitForFn3.resolve();
71
+ return on_func_js_1.OnFuncReturn.UNREGISTER;
72
+ }
73
+ });
74
+ test.onFunAction(fn1);
75
+ test.onFunAction(fn2);
76
+ test.onFunAction(fn3);
77
+ test.onFunAction.invoke(1, "13");
78
+ test.onFunAction.invoke(2, "23");
79
+ test.onFunAction.invoke(3, "33");
80
+ test.onFunAction.invoke(4, "43");
81
+ await waitForFn3.asPromise();
82
+ expect(fn1.mock.calls).toEqual([
83
+ [1, "13"],
84
+ [2, "23"],
85
+ ]);
86
+ expect(fn2.mock.calls).toEqual([
87
+ [1, "13"],
88
+ [2, "23"],
89
+ [3, "33"],
90
+ [4, "43"],
91
+ ]);
92
+ expect(fn3.mock.calls).toEqual([
93
+ [1, "13"],
94
+ [2, "23"],
95
+ ]);
96
+ });
58
97
  //# sourceMappingURL=on-func.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":";;AAAA,2CAAqC;AACrC,6CAAoD;AACpD,yDAA2C;AA0C3C,MAAM,cAAc;IACT,WAAW,GAAG,IAAA,mBAAM,GAAqC,CAAC;IAC1D,YAAY,GAAG,IAAA,mBAAM,GAAc,CAAC;IAEpC,SAAS,GAAG,IAAA,mBAAM,GAA6C,CAAC;IAChE,aAAa,GAAG,IAAA,mBAAM,GAA+D,CAAC;IACtF,mBAAmB,GAAG,IAAA,mBAAM,GAAqE,CAAC;CAC5G;AAED,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,IAAA,wBAAK,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAC,EAAE,IAAI,CAAC;YACT,CAAC,CAAC,EAAE,IAAI,CAAC;SACV,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;AAAA,CACF,CAAC,CAAC;AAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,CACnC,CAAC,CAAC;AAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAY,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAAA,CAC9D,CAAC,CAAC;IACH,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,UAAU,GAAG,IAAI,kBAAM,EAAQ,CAAC;IACtC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,EAAE,OAAO,KAAK,CAAC,EAAE,CAAC;YACpB,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,yBAAY,CAAC,UAAU,CAAC;QACjC,CAAC;IAAA,CACF,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAEtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,EAAE,IAAI,CAAC;QACT,CAAC,CAAC,EAAE,IAAI,CAAC;KACV,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,EAAE,IAAI,CAAC;QACT,CAAC,CAAC,EAAE,IAAI,CAAC;QACT,CAAC,CAAC,EAAE,IAAI,CAAC;QACT,CAAC,CAAC,EAAE,IAAI,CAAC;KACV,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,EAAE,IAAI,CAAC;QACT,CAAC,CAAC,EAAE,IAAI,CAAC;KACV,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
package/cjs/version.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.4.64-dev";
4
+ exports.VERSION = "0.4.65";
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAW,YAAY,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAW,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAiB,CAAC"}
package/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adviser/cement",
3
- "version": "0.4.64-dev",
3
+ "version": "0.4.65",
4
4
  "license": "AFL-2.0",
5
5
  "exports": {
6
6
  ".": "./src/index.ts",
package/esm/on-func.d.ts CHANGED
@@ -1,10 +1,15 @@
1
- interface ReturnOnFunc<Args extends any[]> {
2
- (fn: (...a: Args) => unknown): () => void;
1
+ export declare const OnFuncReturn: {
2
+ readonly UNREGISTER: symbol;
3
+ readonly ONCE: symbol;
4
+ };
5
+ export type OnFuncReturn = (typeof OnFuncReturn)[keyof typeof OnFuncReturn];
6
+ interface ReturnOnFunc<Args extends any[], X = unknown> {
7
+ (fn: (...a: Args) => OnFuncReturn | X): () => unknown;
3
8
  invoke(...a: Args): void;
4
9
  invokeAsync(...a: Args): Promise<void>;
5
10
  clear(): void;
6
11
  }
7
- type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
8
- export declare function OnFunc<Fn extends (...args: any[]) => unknown>(): ReturnOnFunc<ExtractArgs<Fn>>;
12
+ type ExtractArgs<T, X> = T extends (...args: infer A) => OnFuncReturn | X ? A : never;
13
+ export declare function OnFunc<Fn extends (...args: any[]) => OnFuncReturn | X, X = unknown>(): ReturnOnFunc<ExtractArgs<Fn, X>>;
9
14
  export {};
10
15
  //# sourceMappingURL=on-func.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AA+BA,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE;IACvC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAyC1E,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAO9F"}
1
+ {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,YAAY,EAAE;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CAId,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAG5E,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO;IACpD,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AA0CtF,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAOvH"}
package/esm/on-func.js CHANGED
@@ -1,15 +1,31 @@
1
+ import { isPromise } from "./is-promise.js";
1
2
  class OnFuncInstance {
2
3
  #fns = new Set();
3
4
  addFunction(fn) {
4
5
  this.#fns.add(fn);
5
6
  return () => {
6
- this.#fns.delete(fn);
7
+ this.unreg(OnFuncReturn.UNREGISTER, fn);
7
8
  };
8
9
  }
10
+ unreg(ret, fn) {
11
+ if (ret === OnFuncReturn.UNREGISTER || ret === OnFuncReturn.ONCE) {
12
+ this.#fns.delete(fn);
13
+ return undefined;
14
+ }
15
+ return ret;
16
+ }
9
17
  invoke(...a) {
10
18
  for (const fn of this.#fns) {
11
19
  try {
12
- fn(...a);
20
+ const couldByPlainOrPromise = fn(...a);
21
+ if (isPromise(couldByPlainOrPromise)) {
22
+ void couldByPlainOrPromise.then((ret) => {
23
+ this.unreg(ret, fn);
24
+ });
25
+ }
26
+ else {
27
+ this.unreg(couldByPlainOrPromise, fn);
28
+ }
13
29
  }
14
30
  catch (e) {
15
31
  // ignore errors
@@ -20,9 +36,13 @@ class OnFuncInstance {
20
36
  this.#fns.clear();
21
37
  }
22
38
  async invokeAsync(...a) {
23
- await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a))));
39
+ await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a)).then((ret) => this.unreg(ret, fn))));
24
40
  }
25
41
  }
42
+ export const OnFuncReturn = {
43
+ UNREGISTER: Symbol("ONFUNC_UNREGISTER"),
44
+ ONCE: Symbol("ONFUNC_ONCE"),
45
+ };
26
46
  export function OnFunc() {
27
47
  const instance = new OnFuncInstance();
28
48
  const ret = instance.addFunction.bind(instance);
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AACA,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAA,CACtB,CAAC;IAAA,CACH;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CACxF;CACF;AAmDD,MAAM,UAAU,MAAM,GAA0E;IAC9F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAmB,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAkC,CAAC;IACjF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA4C,CAAC;IACvF,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAiD,CAAC;IACtG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA2C,CAAC;IACpF,OAAO,GAAG,CAAC;AAAA,CACZ"}
1
+ {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAAA,CACzC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,GAAY,EAAE,EAA2B,EAAW;QAEhE,IAAI,GAAG,KAAK,YAAY,CAAC,UAAU,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACZ;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,IAAI,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACrC,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAAA,CACrB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3H;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAGrB;IACF,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;CACnB,CAAC;AAqDX,MAAM,UAAU,MAAM,GAAmG;IACvH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAsB,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAqC,CAAC;IACpF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA+C,CAAC;IAC1F,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAoD,CAAC;IACzG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA8C,CAAC;IACvF,OAAO,GAAG,CAAC;AAAA,CACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
@@ -1,4 +1,5 @@
1
- import { OnFunc } from "./on-func.js";
1
+ import { Future } from "./future.js";
2
+ import { OnFunc, OnFuncReturn } from "./on-func.js";
2
3
  import { sleep } from "./promise-sleep.js";
3
4
  class OnFunctionTest {
4
5
  onFunAction = OnFunc();
@@ -53,4 +54,42 @@ it("OnFunctionTest clear", () => {
53
54
  test.onFunAction.invoke(1, "23");
54
55
  expect(fn.mock.calls).toEqual([]);
55
56
  });
57
+ it("OnFunctionTest unregister from the callback", async () => {
58
+ const test = new OnFunctionTest();
59
+ const fn2 = vi.fn();
60
+ let fn1Stop = 2;
61
+ const fn1 = vi.fn(() => {
62
+ return --fn1Stop === 0 ? OnFuncReturn.UNREGISTER : undefined;
63
+ });
64
+ let fn3Stop = 2;
65
+ const waitForFn3 = new Future();
66
+ const fn3 = vi.fn(() => {
67
+ if (--fn3Stop === 0) {
68
+ waitForFn3.resolve();
69
+ return OnFuncReturn.UNREGISTER;
70
+ }
71
+ });
72
+ test.onFunAction(fn1);
73
+ test.onFunAction(fn2);
74
+ test.onFunAction(fn3);
75
+ test.onFunAction.invoke(1, "13");
76
+ test.onFunAction.invoke(2, "23");
77
+ test.onFunAction.invoke(3, "33");
78
+ test.onFunAction.invoke(4, "43");
79
+ await waitForFn3.asPromise();
80
+ expect(fn1.mock.calls).toEqual([
81
+ [1, "13"],
82
+ [2, "23"],
83
+ ]);
84
+ expect(fn2.mock.calls).toEqual([
85
+ [1, "13"],
86
+ [2, "23"],
87
+ [3, "33"],
88
+ [4, "43"],
89
+ ]);
90
+ expect(fn3.mock.calls).toEqual([
91
+ [1, "13"],
92
+ [2, "23"],
93
+ ]);
94
+ });
56
95
  //# sourceMappingURL=on-func.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAiB,CAAC"}
package/esm/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.4.64-dev";
1
+ export const VERSION = "0.4.65";
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,YAAY,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adviser/cement",
3
- "version": "0.4.64-dev",
3
+ "version": "0.4.65",
4
4
  "description": "better try/catch/finally handling",
5
5
  "main": "./cjs/index.js",
6
6
  "type": "module",
@@ -94,7 +94,7 @@
94
94
  "@types/semver": "^7.7.1",
95
95
  "@typescript-eslint/eslint-plugin": "^8.46.3",
96
96
  "@typescript-eslint/parser": "^8.46.3",
97
- "@typescript/native-preview": "7.0.0-dev.20251109.1",
97
+ "@typescript/native-preview": "7.0.0-dev.20251117.1",
98
98
  "@vitest/browser": "^3.2.4",
99
99
  "@vitest/runner": "^3.2.4",
100
100
  "cmd-ts": "^0.14.1",
package/src/on-func.ts CHANGED
@@ -1,18 +1,36 @@
1
+ import { isPromise } from "./is-promise.js";
2
+
1
3
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
4
  class OnFuncInstance<Args extends any[]> {
3
- readonly #fns = new Set<(...a: Args) => void>();
5
+ readonly #fns = new Set<(...a: Args) => unknown>();
4
6
 
5
7
  addFunction(fn: (...a: Args) => unknown): () => void {
6
8
  this.#fns.add(fn);
7
9
  return () => {
8
- this.#fns.delete(fn);
10
+ this.unreg(OnFuncReturn.UNREGISTER, fn);
9
11
  };
10
12
  }
11
13
 
14
+ private unreg(ret: unknown, fn: (...a: Args) => unknown): unknown {
15
+ // console.log("unreg", ret, OnFuncReturn, OnFuncReturn[ret as keyof typeof OnFuncReturn]);
16
+ if (ret === OnFuncReturn.UNREGISTER || ret === OnFuncReturn.ONCE) {
17
+ this.#fns.delete(fn);
18
+ return undefined;
19
+ }
20
+ return ret;
21
+ }
22
+
12
23
  public invoke(...a: Args): void {
13
24
  for (const fn of this.#fns) {
14
25
  try {
15
- fn(...a);
26
+ const couldByPlainOrPromise = fn(...a);
27
+ if (isPromise(couldByPlainOrPromise)) {
28
+ void couldByPlainOrPromise.then((ret) => {
29
+ this.unreg(ret, fn);
30
+ });
31
+ } else {
32
+ this.unreg(couldByPlainOrPromise, fn);
33
+ }
16
34
  } catch (e) {
17
35
  // ignore errors
18
36
  }
@@ -24,19 +42,28 @@ class OnFuncInstance<Args extends any[]> {
24
42
  }
25
43
 
26
44
  public async invokeAsync(...a: Args): Promise<void> {
27
- await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a))));
45
+ await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a)).then((ret) => this.unreg(ret, fn))));
28
46
  }
29
47
  }
30
48
 
49
+ export const OnFuncReturn: {
50
+ readonly UNREGISTER: symbol;
51
+ readonly ONCE: symbol;
52
+ } = {
53
+ UNREGISTER: Symbol("ONFUNC_UNREGISTER"),
54
+ ONCE: Symbol("ONFUNC_ONCE"),
55
+ } as const;
56
+ export type OnFuncReturn = (typeof OnFuncReturn)[keyof typeof OnFuncReturn];
57
+
31
58
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- interface ReturnOnFunc<Args extends any[]> {
33
- (fn: (...a: Args) => unknown): () => void; // returns unregister function
59
+ interface ReturnOnFunc<Args extends any[], X = unknown> {
60
+ (fn: (...a: Args) => OnFuncReturn | X): () => unknown; // returns unregister function
34
61
  invoke(...a: Args): void;
35
62
  invokeAsync(...a: Args): Promise<void>;
36
63
  clear(): void;
37
64
  }
38
65
 
39
- type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
66
+ type ExtractArgs<T, X> = T extends (...args: infer A) => OnFuncReturn | X ? A : never;
40
67
 
41
68
  /**
42
69
  * Creates a type-safe event emitter for a specific function signature.
@@ -76,12 +103,13 @@ type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
76
103
  * onUserLogin.clear();
77
104
  * ```
78
105
  */
106
+
79
107
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
- export function OnFunc<Fn extends (...args: any[]) => unknown>(): ReturnOnFunc<ExtractArgs<Fn>> {
81
- const instance = new OnFuncInstance<ExtractArgs<Fn>>();
82
- const ret = instance.addFunction.bind(instance) as ReturnOnFunc<ExtractArgs<Fn>>;
83
- ret.invoke = instance.invoke.bind(instance) as ReturnOnFunc<ExtractArgs<Fn>>["invoke"];
84
- ret.invokeAsync = instance.invokeAsync.bind(instance) as ReturnOnFunc<ExtractArgs<Fn>>["invokeAsync"];
85
- ret.clear = instance.clear.bind(instance) as ReturnOnFunc<ExtractArgs<Fn>>["clear"];
108
+ export function OnFunc<Fn extends (...args: any[]) => OnFuncReturn | X, X = unknown>(): ReturnOnFunc<ExtractArgs<Fn, X>> {
109
+ const instance = new OnFuncInstance<ExtractArgs<Fn, X>>();
110
+ const ret = instance.addFunction.bind(instance) as ReturnOnFunc<ExtractArgs<Fn, X>>;
111
+ ret.invoke = instance.invoke.bind(instance) as ReturnOnFunc<ExtractArgs<Fn, X>>["invoke"];
112
+ ret.invokeAsync = instance.invokeAsync.bind(instance) as ReturnOnFunc<ExtractArgs<Fn, X>>["invokeAsync"];
113
+ ret.clear = instance.clear.bind(instance) as ReturnOnFunc<ExtractArgs<Fn, X>>["clear"];
86
114
  return ret;
87
115
  }
@@ -1,10 +1,15 @@
1
- interface ReturnOnFunc<Args extends any[]> {
2
- (fn: (...a: Args) => unknown): () => void;
1
+ export declare const OnFuncReturn: {
2
+ readonly UNREGISTER: symbol;
3
+ readonly ONCE: symbol;
4
+ };
5
+ export type OnFuncReturn = (typeof OnFuncReturn)[keyof typeof OnFuncReturn];
6
+ interface ReturnOnFunc<Args extends any[], X = unknown> {
7
+ (fn: (...a: Args) => OnFuncReturn | X): () => unknown;
3
8
  invoke(...a: Args): void;
4
9
  invokeAsync(...a: Args): Promise<void>;
5
10
  clear(): void;
6
11
  }
7
- type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
8
- export declare function OnFunc<Fn extends (...args: any[]) => unknown>(): ReturnOnFunc<ExtractArgs<Fn>>;
12
+ type ExtractArgs<T, X> = T extends (...args: infer A) => OnFuncReturn | X ? A : never;
13
+ export declare function OnFunc<Fn extends (...args: any[]) => OnFuncReturn | X, X = unknown>(): ReturnOnFunc<ExtractArgs<Fn, X>>;
9
14
  export {};
10
15
  //# sourceMappingURL=on-func.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AA+BA,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE;IACvC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAyC1E,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAO9F"}
1
+ {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,YAAY,EAAE;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CAId,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAG5E,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO;IACpD,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AA0CtF,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAOvH"}
package/ts/cjs/on-func.js CHANGED
@@ -1,18 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnFuncReturn = void 0;
3
4
  exports.OnFunc = OnFunc;
5
+ const is_promise_js_1 = require("./is-promise.js");
4
6
  class OnFuncInstance {
5
7
  #fns = new Set();
6
8
  addFunction(fn) {
7
9
  this.#fns.add(fn);
8
10
  return () => {
9
- this.#fns.delete(fn);
11
+ this.unreg(exports.OnFuncReturn.UNREGISTER, fn);
10
12
  };
11
13
  }
14
+ unreg(ret, fn) {
15
+ if (ret === exports.OnFuncReturn.UNREGISTER || ret === exports.OnFuncReturn.ONCE) {
16
+ this.#fns.delete(fn);
17
+ return undefined;
18
+ }
19
+ return ret;
20
+ }
12
21
  invoke(...a) {
13
22
  for (const fn of this.#fns) {
14
23
  try {
15
- fn(...a);
24
+ const couldByPlainOrPromise = fn(...a);
25
+ if ((0, is_promise_js_1.isPromise)(couldByPlainOrPromise)) {
26
+ void couldByPlainOrPromise.then((ret) => {
27
+ this.unreg(ret, fn);
28
+ });
29
+ }
30
+ else {
31
+ this.unreg(couldByPlainOrPromise, fn);
32
+ }
16
33
  }
17
34
  catch (e) {
18
35
  // ignore errors
@@ -23,9 +40,13 @@ class OnFuncInstance {
23
40
  this.#fns.clear();
24
41
  }
25
42
  async invokeAsync(...a) {
26
- await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a))));
43
+ await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a)).then((ret) => this.unreg(ret, fn))));
27
44
  }
28
45
  }
46
+ exports.OnFuncReturn = {
47
+ UNREGISTER: Symbol("ONFUNC_UNREGISTER"),
48
+ ONCE: Symbol("ONFUNC_ONCE"),
49
+ };
29
50
  function OnFunc() {
30
51
  const instance = new OnFuncInstance();
31
52
  const ret = instance.addFunction.bind(instance);
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":";;;AACA,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAA,CACtB,CAAC;IAAA,CACH;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CACxF;CACF;AAmDD,kBAAgG;IAC9F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAmB,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAkC,CAAC;IACjF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA4C,CAAC;IACvF,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAiD,CAAC;IACtG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA2C,CAAC;IACpF,OAAO,GAAG,CAAC;AAAA,CACZ"}
1
+ {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":";;;;AAAA,mDAA4C;AAG5C,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,QAAA,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAAA,CACzC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,GAAY,EAAE,EAA2B,EAAW;QAEhE,IAAI,GAAG,KAAK,QAAA,YAAY,CAAC,UAAU,IAAI,GAAG,KAAK,QAAA,YAAY,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACZ;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,IAAI,IAAA,yBAAS,EAAC,qBAAqB,CAAC,EAAE,CAAC;oBACrC,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAAA,CACrB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3H;CACF;AAEY,QAAA,YAAY,GAGrB;IACF,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;CACnB,CAAC;AAqDX,kBAAyH;IACvH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAsB,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAqC,CAAC;IACpF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA+C,CAAC;IAC1F,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAoD,CAAC;IACzG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA8C,CAAC;IACvF,OAAO,GAAG,CAAC;AAAA,CACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const future_js_1 = require("./future.js");
3
4
  const on_func_js_1 = require("./on-func.js");
4
5
  const promise_sleep_js_1 = require("./promise-sleep.js");
5
6
  class OnFunctionTest {
@@ -55,4 +56,42 @@ it("OnFunctionTest clear", () => {
55
56
  test.onFunAction.invoke(1, "23");
56
57
  expect(fn.mock.calls).toEqual([]);
57
58
  });
59
+ it("OnFunctionTest unregister from the callback", async () => {
60
+ const test = new OnFunctionTest();
61
+ const fn2 = vi.fn();
62
+ let fn1Stop = 2;
63
+ const fn1 = vi.fn(() => {
64
+ return --fn1Stop === 0 ? on_func_js_1.OnFuncReturn.UNREGISTER : undefined;
65
+ });
66
+ let fn3Stop = 2;
67
+ const waitForFn3 = new future_js_1.Future();
68
+ const fn3 = vi.fn(() => {
69
+ if (--fn3Stop === 0) {
70
+ waitForFn3.resolve();
71
+ return on_func_js_1.OnFuncReturn.UNREGISTER;
72
+ }
73
+ });
74
+ test.onFunAction(fn1);
75
+ test.onFunAction(fn2);
76
+ test.onFunAction(fn3);
77
+ test.onFunAction.invoke(1, "13");
78
+ test.onFunAction.invoke(2, "23");
79
+ test.onFunAction.invoke(3, "33");
80
+ test.onFunAction.invoke(4, "43");
81
+ await waitForFn3.asPromise();
82
+ expect(fn1.mock.calls).toEqual([
83
+ [1, "13"],
84
+ [2, "23"],
85
+ ]);
86
+ expect(fn2.mock.calls).toEqual([
87
+ [1, "13"],
88
+ [2, "23"],
89
+ [3, "33"],
90
+ [4, "43"],
91
+ ]);
92
+ expect(fn3.mock.calls).toEqual([
93
+ [1, "13"],
94
+ [2, "23"],
95
+ ]);
96
+ });
58
97
  //# sourceMappingURL=on-func.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAiB,CAAC"}
package/ts/cjs/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.4.64-dev";
4
+ exports.VERSION = "0.4.65";
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAW,YAAY,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAW,QAAQ,CAAC"}
@@ -1,10 +1,15 @@
1
- interface ReturnOnFunc<Args extends any[]> {
2
- (fn: (...a: Args) => unknown): () => void;
1
+ export declare const OnFuncReturn: {
2
+ readonly UNREGISTER: symbol;
3
+ readonly ONCE: symbol;
4
+ };
5
+ export type OnFuncReturn = (typeof OnFuncReturn)[keyof typeof OnFuncReturn];
6
+ interface ReturnOnFunc<Args extends any[], X = unknown> {
7
+ (fn: (...a: Args) => OnFuncReturn | X): () => unknown;
3
8
  invoke(...a: Args): void;
4
9
  invokeAsync(...a: Args): Promise<void>;
5
10
  clear(): void;
6
11
  }
7
- type ExtractArgs<T> = T extends (...args: infer A) => unknown ? A : never;
8
- export declare function OnFunc<Fn extends (...args: any[]) => unknown>(): ReturnOnFunc<ExtractArgs<Fn>>;
12
+ type ExtractArgs<T, X> = T extends (...args: infer A) => OnFuncReturn | X ? A : never;
13
+ export declare function OnFunc<Fn extends (...args: any[]) => OnFuncReturn | X, X = unknown>(): ReturnOnFunc<ExtractArgs<Fn, X>>;
9
14
  export {};
10
15
  //# sourceMappingURL=on-func.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AA+BA,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE;IACvC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,IAAI,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAyC1E,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAO9F"}
1
+ {"version":3,"file":"on-func.d.ts","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAgDA,eAAO,MAAM,YAAY,EAAE;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CAId,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAG5E,UAAU,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO;IACpD,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AA0CtF,wBAAgB,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAOvH"}
package/ts/esm/on-func.js CHANGED
@@ -1,15 +1,31 @@
1
+ import { isPromise } from "./is-promise.js";
1
2
  class OnFuncInstance {
2
3
  #fns = new Set();
3
4
  addFunction(fn) {
4
5
  this.#fns.add(fn);
5
6
  return () => {
6
- this.#fns.delete(fn);
7
+ this.unreg(OnFuncReturn.UNREGISTER, fn);
7
8
  };
8
9
  }
10
+ unreg(ret, fn) {
11
+ if (ret === OnFuncReturn.UNREGISTER || ret === OnFuncReturn.ONCE) {
12
+ this.#fns.delete(fn);
13
+ return undefined;
14
+ }
15
+ return ret;
16
+ }
9
17
  invoke(...a) {
10
18
  for (const fn of this.#fns) {
11
19
  try {
12
- fn(...a);
20
+ const couldByPlainOrPromise = fn(...a);
21
+ if (isPromise(couldByPlainOrPromise)) {
22
+ void couldByPlainOrPromise.then((ret) => {
23
+ this.unreg(ret, fn);
24
+ });
25
+ }
26
+ else {
27
+ this.unreg(couldByPlainOrPromise, fn);
28
+ }
13
29
  }
14
30
  catch (e) {
15
31
  // ignore errors
@@ -20,9 +36,13 @@ class OnFuncInstance {
20
36
  this.#fns.clear();
21
37
  }
22
38
  async invokeAsync(...a) {
23
- await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a))));
39
+ await Promise.allSettled(Array.from(this.#fns).map((fn) => Promise.resolve(fn(...a)).then((ret) => this.unreg(ret, fn))));
24
40
  }
25
41
  }
42
+ export const OnFuncReturn = {
43
+ UNREGISTER: Symbol("ONFUNC_UNREGISTER"),
44
+ ONCE: Symbol("ONFUNC_ONCE"),
45
+ };
26
46
  export function OnFunc() {
27
47
  const instance = new OnFuncInstance();
28
48
  const ret = instance.addFunction.bind(instance);
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AACA,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAA,CACtB,CAAC;IAAA,CACH;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACX,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CACxF;CACF;AAmDD,MAAM,UAAU,MAAM,GAA0E;IAC9F,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAmB,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAkC,CAAC;IACjF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA4C,CAAC;IACvF,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAiD,CAAC;IACtG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA2C,CAAC;IACpF,OAAO,GAAG,CAAC;AAAA,CACZ"}
1
+ {"version":3,"file":"on-func.js","sourceRoot":"","sources":["../../../src/on-func.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,cAAc;IACT,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,WAAW,CAAC,EAA2B,EAAc;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAAA,CACzC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,GAAY,EAAE,EAA2B,EAAW;QAEhE,IAAI,GAAG,KAAK,YAAY,CAAC,UAAU,IAAI,GAAG,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC;IAAA,CACZ;IAEM,MAAM,CAAC,GAAG,CAAO,EAAQ;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,IAAI,SAAS,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACrC,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAAA,CACrB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,gBAAgB;YAClB,CAAC;QACH,CAAC;IAAA,CACF;IAEM,KAAK,GAAS;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB;IAEM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAO,EAAiB;QAClD,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3H;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAGrB;IACF,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;CACnB,CAAC;AAqDX,MAAM,UAAU,MAAM,GAAmG;IACvH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAsB,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAqC,CAAC;IACpF,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA+C,CAAC;IAC1F,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAoD,CAAC;IACzG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAA8C,CAAC;IACvF,OAAO,GAAG,CAAC;AAAA,CACZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"on-func.test.d.ts","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC5B,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;CACpE;AAGD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC"}
@@ -1,4 +1,5 @@
1
- import { OnFunc } from "./on-func.js";
1
+ import { Future } from "./future.js";
2
+ import { OnFunc, OnFuncReturn } from "./on-func.js";
2
3
  import { sleep } from "./promise-sleep.js";
3
4
  class OnFunctionTest {
4
5
  onFunAction = OnFunc();
@@ -53,4 +54,42 @@ it("OnFunctionTest clear", () => {
53
54
  test.onFunAction.invoke(1, "23");
54
55
  expect(fn.mock.calls).toEqual([]);
55
56
  });
57
+ it("OnFunctionTest unregister from the callback", async () => {
58
+ const test = new OnFunctionTest();
59
+ const fn2 = vi.fn();
60
+ let fn1Stop = 2;
61
+ const fn1 = vi.fn(() => {
62
+ return --fn1Stop === 0 ? OnFuncReturn.UNREGISTER : undefined;
63
+ });
64
+ let fn3Stop = 2;
65
+ const waitForFn3 = new Future();
66
+ const fn3 = vi.fn(() => {
67
+ if (--fn3Stop === 0) {
68
+ waitForFn3.resolve();
69
+ return OnFuncReturn.UNREGISTER;
70
+ }
71
+ });
72
+ test.onFunAction(fn1);
73
+ test.onFunAction(fn2);
74
+ test.onFunAction(fn3);
75
+ test.onFunAction.invoke(1, "13");
76
+ test.onFunAction.invoke(2, "23");
77
+ test.onFunAction.invoke(3, "33");
78
+ test.onFunAction.invoke(4, "43");
79
+ await waitForFn3.asPromise();
80
+ expect(fn1.mock.calls).toEqual([
81
+ [1, "13"],
82
+ [2, "23"],
83
+ ]);
84
+ expect(fn2.mock.calls).toEqual([
85
+ [1, "13"],
86
+ [2, "23"],
87
+ [3, "33"],
88
+ [4, "43"],
89
+ ]);
90
+ expect(fn3.mock.calls).toEqual([
91
+ [1, "13"],
92
+ [2, "23"],
93
+ ]);
94
+ });
56
95
  //# sourceMappingURL=on-func.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA0C3C,MAAM,cAAc;IACT,WAAW,GAAG,MAAM,EAAkC,CAAC;IACvD,YAAY,GAAG,MAAM,EAAc,CAAC;IAEpC,SAAS,GAAG,MAAM,EAA0C,CAAC;IAC7D,aAAa,GAAG,MAAM,EAA+D,CAAC;IACtF,mBAAmB,GAAG,MAAM,EAAqE,CAAC;CAC5G;AAED,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAC,EAAE,IAAI,CAAC;YACT,CAAC,CAAC,EAAE,IAAI,CAAC;SACV,CAAC,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;AAAA,CACF,CAAC,CAAC;AAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,CACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"on-func.test.js","sourceRoot":"","sources":["../../../src/on-func.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,MAAiB,CAAC"}
package/ts/esm/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.4.64-dev";
1
+ export const VERSION = "0.4.65";
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,YAAY,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC"}