@adviser/cement 0.5.2 → 0.5.4
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/cjs/base-basic-sys-abstraction.test.cjs +12 -13
- package/cjs/base-basic-sys-abstraction.test.cjs.map +1 -1
- package/cjs/bin2text.test.cjs +15 -14
- package/cjs/bin2text.test.cjs.map +1 -1
- package/cjs/coerce-binary.test.cjs +16 -15
- package/cjs/coerce-binary.test.cjs.map +1 -1
- package/cjs/crypto.test.cjs +9 -8
- package/cjs/crypto.test.cjs.map +1 -1
- package/cjs/future.test.cjs +12 -11
- package/cjs/future.test.cjs.map +1 -1
- package/cjs/http_header.test.cjs +13 -13
- package/cjs/http_header.test.cjs.map +1 -1
- package/cjs/index.cjs +3 -0
- package/cjs/index.cjs.map +1 -1
- package/cjs/index.d.ts +3 -0
- package/cjs/index.d.ts.map +1 -1
- package/cjs/is-json.test.cjs +59 -58
- package/cjs/is-json.test.cjs.map +1 -1
- package/cjs/is-promise.test.cjs +19 -19
- package/cjs/is-promise.test.cjs.map +1 -1
- package/cjs/json-en-decoder.test.cjs +13 -12
- package/cjs/json-en-decoder.test.cjs.map +1 -1
- package/cjs/keyed-ng.test.cjs +27 -26
- package/cjs/keyed-ng.test.cjs.map +1 -1
- package/cjs/logger.test.cjs +178 -179
- package/cjs/logger.test.cjs.map +1 -1
- package/cjs/lru-map-set.test.cjs +67 -66
- package/cjs/lru-map-set.test.cjs.map +1 -1
- package/cjs/mutable-url.test.cjs +44 -44
- package/cjs/mutable-url.test.cjs.map +1 -1
- package/cjs/node-fs/mock-file-service.test.cjs +7 -6
- package/cjs/node-fs/mock-file-service.test.cjs.map +1 -1
- package/cjs/node-fs/node-sys-abstraction.test.cjs +13 -12
- package/cjs/node-fs/node-sys-abstraction.test.cjs.map +1 -1
- package/cjs/on-func.cjs +15 -1
- package/cjs/on-func.cjs.map +1 -1
- package/cjs/on-func.d.ts +1 -0
- package/cjs/on-func.d.ts.map +1 -1
- package/cjs/on-func.test.cjs +62 -29
- package/cjs/on-func.test.cjs.map +1 -1
- package/cjs/on-func.test.d.ts.map +1 -1
- package/cjs/option.cjs +2 -2
- package/cjs/option.cjs.map +1 -1
- package/cjs/option.d.ts +1 -1
- package/cjs/option.d.ts.map +1 -1
- package/cjs/path-ops.test.cjs +40 -39
- package/cjs/path-ops.test.cjs.map +1 -1
- package/cjs/poller.test.cjs +51 -51
- package/cjs/poller.test.cjs.map +1 -1
- package/cjs/promise-sleep.test.cjs +35 -34
- package/cjs/promise-sleep.test.cjs.map +1 -1
- package/cjs/resolve-once.cjs +58 -39
- package/cjs/resolve-once.cjs.map +1 -1
- package/cjs/resolve-once.d.ts +32 -25
- package/cjs/resolve-once.d.ts.map +1 -1
- package/cjs/resolve-once.test.cjs +337 -309
- package/cjs/resolve-once.test.cjs.map +1 -1
- package/cjs/result.cjs +6 -0
- package/cjs/result.cjs.map +1 -1
- package/cjs/result.d.ts +2 -0
- package/cjs/result.d.ts.map +1 -1
- package/cjs/result.test.cjs +68 -44
- package/cjs/result.test.cjs.map +1 -1
- package/cjs/sys-env.test.cjs +67 -66
- package/cjs/sys-env.test.cjs.map +1 -1
- package/cjs/test/mock-logger.test.cjs +14 -13
- package/cjs/test/mock-logger.test.cjs.map +1 -1
- package/cjs/timeouted.cjs +13 -18
- package/cjs/timeouted.cjs.map +1 -1
- package/cjs/timeouted.d.ts +23 -27
- package/cjs/timeouted.d.ts.map +1 -1
- package/cjs/timeouted.test.cjs +337 -307
- package/cjs/timeouted.test.cjs.map +1 -1
- package/cjs/tracer.test.cjs +32 -31
- package/cjs/tracer.test.cjs.map +1 -1
- package/cjs/txt-en-decoder.test.cjs +31 -31
- package/cjs/txt-en-decoder.test.cjs.map +1 -1
- package/cjs/uri.test.cjs +239 -239
- package/cjs/uri.test.cjs.map +1 -1
- package/cjs/utils/consume.test.cjs +22 -22
- package/cjs/utils/consume.test.cjs.map +1 -1
- package/cjs/utils/rebuffer.test.cjs +40 -39
- package/cjs/utils/rebuffer.test.cjs.map +1 -1
- package/cjs/utils/relative-path.test.cjs +125 -124
- package/cjs/utils/relative-path.test.cjs.map +1 -1
- package/cjs/utils/sorted-object.test.cjs +8 -7
- package/cjs/utils/sorted-object.test.cjs.map +1 -1
- package/cjs/utils/stream-map.test.cjs +32 -31
- package/cjs/utils/stream-map.test.cjs.map +1 -1
- package/cjs/utils/stream2string.test.cjs +5 -5
- package/cjs/utils/stream2string.test.cjs.map +1 -1
- package/cjs/utils/string2stream.test.cjs +5 -5
- package/cjs/utils/string2stream.test.cjs.map +1 -1
- package/cjs/utils/stripper.test.cjs +21 -20
- package/cjs/utils/stripper.test.cjs.map +1 -1
- package/cjs/utils/to-sorted.d.ts +1 -1
- package/cjs/utils/to-sorted.d.ts.map +1 -1
- package/cjs/utils/to-sorted.test.cjs +27 -27
- package/cjs/utils/to-sorted.test.cjs.map +1 -1
- package/cjs/version.cjs +1 -1
- package/cjs/wait-for-value.cjs +49 -0
- package/cjs/wait-for-value.cjs.map +1 -0
- package/cjs/wait-for-value.d.ts +13 -0
- package/cjs/wait-for-value.d.ts.map +1 -0
- package/cjs/wait-for-value.test.cjs +86 -0
- package/cjs/wait-for-value.test.cjs.map +1 -0
- package/cjs/wait-for-value.test.d.ts +2 -0
- package/cjs/wait-for-value.test.d.ts.map +1 -0
- package/deno.json +1 -1
- package/esm/base-basic-sys-abstraction.test.js +1 -2
- package/esm/base-basic-sys-abstraction.test.js.map +1 -1
- package/esm/bin2text.test.js +2 -1
- package/esm/bin2text.test.js.map +1 -1
- package/esm/coerce-binary.test.js +1 -0
- package/esm/coerce-binary.test.js.map +1 -1
- package/esm/crypto.test.js +2 -1
- package/esm/crypto.test.js.map +1 -1
- package/esm/future.test.js +1 -0
- package/esm/future.test.js.map +1 -1
- package/esm/http_header.test.js +1 -1
- package/esm/http_header.test.js.map +1 -1
- package/esm/index.d.ts +3 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -1
- package/esm/is-json.test.js +2 -1
- package/esm/is-json.test.js.map +1 -1
- package/esm/is-promise.test.js +2 -2
- package/esm/is-promise.test.js.map +1 -1
- package/esm/json-en-decoder.test.js +2 -1
- package/esm/json-en-decoder.test.js.map +1 -1
- package/esm/keyed-ng.test.js +8 -7
- package/esm/keyed-ng.test.js.map +1 -1
- package/esm/load-asset.test.js +2 -3
- package/esm/load-asset.test.js.map +1 -1
- package/esm/logger.test.js +2 -3
- package/esm/logger.test.js.map +1 -1
- package/esm/lru-map-set.test.js +1 -0
- package/esm/lru-map-set.test.js.map +1 -1
- package/esm/mutable-url.test.js +1 -1
- package/esm/mutable-url.test.js.map +1 -1
- package/esm/node-fs/mock-file-service.test.js +1 -0
- package/esm/node-fs/mock-file-service.test.js.map +1 -1
- package/esm/node-fs/node-sys-abstraction.test.js +1 -0
- package/esm/node-fs/node-sys-abstraction.test.js.map +1 -1
- package/esm/on-func.d.ts +1 -0
- package/esm/on-func.d.ts.map +1 -1
- package/esm/on-func.js +15 -1
- package/esm/on-func.js.map +1 -1
- package/esm/on-func.test.d.ts.map +1 -1
- package/esm/on-func.test.js +36 -3
- package/esm/on-func.test.js.map +1 -1
- package/esm/option.d.ts +1 -1
- package/esm/option.d.ts.map +1 -1
- package/esm/option.js +2 -2
- package/esm/option.js.map +1 -1
- package/esm/path-ops.test.js +2 -1
- package/esm/path-ops.test.js.map +1 -1
- package/esm/poller.test.js +2 -2
- package/esm/poller.test.js.map +1 -1
- package/esm/promise-sleep.test.js +2 -1
- package/esm/promise-sleep.test.js.map +1 -1
- package/esm/resolve-once.d.ts +32 -25
- package/esm/resolve-once.d.ts.map +1 -1
- package/esm/resolve-once.js +58 -39
- package/esm/resolve-once.js.map +1 -1
- package/esm/resolve-once.test.js +59 -31
- package/esm/resolve-once.test.js.map +1 -1
- package/esm/result.d.ts +2 -0
- package/esm/result.d.ts.map +1 -1
- package/esm/result.js +6 -0
- package/esm/result.js.map +1 -1
- package/esm/result.test.js +25 -1
- package/esm/result.test.js.map +1 -1
- package/esm/sys-env.test.js +1 -0
- package/esm/sys-env.test.js.map +1 -1
- package/esm/test/mock-logger.test.js +1 -0
- package/esm/test/mock-logger.test.js.map +1 -1
- package/esm/timeouted.d.ts +23 -27
- package/esm/timeouted.d.ts.map +1 -1
- package/esm/timeouted.js +13 -18
- package/esm/timeouted.js.map +1 -1
- package/esm/timeouted.test.js +33 -3
- package/esm/timeouted.test.js.map +1 -1
- package/esm/tracer.test.js +1 -0
- package/esm/tracer.test.js.map +1 -1
- package/esm/txt-en-decoder.test.js +2 -2
- package/esm/txt-en-decoder.test.js.map +1 -1
- package/esm/uri.test.js +2 -2
- package/esm/uri.test.js.map +1 -1
- package/esm/utils/consume.test.js +2 -2
- package/esm/utils/consume.test.js.map +1 -1
- package/esm/utils/rebuffer.test.js +2 -1
- package/esm/utils/rebuffer.test.js.map +1 -1
- package/esm/utils/relative-path.test.js +2 -1
- package/esm/utils/relative-path.test.js.map +1 -1
- package/esm/utils/sorted-object.test.js +2 -1
- package/esm/utils/sorted-object.test.js.map +1 -1
- package/esm/utils/stream-map.test.js +2 -1
- package/esm/utils/stream-map.test.js.map +1 -1
- package/esm/utils/stream2string.test.js +2 -2
- package/esm/utils/stream2string.test.js.map +1 -1
- package/esm/utils/string2stream.test.js +2 -2
- package/esm/utils/string2stream.test.js.map +1 -1
- package/esm/utils/stripper.test.js +2 -1
- package/esm/utils/stripper.test.js.map +1 -1
- package/esm/utils/to-sorted.d.ts +1 -1
- package/esm/utils/to-sorted.d.ts.map +1 -1
- package/esm/utils/to-sorted.test.js +2 -2
- package/esm/utils/to-sorted.test.js.map +1 -1
- package/esm/version.js +1 -1
- package/esm/wait-for-value.d.ts +13 -0
- package/esm/wait-for-value.d.ts.map +1 -0
- package/esm/wait-for-value.js +45 -0
- package/esm/wait-for-value.js.map +1 -0
- package/esm/wait-for-value.test.d.ts +2 -0
- package/esm/wait-for-value.test.d.ts.map +1 -0
- package/esm/wait-for-value.test.js +84 -0
- package/esm/wait-for-value.test.js.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +3 -0
- package/src/on-func.ts +39 -1
- package/src/option.ts +2 -2
- package/src/resolve-once.ts +166 -139
- package/src/result.ts +7 -0
- package/src/timeouted.ts +39 -65
- package/src/utils/to-sorted.ts +1 -1
- package/src/wait-for-value.ts +111 -0
- package/ts/cjs/base-basic-sys-abstraction.test.js +12 -13
- package/ts/cjs/base-basic-sys-abstraction.test.js.map +1 -1
- package/ts/cjs/bin2text.test.js +15 -14
- package/ts/cjs/bin2text.test.js.map +1 -1
- package/ts/cjs/coerce-binary.test.js +16 -15
- package/ts/cjs/coerce-binary.test.js.map +1 -1
- package/ts/cjs/crypto.test.js +9 -8
- package/ts/cjs/crypto.test.js.map +1 -1
- package/ts/cjs/future.test.js +12 -11
- package/ts/cjs/future.test.js.map +1 -1
- package/ts/cjs/http_header.test.js +13 -13
- package/ts/cjs/http_header.test.js.map +1 -1
- package/ts/cjs/index.d.ts +3 -0
- package/ts/cjs/index.d.ts.map +1 -1
- package/ts/cjs/index.js +3 -0
- package/ts/cjs/index.js.map +1 -1
- package/ts/cjs/is-json.test.js +59 -58
- package/ts/cjs/is-json.test.js.map +1 -1
- package/ts/cjs/is-promise.test.js +19 -19
- package/ts/cjs/is-promise.test.js.map +1 -1
- package/ts/cjs/json-en-decoder.test.js +13 -12
- package/ts/cjs/json-en-decoder.test.js.map +1 -1
- package/ts/cjs/keyed-ng.test.js +27 -26
- package/ts/cjs/keyed-ng.test.js.map +1 -1
- package/ts/cjs/logger.test.js +178 -179
- package/ts/cjs/logger.test.js.map +1 -1
- package/ts/cjs/lru-map-set.test.js +67 -66
- package/ts/cjs/lru-map-set.test.js.map +1 -1
- package/ts/cjs/mutable-url.test.js +44 -44
- package/ts/cjs/mutable-url.test.js.map +1 -1
- package/ts/cjs/node-fs/mock-file-service.test.js +7 -6
- package/ts/cjs/node-fs/mock-file-service.test.js.map +1 -1
- package/ts/cjs/node-fs/node-sys-abstraction.test.js +13 -12
- package/ts/cjs/node-fs/node-sys-abstraction.test.js.map +1 -1
- package/ts/cjs/on-func.d.ts +1 -0
- package/ts/cjs/on-func.d.ts.map +1 -1
- package/ts/cjs/on-func.js +15 -1
- package/ts/cjs/on-func.js.map +1 -1
- package/ts/cjs/on-func.test.d.ts.map +1 -1
- package/ts/cjs/on-func.test.js +62 -29
- package/ts/cjs/on-func.test.js.map +1 -1
- package/ts/cjs/option.d.ts +1 -1
- package/ts/cjs/option.d.ts.map +1 -1
- package/ts/cjs/option.js +2 -2
- package/ts/cjs/option.js.map +1 -1
- package/ts/cjs/path-ops.test.js +40 -39
- package/ts/cjs/path-ops.test.js.map +1 -1
- package/ts/cjs/poller.test.js +51 -51
- package/ts/cjs/poller.test.js.map +1 -1
- package/ts/cjs/promise-sleep.test.js +35 -34
- package/ts/cjs/promise-sleep.test.js.map +1 -1
- package/ts/cjs/resolve-once.d.ts +32 -25
- package/ts/cjs/resolve-once.d.ts.map +1 -1
- package/ts/cjs/resolve-once.js +58 -39
- package/ts/cjs/resolve-once.js.map +1 -1
- package/ts/cjs/resolve-once.test.js +337 -309
- package/ts/cjs/resolve-once.test.js.map +1 -1
- package/ts/cjs/result.d.ts +2 -0
- package/ts/cjs/result.d.ts.map +1 -1
- package/ts/cjs/result.js +6 -0
- package/ts/cjs/result.js.map +1 -1
- package/ts/cjs/result.test.js +68 -44
- package/ts/cjs/result.test.js.map +1 -1
- package/ts/cjs/sys-env.test.js +67 -66
- package/ts/cjs/sys-env.test.js.map +1 -1
- package/ts/cjs/test/mock-logger.test.js +14 -13
- package/ts/cjs/test/mock-logger.test.js.map +1 -1
- package/ts/cjs/timeouted.d.ts +23 -27
- package/ts/cjs/timeouted.d.ts.map +1 -1
- package/ts/cjs/timeouted.js +13 -18
- package/ts/cjs/timeouted.js.map +1 -1
- package/ts/cjs/timeouted.test.js +337 -307
- package/ts/cjs/timeouted.test.js.map +1 -1
- package/ts/cjs/tracer.test.js +32 -31
- package/ts/cjs/tracer.test.js.map +1 -1
- package/ts/cjs/txt-en-decoder.test.js +31 -31
- package/ts/cjs/txt-en-decoder.test.js.map +1 -1
- package/ts/cjs/uri.test.js +239 -239
- package/ts/cjs/uri.test.js.map +1 -1
- package/ts/cjs/utils/consume.test.js +22 -22
- package/ts/cjs/utils/consume.test.js.map +1 -1
- package/ts/cjs/utils/rebuffer.test.js +40 -39
- package/ts/cjs/utils/rebuffer.test.js.map +1 -1
- package/ts/cjs/utils/relative-path.test.js +125 -124
- package/ts/cjs/utils/relative-path.test.js.map +1 -1
- package/ts/cjs/utils/sorted-object.test.js +8 -7
- package/ts/cjs/utils/sorted-object.test.js.map +1 -1
- package/ts/cjs/utils/stream-map.test.js +32 -31
- package/ts/cjs/utils/stream-map.test.js.map +1 -1
- package/ts/cjs/utils/stream2string.test.js +5 -5
- package/ts/cjs/utils/stream2string.test.js.map +1 -1
- package/ts/cjs/utils/string2stream.test.js +5 -5
- package/ts/cjs/utils/string2stream.test.js.map +1 -1
- package/ts/cjs/utils/stripper.test.js +21 -20
- package/ts/cjs/utils/stripper.test.js.map +1 -1
- package/ts/cjs/utils/to-sorted.d.ts +1 -1
- package/ts/cjs/utils/to-sorted.d.ts.map +1 -1
- package/ts/cjs/utils/to-sorted.test.js +27 -27
- package/ts/cjs/utils/to-sorted.test.js.map +1 -1
- package/ts/cjs/version.js +1 -1
- package/ts/cjs/wait-for-value.d.ts +13 -0
- package/ts/cjs/wait-for-value.d.ts.map +1 -0
- package/ts/cjs/wait-for-value.js +49 -0
- package/ts/cjs/wait-for-value.js.map +1 -0
- package/ts/cjs/wait-for-value.test.d.ts +2 -0
- package/ts/cjs/wait-for-value.test.d.ts.map +1 -0
- package/ts/cjs/wait-for-value.test.js +86 -0
- package/ts/cjs/wait-for-value.test.js.map +1 -0
- package/ts/esm/base-basic-sys-abstraction.test.js +1 -2
- package/ts/esm/base-basic-sys-abstraction.test.js.map +1 -1
- package/ts/esm/bin2text.test.js +2 -1
- package/ts/esm/bin2text.test.js.map +1 -1
- package/ts/esm/coerce-binary.test.js +1 -0
- package/ts/esm/coerce-binary.test.js.map +1 -1
- package/ts/esm/crypto.test.js +2 -1
- package/ts/esm/crypto.test.js.map +1 -1
- package/ts/esm/future.test.js +1 -0
- package/ts/esm/future.test.js.map +1 -1
- package/ts/esm/http_header.test.js +1 -1
- package/ts/esm/http_header.test.js.map +1 -1
- package/ts/esm/index.d.ts +3 -0
- package/ts/esm/index.d.ts.map +1 -1
- package/ts/esm/index.js +3 -0
- package/ts/esm/index.js.map +1 -1
- package/ts/esm/is-json.test.js +2 -1
- package/ts/esm/is-json.test.js.map +1 -1
- package/ts/esm/is-promise.test.js +2 -2
- package/ts/esm/is-promise.test.js.map +1 -1
- package/ts/esm/json-en-decoder.test.js +2 -1
- package/ts/esm/json-en-decoder.test.js.map +1 -1
- package/ts/esm/keyed-ng.test.js +8 -7
- package/ts/esm/keyed-ng.test.js.map +1 -1
- package/ts/esm/load-asset.test.js +2 -3
- package/ts/esm/load-asset.test.js.map +1 -1
- package/ts/esm/logger.test.js +2 -3
- package/ts/esm/logger.test.js.map +1 -1
- package/ts/esm/lru-map-set.test.js +1 -0
- package/ts/esm/lru-map-set.test.js.map +1 -1
- package/ts/esm/mutable-url.test.js +1 -1
- package/ts/esm/mutable-url.test.js.map +1 -1
- package/ts/esm/node-fs/mock-file-service.test.js +1 -0
- package/ts/esm/node-fs/mock-file-service.test.js.map +1 -1
- package/ts/esm/node-fs/node-sys-abstraction.test.js +1 -0
- package/ts/esm/node-fs/node-sys-abstraction.test.js.map +1 -1
- package/ts/esm/on-func.d.ts +1 -0
- package/ts/esm/on-func.d.ts.map +1 -1
- package/ts/esm/on-func.js +15 -1
- package/ts/esm/on-func.js.map +1 -1
- package/ts/esm/on-func.test.d.ts.map +1 -1
- package/ts/esm/on-func.test.js +36 -3
- package/ts/esm/on-func.test.js.map +1 -1
- package/ts/esm/option.d.ts +1 -1
- package/ts/esm/option.d.ts.map +1 -1
- package/ts/esm/option.js +2 -2
- package/ts/esm/option.js.map +1 -1
- package/ts/esm/path-ops.test.js +2 -1
- package/ts/esm/path-ops.test.js.map +1 -1
- package/ts/esm/poller.test.js +2 -2
- package/ts/esm/poller.test.js.map +1 -1
- package/ts/esm/promise-sleep.test.js +2 -1
- package/ts/esm/promise-sleep.test.js.map +1 -1
- package/ts/esm/resolve-once.d.ts +32 -25
- package/ts/esm/resolve-once.d.ts.map +1 -1
- package/ts/esm/resolve-once.js +58 -39
- package/ts/esm/resolve-once.js.map +1 -1
- package/ts/esm/resolve-once.test.js +59 -31
- package/ts/esm/resolve-once.test.js.map +1 -1
- package/ts/esm/result.d.ts +2 -0
- package/ts/esm/result.d.ts.map +1 -1
- package/ts/esm/result.js +6 -0
- package/ts/esm/result.js.map +1 -1
- package/ts/esm/result.test.js +25 -1
- package/ts/esm/result.test.js.map +1 -1
- package/ts/esm/sys-env.test.js +1 -0
- package/ts/esm/sys-env.test.js.map +1 -1
- package/ts/esm/test/mock-logger.test.js +1 -0
- package/ts/esm/test/mock-logger.test.js.map +1 -1
- package/ts/esm/timeouted.d.ts +23 -27
- package/ts/esm/timeouted.d.ts.map +1 -1
- package/ts/esm/timeouted.js +13 -18
- package/ts/esm/timeouted.js.map +1 -1
- package/ts/esm/timeouted.test.js +33 -3
- package/ts/esm/timeouted.test.js.map +1 -1
- package/ts/esm/tracer.test.js +1 -0
- package/ts/esm/tracer.test.js.map +1 -1
- package/ts/esm/txt-en-decoder.test.js +2 -2
- package/ts/esm/txt-en-decoder.test.js.map +1 -1
- package/ts/esm/uri.test.js +2 -2
- package/ts/esm/uri.test.js.map +1 -1
- package/ts/esm/utils/consume.test.js +2 -2
- package/ts/esm/utils/consume.test.js.map +1 -1
- package/ts/esm/utils/rebuffer.test.js +2 -1
- package/ts/esm/utils/rebuffer.test.js.map +1 -1
- package/ts/esm/utils/relative-path.test.js +2 -1
- package/ts/esm/utils/relative-path.test.js.map +1 -1
- package/ts/esm/utils/sorted-object.test.js +2 -1
- package/ts/esm/utils/sorted-object.test.js.map +1 -1
- package/ts/esm/utils/stream-map.test.js +2 -1
- package/ts/esm/utils/stream-map.test.js.map +1 -1
- package/ts/esm/utils/stream2string.test.js +2 -2
- package/ts/esm/utils/stream2string.test.js.map +1 -1
- package/ts/esm/utils/string2stream.test.js +2 -2
- package/ts/esm/utils/string2stream.test.js.map +1 -1
- package/ts/esm/utils/stripper.test.js +2 -1
- package/ts/esm/utils/stripper.test.js.map +1 -1
- package/ts/esm/utils/to-sorted.d.ts +1 -1
- package/ts/esm/utils/to-sorted.d.ts.map +1 -1
- package/ts/esm/utils/to-sorted.test.js +2 -2
- package/ts/esm/utils/to-sorted.test.js.map +1 -1
- package/ts/esm/version.js +1 -1
- package/ts/esm/wait-for-value.d.ts +13 -0
- package/ts/esm/wait-for-value.d.ts.map +1 -0
- package/ts/esm/wait-for-value.js +45 -0
- package/ts/esm/wait-for-value.js.map +1 -0
- package/ts/esm/wait-for-value.test.d.ts +2 -0
- package/ts/esm/wait-for-value.test.d.ts.map +1 -0
- package/ts/esm/wait-for-value.test.js +84 -0
- package/ts/esm/wait-for-value.test.js.map +1 -0
- package/tsconfig.json +1 -1
package/src/resolve-once.ts
CHANGED
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { Future } from "./future.js";
|
|
18
|
-
import {
|
|
18
|
+
import { isPromise } from "./is-promise.js";
|
|
19
19
|
import { UnregFn } from "./lru-map-set.js";
|
|
20
20
|
import { Result } from "./result.js";
|
|
21
21
|
import { Option } from "./option.js";
|
|
22
22
|
import { KeyedIf, KeyedNg, KeyedNgItem, KeyedNgItemWithoutValue, KeyedNgOptions } from "./keyed-ng.js";
|
|
23
|
+
import { runtimeFn } from "./runtime.js";
|
|
24
|
+
import { Writable } from "ts-essentials";
|
|
23
25
|
|
|
24
26
|
/**
|
|
25
27
|
* Internal item representing a queued function in a ResolveSeq sequence.
|
|
@@ -143,32 +145,57 @@ export class ResolveSeq<T, CTX extends NonNullable<object> = object> {
|
|
|
143
145
|
type ResolveState = "initial" | "processed" | "waiting" | "processing";
|
|
144
146
|
|
|
145
147
|
/**
|
|
146
|
-
* Type helper that
|
|
148
|
+
* Type helper that awaits Promise types and passes through non-Promise types.
|
|
149
|
+
* This ensures that if a function returns a Promise<T>, the once method also returns Promise<T>,
|
|
150
|
+
* and if the function returns T (non-Promise), once returns T directly.
|
|
147
151
|
*
|
|
148
|
-
*
|
|
152
|
+
* Uses the built-in Awaited utility type to properly handle nested Promises and thenable objects.
|
|
153
|
+
*
|
|
154
|
+
* @template R - The type to process
|
|
149
155
|
*
|
|
150
156
|
* @example
|
|
151
157
|
* ```typescript
|
|
152
158
|
* type A = ResultOnce<Promise<number>>; // Promise<number>
|
|
153
159
|
* type B = ResultOnce<string>; // string
|
|
160
|
+
* type C = ResultOnce<number>; // number
|
|
161
|
+
* type D = ResultOnce<Promise<Promise<number>>>; // Promise<number>
|
|
154
162
|
* ```
|
|
155
163
|
*/
|
|
156
|
-
export type ResultOnce<R> = R extends Promise<
|
|
164
|
+
export type ResultOnce<R> = R extends Promise<unknown> ? Promise<Awaited<R>> : R;
|
|
165
|
+
|
|
166
|
+
export interface OnceActionArg<R, CTX> {
|
|
167
|
+
readonly ctx: CTX;
|
|
168
|
+
readonly self: ResolveOnceIf<R, CTX>;
|
|
169
|
+
}
|
|
157
170
|
|
|
171
|
+
// export type OnceAction<R, CTX, RET> = (arg: OnceActionArg<R, CTX>) => RET extends Promise<R> ? Promise<R> : R;
|
|
158
172
|
/**
|
|
159
173
|
* Interface defining the contract for ResolveOnce-like objects.
|
|
160
174
|
* @template R - The return type
|
|
161
175
|
* @template CTX - Optional context type
|
|
162
176
|
*/
|
|
163
|
-
export interface ResolveOnceIf<R, CTX
|
|
177
|
+
export interface ResolveOnceIf<R, CTX> {
|
|
164
178
|
get ready(): boolean;
|
|
165
|
-
get value():
|
|
179
|
+
get value(): R | undefined;
|
|
166
180
|
get error(): Error | undefined;
|
|
167
181
|
get state(): ResolveState;
|
|
168
182
|
|
|
169
|
-
|
|
170
|
-
|
|
183
|
+
setResetAfter(ms?: number): void;
|
|
184
|
+
|
|
185
|
+
once<RET extends R | Promise<R>>(fn: (arg: OnceActionArg<R, CTX>) => RET): ResultOnce<RET>;
|
|
186
|
+
reset<RET extends R | Promise<R>>(fn?: (arg: OnceActionArg<R, CTX>) => RET): ResultOnce<RET>;
|
|
187
|
+
|
|
188
|
+
setProcessed(state: StateInstance): void;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface SyncOrAsyncIf<T> {
|
|
192
|
+
get value(): T | undefined;
|
|
193
|
+
get error(): Error | undefined;
|
|
194
|
+
get queueLength(): number;
|
|
195
|
+
|
|
196
|
+
resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET>;
|
|
171
197
|
}
|
|
198
|
+
export type SyncOrAsync<T> = Option<SyncOrAsyncIf<T>>;
|
|
172
199
|
|
|
173
200
|
/**
|
|
174
201
|
* Synchronous version of ResolveOnce for functions that return non-promise values.
|
|
@@ -180,7 +207,7 @@ export interface ResolveOnceIf<R, CTX = void> {
|
|
|
180
207
|
* @template CTX - Optional context type
|
|
181
208
|
* @internal
|
|
182
209
|
*/
|
|
183
|
-
export class SyncResolveOnce<T, CTX
|
|
210
|
+
export class SyncResolveOnce<T, CTX> implements SyncOrAsyncIf<T> {
|
|
184
211
|
#value?: T;
|
|
185
212
|
#error?: Error;
|
|
186
213
|
|
|
@@ -223,10 +250,10 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
223
250
|
* @returns The result of the function
|
|
224
251
|
* @throws Error if the function returned a promise (use AsyncResolveOnce instead)
|
|
225
252
|
*/
|
|
226
|
-
resolve(fn: (
|
|
253
|
+
resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET> {
|
|
227
254
|
if (this.#state.isProcessing()) {
|
|
228
255
|
try {
|
|
229
|
-
this.#value = fn(
|
|
256
|
+
this.#value = fn() as unknown as T;
|
|
230
257
|
} catch (e) {
|
|
231
258
|
this.#error = e as Error;
|
|
232
259
|
} finally {
|
|
@@ -240,23 +267,7 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
240
267
|
if (this.#error) {
|
|
241
268
|
throw this.#error;
|
|
242
269
|
}
|
|
243
|
-
return this.#value as
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Resets the cached state, allowing the function to be executed again.
|
|
248
|
-
*
|
|
249
|
-
* @param fn - Optional function to execute immediately after reset
|
|
250
|
-
* @returns The result if fn provided, undefined otherwise
|
|
251
|
-
*/
|
|
252
|
-
reset(fn?: (c?: CTX) => T): T | undefined {
|
|
253
|
-
this.#value = undefined;
|
|
254
|
-
this.#error = undefined;
|
|
255
|
-
if (fn) {
|
|
256
|
-
this.#state.setProcessing();
|
|
257
|
-
return this.resolve(fn);
|
|
258
|
-
}
|
|
259
|
-
return undefined as T;
|
|
270
|
+
return this.#value as ResultOnce<RET>;
|
|
260
271
|
}
|
|
261
272
|
}
|
|
262
273
|
|
|
@@ -267,19 +278,19 @@ export class SyncResolveOnce<T, CTX = void> {
|
|
|
267
278
|
*/
|
|
268
279
|
class AsyncResolveItem<T, CTX> {
|
|
269
280
|
readonly id: number = Math.random();
|
|
270
|
-
readonly #toResolve: Promise<
|
|
271
|
-
#value: Option<
|
|
281
|
+
readonly #toResolve: Promise<T>;
|
|
282
|
+
#value: Option<T> = Option.None();
|
|
272
283
|
#error?: Error;
|
|
273
284
|
readonly #state: StateInstance;
|
|
274
|
-
readonly #rOnce:
|
|
285
|
+
readonly #rOnce: ResolveOnceIf<T, CTX>;
|
|
275
286
|
|
|
276
|
-
constructor(fn: Promise<
|
|
287
|
+
constructor(fn: Promise<T>, rOnce: ResolveOnceIf<T, CTX>, state: StateInstance) {
|
|
277
288
|
this.#toResolve = fn;
|
|
278
289
|
this.#state = state;
|
|
279
290
|
this.#rOnce = rOnce;
|
|
280
291
|
}
|
|
281
292
|
|
|
282
|
-
get value():
|
|
293
|
+
get value(): T | undefined {
|
|
283
294
|
return this.#value.IsSome() ? this.#value.unwrap() : undefined;
|
|
284
295
|
}
|
|
285
296
|
|
|
@@ -287,7 +298,7 @@ class AsyncResolveItem<T, CTX> {
|
|
|
287
298
|
return this.#error;
|
|
288
299
|
}
|
|
289
300
|
|
|
290
|
-
readonly #queue: Future<
|
|
301
|
+
readonly #queue: Future<T>[] = [];
|
|
291
302
|
|
|
292
303
|
get queuelength(): number {
|
|
293
304
|
return this.#queue.length;
|
|
@@ -300,7 +311,7 @@ class AsyncResolveItem<T, CTX> {
|
|
|
300
311
|
return this.#state.isProcessed() && this.#queue.length === 0;
|
|
301
312
|
}
|
|
302
313
|
|
|
303
|
-
#resolveFuture(future?: Future<
|
|
314
|
+
#resolveFuture(future?: Future<T>): void {
|
|
304
315
|
if (!future) {
|
|
305
316
|
return;
|
|
306
317
|
}
|
|
@@ -313,7 +324,7 @@ class AsyncResolveItem<T, CTX> {
|
|
|
313
324
|
}
|
|
314
325
|
}
|
|
315
326
|
|
|
316
|
-
#promiseResult(): Promise<
|
|
327
|
+
#promiseResult(): Promise<T> {
|
|
317
328
|
if (this.#error) {
|
|
318
329
|
return Promise.reject(this.#error);
|
|
319
330
|
}
|
|
@@ -326,9 +337,9 @@ class AsyncResolveItem<T, CTX> {
|
|
|
326
337
|
/**
|
|
327
338
|
* Resolves the async operation, queuing the request if already in progress.
|
|
328
339
|
*/
|
|
329
|
-
resolve():
|
|
340
|
+
resolve<RET extends T | Promise<T>>(_fn: () => RET): ResultOnce<RET> {
|
|
330
341
|
if (this.#state.isWaiting()) {
|
|
331
|
-
const future = new Future<
|
|
342
|
+
const future = new Future<T>();
|
|
332
343
|
this.#queue.push(future);
|
|
333
344
|
this.#toResolve
|
|
334
345
|
.then((value) => {
|
|
@@ -344,11 +355,11 @@ class AsyncResolveItem<T, CTX> {
|
|
|
344
355
|
this.#resolveFuture(this.#queue.shift());
|
|
345
356
|
}
|
|
346
357
|
});
|
|
347
|
-
return future.asPromise() as
|
|
358
|
+
return future.asPromise() as ResultOnce<RET>;
|
|
348
359
|
}
|
|
349
360
|
|
|
350
361
|
if (this.#state.isProcessed()) {
|
|
351
|
-
return this.#promiseResult() as
|
|
362
|
+
return this.#promiseResult() as ResultOnce<RET>;
|
|
352
363
|
}
|
|
353
364
|
// if (this.#state.isWaiting()) {
|
|
354
365
|
// const future = new Future<UnPromisify<T>>();
|
|
@@ -371,23 +382,23 @@ class AsyncResolveItem<T, CTX> {
|
|
|
371
382
|
* @internal
|
|
372
383
|
*/
|
|
373
384
|
|
|
374
|
-
function isAsyncResolveOnce<T, CTX>(obj: SyncOrAsync<T
|
|
385
|
+
function isAsyncResolveOnce<T, CTX>(obj: SyncOrAsync<T>): obj is Option<AsyncResolveOnce<T, CTX>> {
|
|
375
386
|
return obj.IsSome() && obj.Unwrap() instanceof AsyncResolveOnce;
|
|
376
387
|
}
|
|
377
388
|
|
|
378
|
-
export class AsyncResolveOnce<T, CTX
|
|
389
|
+
export class AsyncResolveOnce<T, CTX> implements SyncOrAsyncIf<T> {
|
|
379
390
|
// #state: ResolveState = "initial";
|
|
380
391
|
readonly #state: StateInstance;
|
|
381
392
|
|
|
382
393
|
readonly #queue: AsyncResolveItem<T, CTX>[];
|
|
383
394
|
|
|
384
|
-
readonly #rOnce:
|
|
385
|
-
//readonly #ctx?:
|
|
386
|
-
constructor(rOnce:
|
|
395
|
+
readonly #rOnce: ResolveOnceIf<T, CTX>;
|
|
396
|
+
//readonly #ctx?: RET;
|
|
397
|
+
constructor(rOnce: ResolveOnceIf<T, CTX>, state: StateInstance, prev: SyncOrAsync<T>) {
|
|
387
398
|
this.#state = state;
|
|
388
399
|
this.#rOnce = rOnce;
|
|
389
400
|
if (isAsyncResolveOnce(prev)) {
|
|
390
|
-
this.#queue = [...prev.unwrap().#queue];
|
|
401
|
+
this.#queue = [...(prev.unwrap().#queue as AsyncResolveItem<T, CTX>[])];
|
|
391
402
|
} else {
|
|
392
403
|
this.#queue = [];
|
|
393
404
|
}
|
|
@@ -411,7 +422,7 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
411
422
|
/**
|
|
412
423
|
* Gets the cached resolved value if available.
|
|
413
424
|
*/
|
|
414
|
-
get value():
|
|
425
|
+
get value(): T | undefined {
|
|
415
426
|
if (this.#state.isInitial()) {
|
|
416
427
|
return undefined;
|
|
417
428
|
}
|
|
@@ -435,16 +446,16 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
435
446
|
* @param fn - The async function to execute
|
|
436
447
|
* @returns A promise that resolves to the function's result
|
|
437
448
|
*/
|
|
438
|
-
resolve(fn: (
|
|
449
|
+
resolve<RET extends T | Promise<T>>(fn: () => RET): ResultOnce<RET> {
|
|
439
450
|
if (this.#state.isProcessing()) {
|
|
440
451
|
this.#state.setWaiting();
|
|
441
|
-
let promiseResult: Promise<
|
|
452
|
+
let promiseResult: Promise<T>;
|
|
442
453
|
try {
|
|
443
|
-
const couldBePromise = fn(
|
|
454
|
+
const couldBePromise = fn();
|
|
444
455
|
if (!isPromise(couldBePromise)) {
|
|
445
|
-
promiseResult = Promise.resolve(couldBePromise as
|
|
456
|
+
promiseResult = Promise.resolve(couldBePromise) as Promise<T>;
|
|
446
457
|
} else {
|
|
447
|
-
promiseResult = couldBePromise as Promise<
|
|
458
|
+
promiseResult = couldBePromise as Promise<T>;
|
|
448
459
|
}
|
|
449
460
|
} catch (e) {
|
|
450
461
|
promiseResult = Promise.reject(e as Error);
|
|
@@ -459,21 +470,7 @@ export class AsyncResolveOnce<T, CTX = void> {
|
|
|
459
470
|
.reverse()
|
|
460
471
|
.forEach((idx) => this.#queue.splice(idx, 1));
|
|
461
472
|
|
|
462
|
-
return this.#active().resolve();
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Resets the cached state, allowing the function to be executed again.
|
|
467
|
-
*
|
|
468
|
-
* @param fn - Optional function to execute immediately after reset
|
|
469
|
-
* @returns The result if fn provided, undefined otherwise
|
|
470
|
-
*/
|
|
471
|
-
reset(fn?: (c?: CTX) => T): T {
|
|
472
|
-
this.#state.setProcessing();
|
|
473
|
-
if (fn) {
|
|
474
|
-
return this.resolve(fn);
|
|
475
|
-
}
|
|
476
|
-
return undefined as T;
|
|
473
|
+
return this.#active().resolve(fn);
|
|
477
474
|
}
|
|
478
475
|
}
|
|
479
476
|
|
|
@@ -549,20 +546,24 @@ class StateInstance {
|
|
|
549
546
|
}
|
|
550
547
|
}
|
|
551
548
|
|
|
552
|
-
type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
|
|
549
|
+
// type SyncOrAsync<T, CTX> = Option<SyncResolveOnce<T, CTX> | AsyncResolveOnce<T, CTX>>;
|
|
553
550
|
|
|
554
551
|
export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
555
552
|
#state = new StateInstance();
|
|
556
553
|
|
|
557
|
-
#syncOrAsync: SyncOrAsync<T
|
|
554
|
+
#syncOrAsync: SyncOrAsync<T> = Option.None();
|
|
558
555
|
|
|
559
|
-
readonly #opts: ResolveOnceOpts
|
|
556
|
+
readonly #opts: Writable<ResolveOnceOpts>;
|
|
560
557
|
resetAfterTimer?: ReturnType<typeof setTimeout>;
|
|
561
558
|
|
|
562
|
-
readonly
|
|
559
|
+
readonly _onceArg: OnceActionArg<T, CTX>;
|
|
560
|
+
|
|
563
561
|
constructor(ctx?: CTX, opts?: ResolveOnceOpts) {
|
|
564
|
-
this
|
|
565
|
-
this
|
|
562
|
+
this.#opts = { ...(opts ?? {}) };
|
|
563
|
+
this._onceArg = {
|
|
564
|
+
ctx: ctx as CTX,
|
|
565
|
+
self: this,
|
|
566
|
+
};
|
|
566
567
|
}
|
|
567
568
|
|
|
568
569
|
get state(): ResolveState {
|
|
@@ -584,15 +585,47 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
|
584
585
|
this.#state.setProcessed();
|
|
585
586
|
if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
|
|
586
587
|
this.resetAfterTimer = setTimeout(() => {
|
|
587
|
-
this.reset();
|
|
588
|
+
void this.reset();
|
|
588
589
|
}, this.#opts.resetAfter);
|
|
589
|
-
if (!this.#opts.skipUnref) {
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
590
|
+
if (!this.#opts.skipUnref && this.resetAfterTimer) {
|
|
591
|
+
// node solution
|
|
592
|
+
const runtime = runtimeFn();
|
|
593
|
+
switch (true) {
|
|
594
|
+
case runtime.isDeno:
|
|
595
|
+
{
|
|
596
|
+
let id = this.resetAfterTimer as unknown as number;
|
|
597
|
+
if (typeof Deno.unrefTimer === "function") {
|
|
598
|
+
if (typeof this.resetAfterTimer === "number") {
|
|
599
|
+
id = this.resetAfterTimer;
|
|
600
|
+
} else {
|
|
601
|
+
try {
|
|
602
|
+
const ret = Reflect.ownKeys(this.resetAfterTimer).find((key) => {
|
|
603
|
+
return key.toString().includes("timerId");
|
|
604
|
+
});
|
|
605
|
+
if (ret) {
|
|
606
|
+
id = this.resetAfterTimer[ret as keyof typeof this.resetAfterTimer] as unknown as number;
|
|
607
|
+
// eslint-disable-next-line no-console
|
|
608
|
+
console.warn("Deno.unrefTimer timerId from struct:", id, "version:", globalThis.Deno?.version);
|
|
609
|
+
}
|
|
610
|
+
} catch (e) {
|
|
611
|
+
// eslint-disable-next-line no-console
|
|
612
|
+
console.warn(
|
|
613
|
+
"Deno.unrefTimer failed to get timerId",
|
|
614
|
+
e,
|
|
615
|
+
"id:",
|
|
616
|
+
this.resetAfterTimer,
|
|
617
|
+
"version:",
|
|
618
|
+
globalThis.Deno?.version,
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
Deno.unrefTimer(id);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
break;
|
|
626
|
+
case runtime.isNodeIsh:
|
|
627
|
+
(this.resetAfterTimer as unknown as { unref: () => void }).unref();
|
|
628
|
+
break;
|
|
596
629
|
}
|
|
597
630
|
}
|
|
598
631
|
}
|
|
@@ -603,11 +636,11 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
|
603
636
|
return !this.#state.isInitial();
|
|
604
637
|
}
|
|
605
638
|
|
|
606
|
-
get value():
|
|
639
|
+
get value(): T | undefined {
|
|
607
640
|
if (this.#state.isInitial()) {
|
|
608
641
|
return undefined;
|
|
609
642
|
}
|
|
610
|
-
return this.#syncOrAsync.Unwrap().value
|
|
643
|
+
return this.#syncOrAsync.Unwrap().value;
|
|
611
644
|
}
|
|
612
645
|
|
|
613
646
|
get queueLength(): number {
|
|
@@ -624,78 +657,65 @@ export class ResolveOnce<T, CTX = void> implements ResolveOnceIf<T, CTX> {
|
|
|
624
657
|
return this.#syncOrAsync.Unwrap().error;
|
|
625
658
|
}
|
|
626
659
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
// }
|
|
630
|
-
// set state(value: ResolveState) {
|
|
631
|
-
// console.log(`ResolveOnce.state ${this.#state} -> ${value}`);
|
|
632
|
-
// if (value === "processed") {
|
|
633
|
-
// if (this.resetAfterTimer) {
|
|
634
|
-
// clearTimeout(this.resetAfterTimer);
|
|
635
|
-
// }
|
|
636
|
-
// if (typeof this.#opts.resetAfter === "number" && this.#opts.resetAfter > 0) {
|
|
637
|
-
// console.log("setting reset timer for", this.#opts.resetAfter);
|
|
638
|
-
// this.resetAfterTimer = setTimeout(() => {
|
|
639
|
-
// console.log("resetting after", this.#opts.resetAfter);
|
|
640
|
-
// this.reset();
|
|
641
|
-
// }, this.#opts.resetAfter);
|
|
642
|
-
// }
|
|
643
|
-
// }
|
|
644
|
-
// this.#state = value;
|
|
645
|
-
// }
|
|
646
|
-
|
|
647
|
-
once<R>(fn: (c: CTX, prev?: T) => R): ResultOnce<R> {
|
|
648
|
-
let resultFn: (ctx: CTX) => R;
|
|
660
|
+
once<RET extends T | Promise<T>>(fn: (arg: OnceActionArg<T, CTX>) => RET): ResultOnce<RET> {
|
|
661
|
+
let resultFn: () => RET;
|
|
649
662
|
if (this.#state.isInitial()) {
|
|
650
663
|
const state = this.#state;
|
|
651
664
|
try {
|
|
652
665
|
state.setProcessing();
|
|
653
|
-
|
|
654
|
-
if (this.#syncOrAsync.IsSome()) {
|
|
655
|
-
prev = this.#syncOrAsync.Unwrap().value as T;
|
|
656
|
-
}
|
|
657
|
-
const isSyncOrAsync = fn(this._ctx ?? ({} as CTX), prev);
|
|
666
|
+
const isSyncOrAsync = fn(this._onceArg);
|
|
658
667
|
if (isPromise(isSyncOrAsync)) {
|
|
659
668
|
this.#syncOrAsync = Option.Some(new AsyncResolveOnce<T, CTX>(this, state, this.#syncOrAsync));
|
|
660
669
|
} else {
|
|
661
670
|
this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
|
|
662
671
|
}
|
|
663
|
-
resultFn = ():
|
|
672
|
+
resultFn = (): RET => isSyncOrAsync;
|
|
664
673
|
} catch (e) {
|
|
665
674
|
this.#syncOrAsync = Option.Some(new SyncResolveOnce<T, CTX>(this, state));
|
|
666
|
-
resultFn = ():
|
|
675
|
+
resultFn = (): RET => {
|
|
667
676
|
throw e;
|
|
668
677
|
};
|
|
669
678
|
}
|
|
670
679
|
} else {
|
|
671
|
-
resultFn = fn;
|
|
680
|
+
resultFn = (): RET => fn(this._onceArg);
|
|
672
681
|
}
|
|
673
682
|
if (!this.#syncOrAsync) {
|
|
674
683
|
throw new Error(`ResolveOnce.once impossible: state=${this.#state.getResolveState()}`);
|
|
675
684
|
}
|
|
676
|
-
return this.#syncOrAsync.Unwrap().resolve(resultFn
|
|
685
|
+
return this.#syncOrAsync.Unwrap().resolve(resultFn);
|
|
677
686
|
}
|
|
678
687
|
|
|
679
|
-
reset<
|
|
688
|
+
reset<RET extends T | Promise<T>>(fn?: (arg: OnceActionArg<T, CTX>) => RET): ResultOnce<RET> {
|
|
680
689
|
if (this.#state.isInitial()) {
|
|
681
690
|
if (!fn) {
|
|
682
|
-
return undefined as ResultOnce<
|
|
691
|
+
return undefined as ResultOnce<RET>;
|
|
683
692
|
}
|
|
684
|
-
return this.once(fn
|
|
693
|
+
return this.once(fn);
|
|
685
694
|
}
|
|
686
695
|
if (this.#state.isProcessing()) {
|
|
687
696
|
// eslint-disable-next-line no-console
|
|
688
697
|
console.warn("ResolveOnce.reset dropped was called while processing");
|
|
689
|
-
return undefined as ResultOnce<
|
|
698
|
+
return undefined as ResultOnce<RET>;
|
|
690
699
|
}
|
|
691
|
-
let ret = undefined as ResultOnce<
|
|
700
|
+
let ret = undefined as ResultOnce<RET>;
|
|
692
701
|
this.#state = new StateInstance();
|
|
693
702
|
if (fn) {
|
|
694
|
-
ret = this.once(fn
|
|
703
|
+
ret = this.once(fn);
|
|
695
704
|
// ret = this.#syncOrAsync.Unwrap().reset(fn as (c?: CTX) => never) as ResultOnce<R>
|
|
696
705
|
}
|
|
697
706
|
return ret;
|
|
698
707
|
}
|
|
708
|
+
|
|
709
|
+
setResetAfter(ms?: number): void {
|
|
710
|
+
if (this.resetAfterTimer) {
|
|
711
|
+
clearTimeout(this.resetAfterTimer);
|
|
712
|
+
}
|
|
713
|
+
if (typeof ms === "number" && ms > 0) {
|
|
714
|
+
this.#opts.resetAfter = ms;
|
|
715
|
+
} else {
|
|
716
|
+
this.#opts.resetAfter = undefined;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
699
719
|
}
|
|
700
720
|
|
|
701
721
|
// /**
|
|
@@ -732,11 +752,14 @@ export type AddKeyedParam<K, V, CTX extends NonNullable<object>> = Omit<KeyedNgO
|
|
|
732
752
|
*/
|
|
733
753
|
export type WithKey<X extends NonNullable<object>, K> = X & { readonly key: K };
|
|
734
754
|
|
|
755
|
+
// interface ResetFunc {
|
|
756
|
+
// reset(): void;
|
|
757
|
+
// }
|
|
735
758
|
/**
|
|
736
759
|
* Type helper that adds an optional reset method to a value type.
|
|
737
760
|
* @template V - The value type
|
|
738
761
|
*/
|
|
739
|
-
export type WithOptionalReset<V> = V
|
|
762
|
+
// export type WithOptionalReset<V> = V extends ResetFunc ? V & ResetFunc : V;
|
|
740
763
|
|
|
741
764
|
/**
|
|
742
765
|
* Represents an item in a KeyedResolvOnce collection with its resolved result.
|
|
@@ -750,7 +773,7 @@ export interface KeyedResolveOnceItem<K, T, CTX extends NonNullable<object>> {
|
|
|
750
773
|
/** The resolved value wrapped in a Result (Ok or Err) */
|
|
751
774
|
readonly value: Result<T>;
|
|
752
775
|
/** The complete KeyedNgItem containing metadata */
|
|
753
|
-
readonly item: KeyedNgItem<K, ResolveOnce<
|
|
776
|
+
readonly item: KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
|
|
754
777
|
}
|
|
755
778
|
|
|
756
779
|
/**
|
|
@@ -798,21 +821,25 @@ export interface KeyedResolveOnceItem<K, T, CTX extends NonNullable<object>> {
|
|
|
798
821
|
* .once(({ givenKey, ctx }) => fetchUser(givenKey, ctx));
|
|
799
822
|
* ```
|
|
800
823
|
*/
|
|
801
|
-
export class KeyedResolvOnce<
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
824
|
+
export class KeyedResolvOnce<
|
|
825
|
+
T,
|
|
826
|
+
//export type WithOptionalReset<V> = V extends ResetFunc ? V & ResetFunc : V;
|
|
827
|
+
// WithOptionalReset<PT>,
|
|
828
|
+
K = string,
|
|
829
|
+
CTX extends NonNullable<object> = object,
|
|
830
|
+
// PT = unknown,
|
|
831
|
+
> implements Omit<
|
|
832
|
+
// KeyedIf<ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, WithOptionalReset<T>, K>
|
|
833
|
+
KeyedIf<
|
|
834
|
+
KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
|
|
835
|
+
ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>,
|
|
836
|
+
K,
|
|
837
|
+
CTX
|
|
838
|
+
>,
|
|
839
|
+
"entries" | "forEach" | "onSet" | "onDelete" | "values" | "setParam"
|
|
840
|
+
> {
|
|
814
841
|
/** @internal */
|
|
815
|
-
readonly _keyed: KeyedNg<K, ResolveOnce<
|
|
842
|
+
readonly _keyed: KeyedNg<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>;
|
|
816
843
|
|
|
817
844
|
/**
|
|
818
845
|
* Creates a new KeyedResolvOnce instance.
|
|
@@ -820,7 +847,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
|
|
|
820
847
|
* @param kp - Configuration options (key2string, ctx, lru)
|
|
821
848
|
*/
|
|
822
849
|
constructor(kp: Partial<AddKeyedParam<K, T, CTX>> = {}) {
|
|
823
|
-
this._keyed = new KeyedNg({
|
|
850
|
+
this._keyed = new KeyedNg<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>({
|
|
824
851
|
createValue: (
|
|
825
852
|
item: KeyedNgItem<K, ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>>, CTX>,
|
|
826
853
|
): ResolveOnce<T, KeyedNgItemWithoutValue<K, CTX>> => {
|
|
@@ -991,7 +1018,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
|
|
|
991
1018
|
*/
|
|
992
1019
|
unget(key: K): void {
|
|
993
1020
|
const item = this._keyed.getItem(key);
|
|
994
|
-
item.value.reset?.();
|
|
1021
|
+
void item.value.reset?.();
|
|
995
1022
|
return this._keyed.delete(item.givenKey);
|
|
996
1023
|
}
|
|
997
1024
|
|
|
@@ -1003,7 +1030,7 @@ export class KeyedResolvOnce<T extends WithOptionalReset<PT>, K = string, CTX ex
|
|
|
1003
1030
|
*/
|
|
1004
1031
|
reset(): void {
|
|
1005
1032
|
for (const v of this._keyed.values()) {
|
|
1006
|
-
v.value.reset?.();
|
|
1033
|
+
void v.value.reset?.();
|
|
1007
1034
|
}
|
|
1008
1035
|
}
|
|
1009
1036
|
|
package/src/result.ts
CHANGED
|
@@ -57,6 +57,13 @@ export abstract class Result<T, E = Error> {
|
|
|
57
57
|
return false;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
static AsyncOk<T = void, E = Error>(...args: T[]): Promise<Result<T, E>> {
|
|
61
|
+
return Promise.resolve(Result.Ok<T, E>(...args));
|
|
62
|
+
}
|
|
63
|
+
static AsyncErr<T, E extends Error = Error>(t: E | string | Result<unknown, E>): Promise<Result<T, E>> {
|
|
64
|
+
return Promise.resolve(Result.Err<T, E>(t));
|
|
65
|
+
}
|
|
66
|
+
|
|
60
67
|
isOk(): boolean {
|
|
61
68
|
return this.is_ok();
|
|
62
69
|
}
|