zeed 1.3.0 → 1.4.0
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/AGENTS.md +50 -211
- package/README.md +16 -0
- package/dist/_experiments/bitcask.cjs +243 -1
- package/dist/_experiments/bitcask.cjs.map +1 -1
- package/dist/_experiments/bitcask.mjs +230 -1
- package/dist/_experiments/bitcask.mjs.map +1 -1
- package/dist/bin-BAoS4qtm.mjs +593 -0
- package/dist/{bin-SPdenYkw.mjs.map → bin-BAoS4qtm.mjs.map} +1 -1
- package/dist/bin-Ddaz2lxM.cjs +862 -0
- package/dist/{bin-Ce3i6ABn.cjs.map → bin-Ddaz2lxM.cjs.map} +1 -1
- package/dist/browser/base64.cjs +14 -1
- package/dist/browser/base64.cjs.map +1 -1
- package/dist/browser/base64.mjs +12 -1
- package/dist/browser/base64.mjs.map +1 -1
- package/dist/browser/gravatar.cjs +186 -1
- package/dist/browser/gravatar.cjs.map +1 -1
- package/dist/browser/gravatar.mjs +184 -1
- package/dist/browser/gravatar.mjs.map +1 -1
- package/dist/browser/index.cjs +14 -1
- package/dist/browser/index.mjs +8 -1
- package/dist/browser/localstorage.cjs +46 -1
- package/dist/browser/localstorage.cjs.map +1 -1
- package/dist/browser/localstorage.mjs +45 -1
- package/dist/browser/localstorage.mjs.map +1 -1
- package/dist/browser/log/index.cjs +8 -1
- package/dist/browser/log/index.mjs +5 -1
- package/dist/browser/log/log-browser-factory.cjs +65 -1
- package/dist/browser/log/log-browser-factory.cjs.map +1 -1
- package/dist/browser/log/log-browser-factory.mjs +64 -1
- package/dist/browser/log/log-browser-factory.mjs.map +1 -1
- package/dist/browser/log/log-browser.cjs +72 -1
- package/dist/browser/log/log-browser.cjs.map +1 -1
- package/dist/browser/log/log-browser.mjs +71 -1
- package/dist/browser/log/log-browser.mjs.map +1 -1
- package/dist/browser/log/log-colors.cjs +11 -1
- package/dist/browser/log/log-colors.cjs.map +1 -1
- package/dist/browser/log/log-colors.mjs +9 -1
- package/dist/browser/log/log-colors.mjs.map +1 -1
- package/dist/browser/log/log-context-browser.cjs +25 -1
- package/dist/browser/log/log-context-browser.cjs.map +1 -1
- package/dist/browser/log/log-context-browser.mjs +23 -1
- package/dist/browser/log/log-context-browser.mjs.map +1 -1
- package/dist/chunk-DQk6qfdC.mjs +18 -0
- package/dist/chunk-uaV2rQ02.cjs +53 -0
- package/dist/common/assert.cjs +22 -1
- package/dist/common/assert.cjs.map +1 -1
- package/dist/common/assert.mjs +19 -1
- package/dist/common/assert.mjs.map +1 -1
- package/dist/common/bin/index.cjs +106 -1
- package/dist/common/bin/index.cjs.map +1 -1
- package/dist/common/bin/index.mjs +98 -1
- package/dist/common/bin/index.mjs.map +1 -1
- package/dist/common/bin/lib0/binary.cjs +146 -1
- package/dist/common/bin/lib0/binary.cjs.map +1 -1
- package/dist/common/bin/lib0/binary.mjs +80 -1
- package/dist/common/bin/lib0/binary.mjs.map +1 -1
- package/dist/common/bin/lib0/buffer.cjs +42 -1
- package/dist/common/bin/lib0/buffer.cjs.map +1 -1
- package/dist/common/bin/lib0/buffer.mjs +38 -1
- package/dist/common/bin/lib0/buffer.mjs.map +1 -1
- package/dist/common/bin/lib0/create.cjs +24 -1
- package/dist/common/bin/lib0/create.cjs.map +1 -1
- package/dist/common/bin/lib0/create.mjs +21 -1
- package/dist/common/bin/lib0/create.mjs.map +1 -1
- package/dist/common/bin/lib0/decoding.cjs +325 -1
- package/dist/common/bin/lib0/decoding.cjs.map +1 -1
- package/dist/common/bin/lib0/decoding.mjs +298 -1
- package/dist/common/bin/lib0/decoding.mjs.map +1 -1
- package/dist/common/bin/lib0/encoding.cjs +404 -1
- package/dist/common/bin/lib0/encoding.cjs.map +1 -1
- package/dist/common/bin/lib0/encoding.mjs +377 -1
- package/dist/common/bin/lib0/encoding.mjs.map +1 -1
- package/dist/common/bin/lib0/string.cjs +81 -1
- package/dist/common/bin/lib0/string.cjs.map +1 -1
- package/dist/common/bin/lib0/string.mjs +71 -1
- package/dist/common/bin/lib0/string.mjs.map +1 -1
- package/dist/common/crypto/aes-sealed.cjs +34 -1
- package/dist/common/crypto/aes-sealed.cjs.map +1 -1
- package/dist/common/crypto/aes-sealed.mjs +32 -1
- package/dist/common/crypto/aes-sealed.mjs.map +1 -1
- package/dist/common/crypto/crypto.cjs +91 -1
- package/dist/common/crypto/crypto.cjs.map +1 -1
- package/dist/common/crypto/crypto.mjs +80 -1
- package/dist/common/crypto/crypto.mjs.map +1 -1
- package/dist/common/crypto/index.cjs +23 -1
- package/dist/common/crypto/index.mjs +5 -1
- package/dist/common/crypto/xaes.cjs +128 -1
- package/dist/common/crypto/xaes.cjs.map +1 -1
- package/dist/common/crypto/xaes.mjs +123 -1
- package/dist/common/crypto/xaes.mjs.map +1 -1
- package/dist/common/csv.cjs +49 -4
- package/dist/common/csv.cjs.map +1 -1
- package/dist/common/csv.mjs +46 -4
- package/dist/common/csv.mjs.map +1 -1
- package/dist/common/data/array.cjs +299 -1
- package/dist/common/data/array.cjs.map +1 -1
- package/dist/common/data/array.mjs +274 -1
- package/dist/common/data/array.mjs.map +1 -1
- package/dist/common/data/basex-secure.cjs +30 -1
- package/dist/common/data/basex-secure.mjs +3 -1
- package/dist/common/data/basex.cjs +163 -1
- package/dist/common/data/basex.cjs.map +1 -1
- package/dist/common/data/basex.mjs +152 -1
- package/dist/common/data/basex.mjs.map +1 -1
- package/dist/common/data/bin-types.mjs +1 -1
- package/dist/common/data/bin.cjs +21 -1
- package/dist/common/data/bin.mjs +3 -1
- package/dist/common/data/camelcase.cjs +27 -1
- package/dist/common/data/camelcase.cjs.map +1 -1
- package/dist/common/data/camelcase.mjs +22 -1
- package/dist/common/data/camelcase.mjs.map +1 -1
- package/dist/common/data/convert.cjs +104 -1
- package/dist/common/data/convert.cjs.map +1 -1
- package/dist/common/data/convert.mjs +88 -1
- package/dist/common/data/convert.mjs.map +1 -1
- package/dist/common/data/datauri.cjs +32 -1
- package/dist/common/data/datauri.cjs.map +1 -1
- package/dist/common/data/datauri.mjs +27 -1
- package/dist/common/data/datauri.mjs.map +1 -1
- package/dist/common/data/day-legacy.cjs +148 -1
- package/dist/common/data/day-legacy.cjs.map +1 -1
- package/dist/common/data/day-legacy.mjs +143 -1
- package/dist/common/data/day-legacy.mjs.map +1 -1
- package/dist/common/data/day.cjs +335 -1
- package/dist/common/data/day.cjs.map +1 -1
- package/dist/common/data/day.mjs +305 -1
- package/dist/common/data/day.mjs.map +1 -1
- package/dist/common/data/decimal.cjs +28 -1
- package/dist/common/data/decimal.cjs.map +1 -1
- package/dist/common/data/decimal.mjs +23 -1
- package/dist/common/data/decimal.mjs.map +1 -1
- package/dist/common/data/deep.cjs +57 -1
- package/dist/common/data/deep.cjs.map +1 -1
- package/dist/common/data/deep.mjs +54 -1
- package/dist/common/data/deep.mjs.map +1 -1
- package/dist/common/data/diff.cjs +62 -1
- package/dist/common/data/diff.cjs.map +1 -1
- package/dist/common/data/diff.mjs +60 -1
- package/dist/common/data/diff.mjs.map +1 -1
- package/dist/common/data/distributed.cjs +24 -1
- package/dist/common/data/distributed.cjs.map +1 -1
- package/dist/common/data/distributed.mjs +22 -1
- package/dist/common/data/distributed.mjs.map +1 -1
- package/dist/common/data/format.cjs +63 -1
- package/dist/common/data/format.cjs.map +1 -1
- package/dist/common/data/format.mjs +59 -1
- package/dist/common/data/format.mjs.map +1 -1
- package/dist/common/data/html.cjs +13 -1
- package/dist/common/data/html.cjs.map +1 -1
- package/dist/common/data/html.mjs +10 -1
- package/dist/common/data/html.mjs.map +1 -1
- package/dist/common/data/index.cjs +296 -1
- package/dist/common/data/index.mjs +37 -1
- package/dist/common/data/is.cjs +106 -1
- package/dist/common/data/is.cjs.map +1 -1
- package/dist/common/data/is.mjs +85 -1
- package/dist/common/data/is.mjs.map +1 -1
- package/dist/common/data/json.cjs +70 -1
- package/dist/common/data/json.cjs.map +1 -1
- package/dist/common/data/json.mjs +65 -1
- package/dist/common/data/json.mjs.map +1 -1
- package/dist/common/data/list.cjs +32 -1
- package/dist/common/data/list.cjs.map +1 -1
- package/dist/common/data/list.mjs +27 -1
- package/dist/common/data/list.mjs.map +1 -1
- package/dist/common/data/lru.mjs +1 -1
- package/dist/common/data/math.cjs +79 -1
- package/dist/common/data/math.cjs.map +1 -1
- package/dist/common/data/math.mjs +65 -1
- package/dist/common/data/math.mjs.map +1 -1
- package/dist/common/data/message.cjs +30 -1
- package/dist/common/data/message.cjs.map +1 -1
- package/dist/common/data/message.mjs +28 -1
- package/dist/common/data/message.mjs.map +1 -1
- package/dist/common/data/object-changes.cjs +66 -1
- package/dist/common/data/object-changes.cjs.map +1 -1
- package/dist/common/data/object-changes.mjs +63 -1
- package/dist/common/data/object-changes.mjs.map +1 -1
- package/dist/common/data/object.cjs +112 -1
- package/dist/common/data/object.cjs.map +1 -1
- package/dist/common/data/object.mjs +104 -1
- package/dist/common/data/object.mjs.map +1 -1
- package/dist/common/data/orderby.cjs +42 -1
- package/dist/common/data/orderby.cjs.map +1 -1
- package/dist/common/data/orderby.mjs +37 -1
- package/dist/common/data/orderby.mjs.map +1 -1
- package/dist/common/data/path.cjs +26 -1
- package/dist/common/data/path.cjs.map +1 -1
- package/dist/common/data/path.mjs +25 -1
- package/dist/common/data/path.mjs.map +1 -1
- package/dist/common/data/regexp.cjs +12 -1
- package/dist/common/data/regexp.cjs.map +1 -1
- package/dist/common/data/regexp.mjs +10 -1
- package/dist/common/data/regexp.mjs.map +1 -1
- package/dist/common/data/rounding.cjs +107 -1
- package/dist/common/data/rounding.cjs.map +1 -1
- package/dist/common/data/rounding.mjs +95 -1
- package/dist/common/data/rounding.mjs.map +1 -1
- package/dist/common/data/signal.cjs +39 -1
- package/dist/common/data/signal.cjs.map +1 -1
- package/dist/common/data/signal.mjs +38 -1
- package/dist/common/data/signal.mjs.map +1 -1
- package/dist/common/data/sortable.cjs +35 -1
- package/dist/common/data/sortable.cjs.map +1 -1
- package/dist/common/data/sortable.mjs +31 -1
- package/dist/common/data/sortable.mjs.map +1 -1
- package/dist/common/data/sorted.cjs +54 -1
- package/dist/common/data/sorted.cjs.map +1 -1
- package/dist/common/data/sorted.mjs +53 -1
- package/dist/common/data/sorted.mjs.map +1 -1
- package/dist/common/data/string-deburr.cjs +240 -1
- package/dist/common/data/string-deburr.cjs.map +1 -1
- package/dist/common/data/string-deburr.mjs +238 -1
- package/dist/common/data/string-deburr.mjs.map +1 -1
- package/dist/common/data/string-hash-fnv.cjs +69 -1
- package/dist/common/data/string-hash-fnv.cjs.map +1 -1
- package/dist/common/data/string-hash-fnv.mjs +67 -1
- package/dist/common/data/string-hash-fnv.mjs.map +1 -1
- package/dist/common/data/string-hash-pool.cjs +28 -1
- package/dist/common/data/string-hash-pool.cjs.map +1 -1
- package/dist/common/data/string-hash-pool.mjs +27 -1
- package/dist/common/data/string-hash-pool.mjs.map +1 -1
- package/dist/common/data/url.cjs +98 -2
- package/dist/common/data/url.cjs.map +1 -1
- package/dist/common/data/url.mjs +91 -2
- package/dist/common/data/url.mjs.map +1 -1
- package/dist/common/data/utils.cjs +118 -1
- package/dist/common/data/utils.cjs.map +1 -1
- package/dist/common/data/utils.mjs +107 -1
- package/dist/common/data/utils.mjs.map +1 -1
- package/dist/common/data/wordlist.cjs +531 -1
- package/dist/common/data/wordlist.cjs.map +1 -1
- package/dist/common/data/wordlist.mjs +529 -1
- package/dist/common/data/wordlist.mjs.map +1 -1
- package/dist/common/data/xrx.cjs +96 -1
- package/dist/common/data/xrx.cjs.map +1 -1
- package/dist/common/data/xrx.mjs +92 -1
- package/dist/common/data/xrx.mjs.map +1 -1
- package/dist/common/dispose-defer.cjs +133 -1
- package/dist/common/dispose-defer.cjs.map +1 -1
- package/dist/common/dispose-defer.mjs +130 -1
- package/dist/common/dispose-defer.mjs.map +1 -1
- package/dist/common/dispose-types.mjs +1 -1
- package/dist/common/dispose-utils.cjs +113 -1
- package/dist/common/dispose-utils.cjs.map +1 -1
- package/dist/common/dispose-utils.mjs +106 -1
- package/dist/common/dispose-utils.mjs.map +1 -1
- package/dist/common/exec/index.cjs +24 -1
- package/dist/common/exec/index.d.cts +1 -1
- package/dist/common/exec/index.d.mts +1 -1
- package/dist/common/exec/index.mjs +8 -1
- package/dist/common/exec/mutex.cjs +44 -1
- package/dist/common/exec/mutex.cjs.map +1 -1
- package/dist/common/exec/mutex.mjs +42 -1
- package/dist/common/exec/mutex.mjs.map +1 -1
- package/dist/common/exec/pool.cjs +181 -1
- package/dist/common/exec/pool.cjs.map +1 -1
- package/dist/common/exec/pool.d.cts +1 -1
- package/dist/common/exec/pool.d.mts +1 -1
- package/dist/common/exec/pool.mjs +180 -1
- package/dist/common/exec/pool.mjs.map +1 -1
- package/dist/common/exec/progress.cjs +149 -1
- package/dist/common/exec/progress.cjs.map +1 -1
- package/dist/common/exec/progress.d.cts +1 -1
- package/dist/common/exec/progress.d.mts +1 -1
- package/dist/common/exec/progress.mjs +148 -1
- package/dist/common/exec/progress.mjs.map +1 -1
- package/dist/common/exec/promise.cjs +113 -1
- package/dist/common/exec/promise.cjs.map +1 -1
- package/dist/common/exec/promise.mjs +103 -1
- package/dist/common/exec/promise.mjs.map +1 -1
- package/dist/common/exec/queue.cjs +125 -1
- package/dist/common/exec/queue.cjs.map +1 -1
- package/dist/common/exec/queue.d.cts +1 -1
- package/dist/common/exec/queue.d.mts +1 -1
- package/dist/common/exec/queue.mjs +124 -1
- package/dist/common/exec/queue.mjs.map +1 -1
- package/dist/common/exec/throttle-debounce.cjs +114 -1
- package/dist/common/exec/throttle-debounce.cjs.map +1 -1
- package/dist/common/exec/throttle-debounce.mjs +112 -1
- package/dist/common/exec/throttle-debounce.mjs.map +1 -1
- package/dist/common/global.cjs +22 -1
- package/dist/common/global.cjs.map +1 -1
- package/dist/common/global.mjs +19 -1
- package/dist/common/global.mjs.map +1 -1
- package/dist/common/index.cjs +559 -1
- package/dist/common/index.d.cts +1 -1
- package/dist/common/index.d.mts +1 -1
- package/dist/common/index.mjs +89 -1
- package/dist/common/localhost.cjs +16 -1
- package/dist/common/localhost.cjs.map +1 -1
- package/dist/common/localhost.mjs +14 -1
- package/dist/common/localhost.mjs.map +1 -1
- package/dist/common/log/index.cjs +34 -1
- package/dist/common/log/index.mjs +11 -1
- package/dist/common/log/log-base.cjs +40 -1
- package/dist/common/log/log-base.cjs.map +1 -1
- package/dist/common/log/log-base.mjs +31 -1
- package/dist/common/log/log-base.mjs.map +1 -1
- package/dist/common/log/log-colors.cjs +92 -1
- package/dist/common/log/log-colors.cjs.map +1 -1
- package/dist/common/log/log-colors.mjs +90 -1
- package/dist/common/log/log-colors.mjs.map +1 -1
- package/dist/common/log/log-config.cjs +15 -1
- package/dist/common/log/log-config.cjs.map +1 -1
- package/dist/common/log/log-config.mjs +14 -1
- package/dist/common/log/log-config.mjs.map +1 -1
- package/dist/common/log/log-console-capture.cjs +33 -1
- package/dist/common/log/log-console-capture.cjs.map +1 -1
- package/dist/common/log/log-console-capture.mjs +32 -1
- package/dist/common/log/log-console-capture.mjs.map +1 -1
- package/dist/common/log/log-console-original.cjs +27 -1
- package/dist/common/log/log-console-original.cjs.map +1 -1
- package/dist/common/log/log-console-original.mjs +26 -1
- package/dist/common/log/log-console-original.mjs.map +1 -1
- package/dist/common/log/log-console.cjs +39 -1
- package/dist/common/log/log-console.cjs.map +1 -1
- package/dist/common/log/log-console.mjs +38 -1
- package/dist/common/log/log-console.mjs.map +1 -1
- package/dist/common/log/log-context.cjs +109 -1
- package/dist/common/log/log-context.cjs.map +1 -1
- package/dist/common/log/log-context.mjs +108 -1
- package/dist/common/log/log-context.mjs.map +1 -1
- package/dist/common/log/log-filter.cjs +80 -1
- package/dist/common/log/log-filter.cjs.map +1 -1
- package/dist/common/log/log-filter.mjs +75 -1
- package/dist/common/log/log-filter.mjs.map +1 -1
- package/dist/common/log/log-memory.cjs +45 -1
- package/dist/common/log/log-memory.cjs.map +1 -1
- package/dist/common/log/log-memory.mjs +43 -1
- package/dist/common/log/log-memory.mjs.map +1 -1
- package/dist/common/log/log-noop.cjs +17 -1
- package/dist/common/log/log-noop.cjs.map +1 -1
- package/dist/common/log/log-noop.mjs +15 -1
- package/dist/common/log/log-noop.mjs.map +1 -1
- package/dist/common/log/log.cjs +46 -1
- package/dist/common/log/log.cjs.map +1 -1
- package/dist/common/log/log.mjs +43 -1
- package/dist/common/log/log.mjs.map +1 -1
- package/dist/common/msg/channel-debug.cjs +17 -1
- package/dist/common/msg/channel-debug.cjs.map +1 -1
- package/dist/common/msg/channel-debug.d.cts +1 -1
- package/dist/common/msg/channel-debug.d.mts +1 -1
- package/dist/common/msg/channel-debug.mjs +16 -1
- package/dist/common/msg/channel-debug.mjs.map +1 -1
- package/dist/common/msg/channel-local.cjs +28 -1
- package/dist/common/msg/channel-local.cjs.map +1 -1
- package/dist/common/msg/channel-local.d.cts +1 -1
- package/dist/common/msg/channel-local.d.mts +1 -1
- package/dist/common/msg/channel-local.mjs +26 -1
- package/dist/common/msg/channel-local.mjs.map +1 -1
- package/dist/common/msg/channel-resilient.cjs +63 -1
- package/dist/common/msg/channel-resilient.cjs.map +1 -1
- package/dist/common/msg/channel-resilient.d.cts +1 -1
- package/dist/common/msg/channel-resilient.d.mts +1 -1
- package/dist/common/msg/channel-resilient.mjs +62 -1
- package/dist/common/msg/channel-resilient.mjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.cjs +35 -1
- package/dist/common/msg/channel-wkwebview.cjs.map +1 -1
- package/dist/common/msg/channel-wkwebview.d.cts +2 -1
- package/dist/common/msg/channel-wkwebview.d.mts +2 -1
- package/dist/common/msg/channel-wkwebview.mjs +34 -1
- package/dist/common/msg/channel-wkwebview.mjs.map +1 -1
- package/dist/common/msg/channel.cjs +23 -1
- package/dist/common/msg/channel.cjs.map +1 -1
- package/dist/common/msg/channel.d.cts +1 -1
- package/dist/common/msg/channel.d.mts +1 -1
- package/dist/common/msg/channel.mjs +22 -1
- package/dist/common/msg/channel.mjs.map +1 -1
- package/dist/common/msg/emitter.cjs +141 -1
- package/dist/common/msg/emitter.cjs.map +1 -1
- package/dist/common/msg/emitter.d.cts +1 -1
- package/dist/common/msg/emitter.d.mts +1 -1
- package/dist/common/msg/emitter.mjs +139 -1
- package/dist/common/msg/emitter.mjs.map +1 -1
- package/dist/common/msg/encoder.cjs +38 -1
- package/dist/common/msg/encoder.cjs.map +1 -1
- package/dist/common/msg/encoder.mjs +35 -1
- package/dist/common/msg/encoder.mjs.map +1 -1
- package/dist/common/msg/index.cjs +28 -1
- package/dist/common/msg/index.d.cts +1 -1
- package/dist/common/msg/index.d.mts +1 -1
- package/dist/common/msg/index.mjs +11 -1
- package/dist/common/msg/messages.cjs +135 -1
- package/dist/common/msg/messages.cjs.map +1 -1
- package/dist/common/msg/messages.d.cts +1 -1
- package/dist/common/msg/messages.d.mts +1 -1
- package/dist/common/msg/messages.mjs +133 -1
- package/dist/common/msg/messages.mjs.map +1 -1
- package/dist/common/msg/pipe.mjs +1 -1
- package/dist/common/msg/pubsub.cjs +78 -1
- package/dist/common/msg/pubsub.cjs.map +1 -1
- package/dist/common/msg/pubsub.d.cts +1 -1
- package/dist/common/msg/pubsub.d.mts +1 -1
- package/dist/common/msg/pubsub.mjs +76 -1
- package/dist/common/msg/pubsub.mjs.map +1 -1
- package/dist/common/msg/rpc.cjs +142 -1
- package/dist/common/msg/rpc.cjs.map +1 -1
- package/dist/common/msg/rpc.mjs +139 -1
- package/dist/common/msg/rpc.mjs.map +1 -1
- package/dist/common/network.cjs +129 -1
- package/dist/common/network.cjs.map +1 -1
- package/dist/common/network.mjs +122 -1
- package/dist/common/network.mjs.map +1 -1
- package/dist/common/platform.cjs +92 -1
- package/dist/common/platform.cjs.map +1 -1
- package/dist/common/platform.mjs +84 -1
- package/dist/common/platform.mjs.map +1 -1
- package/dist/common/schema/_sandbox/sandbox-inherit.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.mjs +1 -1
- package/dist/common/schema/_sandbox/sandbox.xspec.mjs +1 -1
- package/dist/common/schema/export-json-schema.cjs +54 -1
- package/dist/common/schema/export-json-schema.cjs.map +1 -1
- package/dist/common/schema/export-json-schema.mjs +52 -1
- package/dist/common/schema/export-json-schema.mjs.map +1 -1
- package/dist/common/schema/export-swift.cjs +30 -2
- package/dist/common/schema/export-swift.cjs.map +1 -1
- package/dist/common/schema/export-swift.mjs +29 -2
- package/dist/common/schema/export-swift.mjs.map +1 -1
- package/dist/common/schema/export-typescript.cjs +20 -2
- package/dist/common/schema/export-typescript.cjs.map +1 -1
- package/dist/common/schema/export-typescript.mjs +19 -2
- package/dist/common/schema/export-typescript.mjs.map +1 -1
- package/dist/common/schema/index.cjs +55 -1
- package/dist/common/schema/index.mjs +12 -1
- package/dist/common/schema/parse-args.cjs +62 -2
- package/dist/common/schema/parse-args.cjs.map +1 -1
- package/dist/common/schema/parse-args.mjs +60 -2
- package/dist/common/schema/parse-args.mjs.map +1 -1
- package/dist/common/schema/parse-env.cjs +48 -3
- package/dist/common/schema/parse-env.cjs.map +1 -1
- package/dist/common/schema/parse-env.mjs +46 -3
- package/dist/common/schema/parse-env.mjs.map +1 -1
- package/dist/common/schema/parse-object.cjs +122 -1
- package/dist/common/schema/parse-object.cjs.map +1 -1
- package/dist/common/schema/parse-object.mjs +119 -1
- package/dist/common/schema/parse-object.mjs.map +1 -1
- package/dist/common/schema/schema-standard.mjs +1 -1
- package/dist/common/schema/schema.cjs +423 -1
- package/dist/common/schema/schema.cjs.map +1 -1
- package/dist/common/schema/schema.mjs +404 -1
- package/dist/common/schema/schema.mjs.map +1 -1
- package/dist/common/schema/serialize.cjs +109 -1
- package/dist/common/schema/serialize.cjs.map +1 -1
- package/dist/common/schema/serialize.mjs +107 -1
- package/dist/common/schema/serialize.mjs.map +1 -1
- package/dist/common/schema/type-test.mjs +1 -1
- package/dist/common/schema/utils.cjs +25 -1
- package/dist/common/schema/utils.cjs.map +1 -1
- package/dist/common/schema/utils.mjs +19 -1
- package/dist/common/schema/utils.mjs.map +1 -1
- package/dist/common/schema/z-collection.cjs +51 -1
- package/dist/common/schema/z-collection.mjs +27 -1
- package/dist/common/schema/z.cjs +9 -1
- package/dist/common/schema/z.mjs +3 -1
- package/dist/common/storage/index.cjs +4 -1
- package/dist/common/storage/index.mjs +3 -1
- package/dist/common/storage/memstorage.cjs +26 -1
- package/dist/common/storage/memstorage.cjs.map +1 -1
- package/dist/common/storage/memstorage.mjs +25 -1
- package/dist/common/storage/memstorage.mjs.map +1 -1
- package/dist/common/test.cjs +14 -1
- package/dist/common/test.cjs.map +1 -1
- package/dist/common/test.mjs +13 -1
- package/dist/common/test.mjs.map +1 -1
- package/dist/common/time.cjs +220 -1
- package/dist/common/time.cjs.map +1 -1
- package/dist/common/time.mjs +194 -1
- package/dist/common/time.mjs.map +1 -1
- package/dist/common/timeout.cjs +27 -1
- package/dist/common/timeout.cjs.map +1 -1
- package/dist/common/timeout.mjs +25 -1
- package/dist/common/timeout.mjs.map +1 -1
- package/dist/common/types.mjs +1 -1
- package/dist/common/utils.cjs +7 -1
- package/dist/common/utils.cjs.map +1 -1
- package/dist/common/utils.mjs +5 -1
- package/dist/common/utils.mjs.map +1 -1
- package/dist/common/uuid.cjs +307 -1
- package/dist/common/uuid.cjs.map +1 -1
- package/dist/common/uuid.mjs +284 -1
- package/dist/common/uuid.mjs.map +1 -1
- package/dist/{index-DHXVOH8h.d.cts → index-CFkMqHvX.d.cts} +1 -2
- package/dist/{index-DMaPyx9O.d.mts → index-C_3Y_s6f.d.mts} +1 -2
- package/dist/index.all.cjs +641 -1
- package/dist/index.all.d.cts +1 -1
- package/dist/index.all.d.mts +1 -1
- package/dist/index.all.mjs +113 -1
- package/dist/index.browser.cjs +576 -1
- package/dist/index.browser.d.cts +1 -1
- package/dist/index.browser.d.mts +1 -1
- package/dist/index.browser.mjs +98 -1
- package/dist/index.jsr.cjs +57 -1
- package/dist/index.jsr.mjs +6 -1
- package/dist/index.node.cjs +628 -1
- package/dist/index.node.d.cts +1 -1
- package/dist/index.node.d.mts +1 -1
- package/dist/index.node.mjs +106 -1
- package/dist/node/args.cjs +56 -1
- package/dist/node/args.cjs.map +1 -1
- package/dist/node/args.mjs +53 -1
- package/dist/node/args.mjs.map +1 -1
- package/dist/node/clipboard.cjs +18 -1
- package/dist/node/clipboard.cjs.map +1 -1
- package/dist/node/clipboard.mjs +16 -1
- package/dist/node/clipboard.mjs.map +1 -1
- package/dist/node/crypto.cjs +28 -1
- package/dist/node/crypto.cjs.map +1 -1
- package/dist/node/crypto.mjs +24 -1
- package/dist/node/crypto.mjs.map +1 -1
- package/dist/node/env.cjs +100 -4
- package/dist/node/env.cjs.map +1 -1
- package/dist/node/env.mjs +90 -4
- package/dist/node/env.mjs.map +1 -1
- package/dist/node/files-async.cjs +66 -1
- package/dist/node/files-async.cjs.map +1 -1
- package/dist/node/files-async.mjs +60 -1
- package/dist/node/files-async.mjs.map +1 -1
- package/dist/node/files.cjs +52 -1
- package/dist/node/files.cjs.map +1 -1
- package/dist/node/files.mjs +46 -1
- package/dist/node/files.mjs.map +1 -1
- package/dist/node/filestorage.cjs +100 -1
- package/dist/node/filestorage.cjs.map +1 -1
- package/dist/node/filestorage.mjs +97 -1
- package/dist/node/filestorage.mjs.map +1 -1
- package/dist/node/fs.cjs +119 -1
- package/dist/node/fs.cjs.map +1 -1
- package/dist/node/fs.mjs +101 -1
- package/dist/node/fs.mjs.map +1 -1
- package/dist/node/glob.cjs +75 -1
- package/dist/node/glob.cjs.map +1 -1
- package/dist/node/glob.mjs +73 -1
- package/dist/node/glob.mjs.map +1 -1
- package/dist/node/index.cjs +66 -1
- package/dist/node/index.mjs +16 -1
- package/dist/node/log/index.cjs +20 -1
- package/dist/node/log/index.mjs +7 -1
- package/dist/node/log/log-context-node.cjs +39 -1
- package/dist/node/log/log-context-node.cjs.map +1 -1
- package/dist/node/log/log-context-node.mjs +35 -1
- package/dist/node/log/log-context-node.mjs.map +1 -1
- package/dist/node/log/log-file-rotation.cjs +71 -1
- package/dist/node/log/log-file-rotation.cjs.map +1 -1
- package/dist/node/log/log-file-rotation.mjs +68 -1
- package/dist/node/log/log-file-rotation.mjs.map +1 -1
- package/dist/node/log/log-file.cjs +57 -1
- package/dist/node/log/log-file.cjs.map +1 -1
- package/dist/node/log/log-file.mjs +54 -1
- package/dist/node/log/log-file.mjs.map +1 -1
- package/dist/node/log/log-node.cjs +162 -1
- package/dist/node/log/log-node.cjs.map +1 -1
- package/dist/node/log/log-node.mjs +155 -1
- package/dist/node/log/log-node.mjs.map +1 -1
- package/dist/node/log/log-rotation.cjs +543 -3
- package/dist/node/log/log-rotation.cjs.map +1 -1
- package/dist/node/log/log-rotation.mjs +538 -3
- package/dist/node/log/log-rotation.mjs.map +1 -1
- package/dist/node/log/log-util.cjs +69 -3
- package/dist/node/log/log-util.cjs.map +1 -1
- package/dist/node/log/log-util.mjs +63 -3
- package/dist/node/log/log-util.mjs.map +1 -1
- package/dist/node/open-browser.cjs +20 -1
- package/dist/node/open-browser.cjs.map +1 -1
- package/dist/node/open-browser.mjs +18 -1
- package/dist/node/open-browser.mjs.map +1 -1
- package/package.json +15 -15
- package/src/common/schema/README.md +247 -66
- package/src/eslint-defaults.js +4 -0
- package/src/index.spec.ts +6 -6
- package/dist/bin-Ce3i6ABn.cjs +0 -3
- package/dist/bin-SPdenYkw.mjs +0 -3
- package/dist/chunk-0Lt9GpW0.mjs +0 -1
- package/dist/chunk-D-qHiVGv.cjs +0 -1
- package/src/common/schema/README-SCHEMA.md +0 -0
|
@@ -1 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Emitter, getGlobalEmitter } from "./emitter.mjs";
|
|
2
|
+
import { Channel } from "./channel.mjs";
|
|
3
|
+
import { DebugChannel } from "./channel-debug.mjs";
|
|
4
|
+
import { LocalChannel, createLocalChannelPair } from "./channel-local.mjs";
|
|
5
|
+
import { ResillientChannel } from "./channel-resilient.mjs";
|
|
6
|
+
import { CryptoEncoder, JsonEncoder, NoopEncoder } from "./encoder.mjs";
|
|
7
|
+
import { createPromiseProxy, useMessageHub } from "./messages.mjs";
|
|
8
|
+
import { PubSub, usePubSub } from "./pubsub.mjs";
|
|
9
|
+
import { RPCMode, useRPC, useRPCHub } from "./rpc.mjs";
|
|
10
|
+
|
|
11
|
+
export { Channel, CryptoEncoder, DebugChannel, Emitter, JsonEncoder, LocalChannel, NoopEncoder, PubSub, RPCMode, ResillientChannel, createLocalChannelPair, createPromiseProxy, getGlobalEmitter, useMessageHub, usePubSub, useRPC, useRPCHub };
|
|
@@ -1,2 +1,136 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_log_log = require('../log/log.cjs');
|
|
3
|
+
const require_common_data_convert = require('../data/convert.cjs');
|
|
4
|
+
const require_common_exec_promise = require('../exec/promise.cjs');
|
|
5
|
+
const require_common_uuid = require('../uuid.cjs');
|
|
6
|
+
const require_common_msg_encoder = require('./encoder.cjs');
|
|
7
|
+
|
|
8
|
+
//#region src/common/msg/messages.ts
|
|
9
|
+
function createPromiseProxy(fn, opt, predefinedMethods = {}) {
|
|
10
|
+
return new Proxy(predefinedMethods, { get: (target, name) => {
|
|
11
|
+
if (name in target) return target[name];
|
|
12
|
+
return (...args) => fn(name, args, opt);
|
|
13
|
+
} });
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* RPC
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Waits for connection
|
|
20
|
+
* - Retries after fail
|
|
21
|
+
* - Timeouts
|
|
22
|
+
*/
|
|
23
|
+
function useMessageHub(opt = {}) {
|
|
24
|
+
const { name = require_common_uuid.uname("hub"), encoder = new require_common_msg_encoder.JsonEncoder(), retryAfter = 1e3, ignoreUnhandled = true, logLevel = false } = opt;
|
|
25
|
+
const log = require_common_log_log.DefaultLogger(name, logLevel);
|
|
26
|
+
const handlers = {};
|
|
27
|
+
let channel;
|
|
28
|
+
const queue = [];
|
|
29
|
+
let queueRetryTimer;
|
|
30
|
+
const waitingForResponse = {};
|
|
31
|
+
const dispose = () => {
|
|
32
|
+
clearTimeout(queueRetryTimer);
|
|
33
|
+
};
|
|
34
|
+
const postNext = async () => {
|
|
35
|
+
clearTimeout(queueRetryTimer);
|
|
36
|
+
if (channel) {
|
|
37
|
+
if (channel.isConnected) while (queue.length) {
|
|
38
|
+
const message = queue[0];
|
|
39
|
+
try {
|
|
40
|
+
channel.postMessage(await encoder.encode(message));
|
|
41
|
+
queue.shift();
|
|
42
|
+
} catch (err) {
|
|
43
|
+
log.warn("postMessage", err);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (queue.length > 0 && retryAfter > 0) queueRetryTimer = setTimeout(postNext, retryAfter);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const postMessage = async (message) => {
|
|
51
|
+
log("enqueue postMessage", message);
|
|
52
|
+
queue.push(message);
|
|
53
|
+
await postNext();
|
|
54
|
+
};
|
|
55
|
+
const connect = async (newChannel) => {
|
|
56
|
+
channel = newChannel;
|
|
57
|
+
channel.on("connect", postNext);
|
|
58
|
+
channel.on("message", async (msg) => {
|
|
59
|
+
log("onmessage", typeof msg);
|
|
60
|
+
const { name, args, id, result, error } = await encoder.decode(msg.data);
|
|
61
|
+
if (name) {
|
|
62
|
+
log(`name ${name} id ${id}`);
|
|
63
|
+
try {
|
|
64
|
+
if (handlers[name] == null) throw new Error(`handler for ${name} was not found`);
|
|
65
|
+
let result = handlers[name](...args);
|
|
66
|
+
if (require_common_exec_promise.isPromise(result)) result = await result;
|
|
67
|
+
log(`result ${result}`);
|
|
68
|
+
if (id) await postMessage({
|
|
69
|
+
id,
|
|
70
|
+
result
|
|
71
|
+
});
|
|
72
|
+
} catch (error) {
|
|
73
|
+
const err = error instanceof Error ? error : new Error(require_common_data_convert.valueToString(error));
|
|
74
|
+
log.warn("execution error", err.name);
|
|
75
|
+
await postMessage({
|
|
76
|
+
id,
|
|
77
|
+
error: {
|
|
78
|
+
message: err.message,
|
|
79
|
+
stack: err.stack,
|
|
80
|
+
name: err.name
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
} else if (id) {
|
|
85
|
+
log(`response for id=${id}: result=${result}, error=${error}`);
|
|
86
|
+
if (waitingForResponse[id] == null) if (result === void 0) log(`skip response for ${id}`);
|
|
87
|
+
else log.warn(`no response hook for ${id}`);
|
|
88
|
+
else {
|
|
89
|
+
const [resolve, reject] = waitingForResponse[id];
|
|
90
|
+
if (resolve && reject) {
|
|
91
|
+
delete waitingForResponse[id];
|
|
92
|
+
if (error) {
|
|
93
|
+
const err = new Error(error.message);
|
|
94
|
+
err.stack = error.stack;
|
|
95
|
+
err.name = error.name;
|
|
96
|
+
log.warn("reject", err.name);
|
|
97
|
+
reject(err);
|
|
98
|
+
} else {
|
|
99
|
+
log("resolve", result);
|
|
100
|
+
resolve(result);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
} else if (!ignoreUnhandled) log.warn("Unhandled message", msg);
|
|
105
|
+
});
|
|
106
|
+
await postNext();
|
|
107
|
+
};
|
|
108
|
+
const fetchMessage = async (name, args, opt = {}) => {
|
|
109
|
+
const { timeout = 5e3 } = opt;
|
|
110
|
+
const id = require_common_uuid.uuid();
|
|
111
|
+
await postMessage({
|
|
112
|
+
name,
|
|
113
|
+
args,
|
|
114
|
+
id
|
|
115
|
+
});
|
|
116
|
+
return require_common_exec_promise.tryTimeout(new Promise((resolve, reject) => waitingForResponse[id] = [resolve, reject]), timeout);
|
|
117
|
+
};
|
|
118
|
+
if (opt.channel) connect(opt.channel);
|
|
119
|
+
return {
|
|
120
|
+
dispose,
|
|
121
|
+
connect,
|
|
122
|
+
listen(newHandlers) {
|
|
123
|
+
Object.assign(handlers, newHandlers);
|
|
124
|
+
},
|
|
125
|
+
send() {
|
|
126
|
+
return createPromiseProxy(fetchMessage, {}, { options(perCallopt) {
|
|
127
|
+
return createPromiseProxy(fetchMessage, { ...perCallopt });
|
|
128
|
+
} });
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
exports.createPromiseProxy = createPromiseProxy;
|
|
135
|
+
exports.useMessageHub = useMessageHub;
|
|
2
136
|
//# sourceMappingURL=messages.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.cjs","names":["uname","JsonEncoder","DefaultLogger","isPromise","valueToString","uuid","tryTimeout"],"sources":["../../../src/common/msg/messages.ts"],"sourcesContent":["import type { LogLevelAliasType } from '../log/log-base'\nimport type { Json } from '../types'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { DefaultLogger } from '../log/log'\nimport { uname, uuid } from '../uuid'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string, name: string, message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose: () => void\n connect?: (channel: Channel) => void\n options: (opt: MessagesOptions) => L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose: () => void\n connect: (newChannel: Channel) => void\n listen: <L extends MessageDefinitions>(newHandlers: L) => void\n send: <L extends MessageDefinitions>() => MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport function createPromiseProxy<P extends object>(fn: (name: string, args: any[], opt: any) => Promise<unknown>, opt: MessagesOptions, predefinedMethods: any = {}): P {\n return new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n}\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = DefaultLogger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [\n (result?: any) => any, // resolve\n (result?: any) => any, // reject\n ]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n\n channel.on('connect', postNext)\n\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.cjs","names":["uname","JsonEncoder","DefaultLogger","isPromise","valueToString","uuid","tryTimeout"],"sources":["../../../src/common/msg/messages.ts"],"sourcesContent":["import type { LogLevelAliasType } from '../log/log-base'\nimport type { Json } from '../types'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { DefaultLogger } from '../log/log'\nimport { uname, uuid } from '../uuid'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string, name: string, message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose: () => void\n connect?: (channel: Channel) => void\n options: (opt: MessagesOptions) => L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose: () => void\n connect: (newChannel: Channel) => void\n listen: <L extends MessageDefinitions>(newHandlers: L) => void\n send: <L extends MessageDefinitions>() => MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport function createPromiseProxy<P extends object>(fn: (name: string, args: any[], opt: any) => Promise<unknown>, opt: MessagesOptions, predefinedMethods: any = {}): P {\n return new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n}\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = DefaultLogger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [\n (result?: any) => any, // resolve\n (result?: any) => any, // reject\n ]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n\n channel.on('connect', postNext)\n\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as MessagesOptions, S as MessagesMethods, T as useMessageHub, _ as MessageAction, b as MessageResult, g as Message, v as MessageDefinitions, w as createPromiseProxy, x as MessagesDefaultMethods, y as MessageHub } from "../../index-
|
|
1
|
+
import { C as MessagesOptions, S as MessagesMethods, T as useMessageHub, _ as MessageAction, b as MessageResult, g as Message, v as MessageDefinitions, w as createPromiseProxy, x as MessagesDefaultMethods, y as MessageHub } from "../../index-CFkMqHvX.cjs";
|
|
2
2
|
export { Message, MessageAction, MessageDefinitions, MessageHub, MessageResult, MessagesDefaultMethods, MessagesMethods, MessagesOptions, createPromiseProxy, useMessageHub };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as MessagesOptions, S as MessagesMethods, T as useMessageHub, _ as MessageAction, b as MessageResult, g as Message, v as MessageDefinitions, w as createPromiseProxy, x as MessagesDefaultMethods, y as MessageHub } from "../../index-
|
|
1
|
+
import { C as MessagesOptions, S as MessagesMethods, T as useMessageHub, _ as MessageAction, b as MessageResult, g as Message, v as MessageDefinitions, w as createPromiseProxy, x as MessagesDefaultMethods, y as MessageHub } from "../../index-C_3Y_s6f.mjs";
|
|
2
2
|
export { Message, MessageAction, MessageDefinitions, MessageHub, MessageResult, MessagesDefaultMethods, MessagesMethods, MessagesOptions, createPromiseProxy, useMessageHub };
|
|
@@ -1,2 +1,134 @@
|
|
|
1
|
-
import{DefaultLogger
|
|
1
|
+
import { DefaultLogger } from "../log/log.mjs";
|
|
2
|
+
import { valueToString } from "../data/convert.mjs";
|
|
3
|
+
import { isPromise, tryTimeout } from "../exec/promise.mjs";
|
|
4
|
+
import { uname, uuid } from "../uuid.mjs";
|
|
5
|
+
import { JsonEncoder } from "./encoder.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/common/msg/messages.ts
|
|
8
|
+
function createPromiseProxy(fn, opt, predefinedMethods = {}) {
|
|
9
|
+
return new Proxy(predefinedMethods, { get: (target, name) => {
|
|
10
|
+
if (name in target) return target[name];
|
|
11
|
+
return (...args) => fn(name, args, opt);
|
|
12
|
+
} });
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* RPC
|
|
16
|
+
*
|
|
17
|
+
* Features:
|
|
18
|
+
* - Waits for connection
|
|
19
|
+
* - Retries after fail
|
|
20
|
+
* - Timeouts
|
|
21
|
+
*/
|
|
22
|
+
function useMessageHub(opt = {}) {
|
|
23
|
+
const { name = uname("hub"), encoder = new JsonEncoder(), retryAfter = 1e3, ignoreUnhandled = true, logLevel = false } = opt;
|
|
24
|
+
const log = DefaultLogger(name, logLevel);
|
|
25
|
+
const handlers = {};
|
|
26
|
+
let channel;
|
|
27
|
+
const queue = [];
|
|
28
|
+
let queueRetryTimer;
|
|
29
|
+
const waitingForResponse = {};
|
|
30
|
+
const dispose = () => {
|
|
31
|
+
clearTimeout(queueRetryTimer);
|
|
32
|
+
};
|
|
33
|
+
const postNext = async () => {
|
|
34
|
+
clearTimeout(queueRetryTimer);
|
|
35
|
+
if (channel) {
|
|
36
|
+
if (channel.isConnected) while (queue.length) {
|
|
37
|
+
const message = queue[0];
|
|
38
|
+
try {
|
|
39
|
+
channel.postMessage(await encoder.encode(message));
|
|
40
|
+
queue.shift();
|
|
41
|
+
} catch (err) {
|
|
42
|
+
log.warn("postMessage", err);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (queue.length > 0 && retryAfter > 0) queueRetryTimer = setTimeout(postNext, retryAfter);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const postMessage = async (message) => {
|
|
50
|
+
log("enqueue postMessage", message);
|
|
51
|
+
queue.push(message);
|
|
52
|
+
await postNext();
|
|
53
|
+
};
|
|
54
|
+
const connect = async (newChannel) => {
|
|
55
|
+
channel = newChannel;
|
|
56
|
+
channel.on("connect", postNext);
|
|
57
|
+
channel.on("message", async (msg) => {
|
|
58
|
+
log("onmessage", typeof msg);
|
|
59
|
+
const { name, args, id, result, error } = await encoder.decode(msg.data);
|
|
60
|
+
if (name) {
|
|
61
|
+
log(`name ${name} id ${id}`);
|
|
62
|
+
try {
|
|
63
|
+
if (handlers[name] == null) throw new Error(`handler for ${name} was not found`);
|
|
64
|
+
let result = handlers[name](...args);
|
|
65
|
+
if (isPromise(result)) result = await result;
|
|
66
|
+
log(`result ${result}`);
|
|
67
|
+
if (id) await postMessage({
|
|
68
|
+
id,
|
|
69
|
+
result
|
|
70
|
+
});
|
|
71
|
+
} catch (error) {
|
|
72
|
+
const err = error instanceof Error ? error : new Error(valueToString(error));
|
|
73
|
+
log.warn("execution error", err.name);
|
|
74
|
+
await postMessage({
|
|
75
|
+
id,
|
|
76
|
+
error: {
|
|
77
|
+
message: err.message,
|
|
78
|
+
stack: err.stack,
|
|
79
|
+
name: err.name
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
} else if (id) {
|
|
84
|
+
log(`response for id=${id}: result=${result}, error=${error}`);
|
|
85
|
+
if (waitingForResponse[id] == null) if (result === void 0) log(`skip response for ${id}`);
|
|
86
|
+
else log.warn(`no response hook for ${id}`);
|
|
87
|
+
else {
|
|
88
|
+
const [resolve, reject] = waitingForResponse[id];
|
|
89
|
+
if (resolve && reject) {
|
|
90
|
+
delete waitingForResponse[id];
|
|
91
|
+
if (error) {
|
|
92
|
+
const err = new Error(error.message);
|
|
93
|
+
err.stack = error.stack;
|
|
94
|
+
err.name = error.name;
|
|
95
|
+
log.warn("reject", err.name);
|
|
96
|
+
reject(err);
|
|
97
|
+
} else {
|
|
98
|
+
log("resolve", result);
|
|
99
|
+
resolve(result);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} else if (!ignoreUnhandled) log.warn("Unhandled message", msg);
|
|
104
|
+
});
|
|
105
|
+
await postNext();
|
|
106
|
+
};
|
|
107
|
+
const fetchMessage = async (name, args, opt = {}) => {
|
|
108
|
+
const { timeout = 5e3 } = opt;
|
|
109
|
+
const id = uuid();
|
|
110
|
+
await postMessage({
|
|
111
|
+
name,
|
|
112
|
+
args,
|
|
113
|
+
id
|
|
114
|
+
});
|
|
115
|
+
return tryTimeout(new Promise((resolve, reject) => waitingForResponse[id] = [resolve, reject]), timeout);
|
|
116
|
+
};
|
|
117
|
+
if (opt.channel) connect(opt.channel);
|
|
118
|
+
return {
|
|
119
|
+
dispose,
|
|
120
|
+
connect,
|
|
121
|
+
listen(newHandlers) {
|
|
122
|
+
Object.assign(handlers, newHandlers);
|
|
123
|
+
},
|
|
124
|
+
send() {
|
|
125
|
+
return createPromiseProxy(fetchMessage, {}, { options(perCallopt) {
|
|
126
|
+
return createPromiseProxy(fetchMessage, { ...perCallopt });
|
|
127
|
+
} });
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
//#endregion
|
|
133
|
+
export { createPromiseProxy, useMessageHub };
|
|
2
134
|
//# sourceMappingURL=messages.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.mjs","names":[],"sources":["../../../src/common/msg/messages.ts"],"sourcesContent":["import type { LogLevelAliasType } from '../log/log-base'\nimport type { Json } from '../types'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { DefaultLogger } from '../log/log'\nimport { uname, uuid } from '../uuid'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string, name: string, message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose: () => void\n connect?: (channel: Channel) => void\n options: (opt: MessagesOptions) => L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose: () => void\n connect: (newChannel: Channel) => void\n listen: <L extends MessageDefinitions>(newHandlers: L) => void\n send: <L extends MessageDefinitions>() => MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport function createPromiseProxy<P extends object>(fn: (name: string, args: any[], opt: any) => Promise<unknown>, opt: MessagesOptions, predefinedMethods: any = {}): P {\n return new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n}\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = DefaultLogger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [\n (result?: any) => any, // resolve\n (result?: any) => any, // reject\n ]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n\n channel.on('connect', postNext)\n\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.mjs","names":[],"sources":["../../../src/common/msg/messages.ts"],"sourcesContent":["import type { LogLevelAliasType } from '../log/log-base'\nimport type { Json } from '../types'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { DefaultLogger } from '../log/log'\nimport { uname, uuid } from '../uuid'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string, name: string, message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose: () => void\n connect?: (channel: Channel) => void\n options: (opt: MessagesOptions) => L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose: () => void\n connect: (newChannel: Channel) => void\n listen: <L extends MessageDefinitions>(newHandlers: L) => void\n send: <L extends MessageDefinitions>() => MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport function createPromiseProxy<P extends object>(fn: (name: string, args: any[], opt: any) => Promise<unknown>, opt: MessagesOptions, predefinedMethods: any = {}): P {\n return new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n}\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = DefaultLogger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [\n (result?: any) => any, // resolve\n (result?: any) => any, // reject\n ]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n\n channel.on('connect', postNext)\n\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n"],"mappings":"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"}
|
package/dist/common/msg/pipe.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
export { };
|
|
@@ -1,2 +1,79 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_common_log_log = require('../log/log.cjs');
|
|
3
|
+
const require_common_msg_emitter = require('./emitter.cjs');
|
|
4
|
+
const require_common_uuid = require('../uuid.cjs');
|
|
5
|
+
const require_common_msg_encoder = require('./encoder.cjs');
|
|
6
|
+
|
|
7
|
+
//#region src/common/msg/pubsub.ts
|
|
8
|
+
var PubSub = class extends require_common_msg_emitter.Emitter {
|
|
9
|
+
name;
|
|
10
|
+
channel;
|
|
11
|
+
encoder;
|
|
12
|
+
log;
|
|
13
|
+
debug;
|
|
14
|
+
get shortId() {
|
|
15
|
+
return this.name.substr(0, 6);
|
|
16
|
+
}
|
|
17
|
+
constructor(opt) {
|
|
18
|
+
super();
|
|
19
|
+
const { name, encoder = new require_common_msg_encoder.JsonEncoder(), channel, debug = false } = opt;
|
|
20
|
+
this.channel = channel;
|
|
21
|
+
this.encoder = encoder;
|
|
22
|
+
this.debug = debug;
|
|
23
|
+
this.name = name ?? this.channel.id ?? require_common_uuid.uname("pubsub");
|
|
24
|
+
this.log = require_common_log_log.DefaultLogger(`${this.shortId}`);
|
|
25
|
+
if (this.debug) {
|
|
26
|
+
this.channel.on("connect", () => {
|
|
27
|
+
this.log("channel connected");
|
|
28
|
+
});
|
|
29
|
+
this.channel.on("disconnect", () => {
|
|
30
|
+
this.log("channel disconnected");
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
this.channel.on("message", async ({ data }) => {
|
|
34
|
+
const info = await this.encoder.decode(data);
|
|
35
|
+
if (this.debug) this.log(`channel message, event=${info?.event}, info=`, info);
|
|
36
|
+
else this.log(`channel message, event=${info?.event}`);
|
|
37
|
+
if (info) {
|
|
38
|
+
const { event, args } = info;
|
|
39
|
+
await this.emitSuper(event, ...args);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async emitSuper(event, ...args) {
|
|
44
|
+
return await super.emit(event, ...args);
|
|
45
|
+
}
|
|
46
|
+
async emit(event, ...args) {
|
|
47
|
+
try {
|
|
48
|
+
if (this.debug) this.log(`emit(${String(event)})`, event);
|
|
49
|
+
else this.log(`emit(${String(event)})`, args.length);
|
|
50
|
+
if (!this.channel.isConnected) {
|
|
51
|
+
this.log.warn("channel not connected");
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const data = await this.encoder.encode({
|
|
55
|
+
event,
|
|
56
|
+
args
|
|
57
|
+
});
|
|
58
|
+
this.channel.postMessage(data);
|
|
59
|
+
return true;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
this.log.warn(`emit(${String(event)})`, err);
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
async publish(event, ...args) {
|
|
66
|
+
return await this.emit(event, ...args);
|
|
67
|
+
}
|
|
68
|
+
subscribe(event, fn, opt = {}) {
|
|
69
|
+
return this.on(event, fn, opt);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
function usePubSub(opt) {
|
|
73
|
+
return new PubSub(opt);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
exports.PubSub = PubSub;
|
|
78
|
+
exports.usePubSub = usePubSub;
|
|
2
79
|
//# sourceMappingURL=pubsub.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pubsub.cjs","names":["Emitter","JsonEncoder","uname","DefaultLogger"],"sources":["../../../src/common/msg/pubsub.ts"],"sourcesContent":["import type { DisposerFunction } from '../dispose-types'\nimport type { Channel } from './channel'\nimport type { DefaultListener, EmitterSubscriberOptions, ListenerSignature } from './emitter'\nimport type { Encoder } from './encoder'\nimport { DefaultLogger } from '../log/log'\nimport { uname } from '../uuid'\nimport { Emitter } from './emitter'\nimport { JsonEncoder } from './encoder'\n\nexport interface PubSubConfig {\n channel: Channel\n encoder?: Encoder\n name?: string\n debug?: boolean\n}\n\nexport class PubSub<L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n name: string\n channel: Channel\n encoder: Encoder\n log: any\n debug: boolean\n\n get shortId() {\n return this.name.substr(0, 6)\n }\n\n constructor(opt: PubSubConfig) {\n super()\n\n const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n this.channel = channel\n this.encoder = encoder\n this.debug = debug\n\n this.name = name ?? this.channel.id ?? uname('pubsub')\n this.log = DefaultLogger(`${this.shortId}`)\n\n if (this.debug) {\n this.channel.on('connect', () => {\n this.log('channel connected')\n })\n this.channel.on('disconnect', () => {\n this.log('channel disconnected')\n })\n }\n\n this.channel.on('message', async ({ data }) => {\n const info = await this.encoder.decode(data)\n if (this.debug)\n this.log(`channel message, event=${info?.event}, info=`, info)\n else this.log(`channel message, event=${info?.event}`)\n if (info) {\n const { event, args } = info\n await this.emitSuper(event, ...args)\n }\n })\n }\n\n private async emitSuper<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await super.emit(event, ...args)\n }\n\n async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n try {\n if (this.debug)\n this.log(`emit(${String(event)})`, event)\n else this.log(`emit(${String(event)})`, args.length)\n if (!this.channel.isConnected) {\n this.log.warn('channel not connected')\n return false\n }\n const data = await this.encoder.encode({ event, args })\n this.channel.postMessage(data)\n return true\n }\n catch (err) {\n this.log.warn(`emit(${String(event)})`, err)\n }\n return false\n }\n\n public async publish<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await this.emit(event, ...args)\n }\n\n public subscribe<U extends keyof L>(\n event: U,\n fn: L[U],\n opt: EmitterSubscriberOptions = {},\n ): DisposerFunction {\n return this.on(event as any as string | number, fn as any, opt)\n }\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n opt: PubSubConfig,\n) {\n return new PubSub<L>(opt)\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pubsub.cjs","names":["Emitter","JsonEncoder","uname","DefaultLogger"],"sources":["../../../src/common/msg/pubsub.ts"],"sourcesContent":["import type { DisposerFunction } from '../dispose-types'\nimport type { Channel } from './channel'\nimport type { DefaultListener, EmitterSubscriberOptions, ListenerSignature } from './emitter'\nimport type { Encoder } from './encoder'\nimport { DefaultLogger } from '../log/log'\nimport { uname } from '../uuid'\nimport { Emitter } from './emitter'\nimport { JsonEncoder } from './encoder'\n\nexport interface PubSubConfig {\n channel: Channel\n encoder?: Encoder\n name?: string\n debug?: boolean\n}\n\nexport class PubSub<L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n name: string\n channel: Channel\n encoder: Encoder\n log: any\n debug: boolean\n\n get shortId() {\n return this.name.substr(0, 6)\n }\n\n constructor(opt: PubSubConfig) {\n super()\n\n const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n this.channel = channel\n this.encoder = encoder\n this.debug = debug\n\n this.name = name ?? this.channel.id ?? uname('pubsub')\n this.log = DefaultLogger(`${this.shortId}`)\n\n if (this.debug) {\n this.channel.on('connect', () => {\n this.log('channel connected')\n })\n this.channel.on('disconnect', () => {\n this.log('channel disconnected')\n })\n }\n\n this.channel.on('message', async ({ data }) => {\n const info = await this.encoder.decode(data)\n if (this.debug)\n this.log(`channel message, event=${info?.event}, info=`, info)\n else this.log(`channel message, event=${info?.event}`)\n if (info) {\n const { event, args } = info\n await this.emitSuper(event, ...args)\n }\n })\n }\n\n private async emitSuper<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await super.emit(event, ...args)\n }\n\n async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n try {\n if (this.debug)\n this.log(`emit(${String(event)})`, event)\n else this.log(`emit(${String(event)})`, args.length)\n if (!this.channel.isConnected) {\n this.log.warn('channel not connected')\n return false\n }\n const data = await this.encoder.encode({ event, args })\n this.channel.postMessage(data)\n return true\n }\n catch (err) {\n this.log.warn(`emit(${String(event)})`, err)\n }\n return false\n }\n\n public async publish<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await this.emit(event, ...args)\n }\n\n public subscribe<U extends keyof L>(\n event: U,\n fn: L[U],\n opt: EmitterSubscriberOptions = {},\n ): DisposerFunction {\n return this.on(event as any as string | number, fn as any, opt)\n }\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n opt: PubSubConfig,\n) {\n return new PubSub<L>(opt)\n}\n"],"mappings":";;;;;;;AAgBA,IAAa,SAAb,cAA8EA,mCAAW;CACvF;CACA;CACA;CACA;CACA;CAEA,IAAI,UAAU;AACZ,SAAO,KAAK,KAAK,OAAO,GAAG,EAAE;;CAG/B,YAAY,KAAmB;AAC7B,SAAO;EAEP,MAAM,EAAE,MAAM,UAAU,IAAIC,wCAAa,EAAE,SAAS,QAAQ,UAAU;AAEtE,OAAK,UAAU;AACf,OAAK,UAAU;AACf,OAAK,QAAQ;AAEb,OAAK,OAAO,QAAQ,KAAK,QAAQ,MAAMC,0BAAM,SAAS;AACtD,OAAK,MAAMC,qCAAc,GAAG,KAAK,UAAU;AAE3C,MAAI,KAAK,OAAO;AACd,QAAK,QAAQ,GAAG,iBAAiB;AAC/B,SAAK,IAAI,oBAAoB;KAC7B;AACF,QAAK,QAAQ,GAAG,oBAAoB;AAClC,SAAK,IAAI,uBAAuB;KAChC;;AAGJ,OAAK,QAAQ,GAAG,WAAW,OAAO,EAAE,WAAW;GAC7C,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO,KAAK;AAC5C,OAAI,KAAK,MACP,MAAK,IAAI,0BAA0B,MAAM,MAAM,UAAU,KAAK;OAC3D,MAAK,IAAI,0BAA0B,MAAM,QAAQ;AACtD,OAAI,MAAM;IACR,MAAM,EAAE,OAAO,SAAS;AACxB,UAAM,KAAK,UAAU,OAAO,GAAG,KAAK;;IAEtC;;CAGJ,MAAc,UACZ,OACA,GAAG,MACe;AAClB,SAAO,MAAM,MAAM,KAAK,OAAO,GAAG,KAAK;;CAGzC,MAAM,KACJ,OACA,GAAG,MACe;AAClB,MAAI;AACF,OAAI,KAAK,MACP,MAAK,IAAI,QAAQ,OAAO,MAAM,CAAC,IAAI,MAAM;OACtC,MAAK,IAAI,QAAQ,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO;AACpD,OAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,SAAK,IAAI,KAAK,wBAAwB;AACtC,WAAO;;GAET,MAAM,OAAO,MAAM,KAAK,QAAQ,OAAO;IAAE;IAAO;IAAM,CAAC;AACvD,QAAK,QAAQ,YAAY,KAAK;AAC9B,UAAO;WAEF,KAAK;AACV,QAAK,IAAI,KAAK,QAAQ,OAAO,MAAM,CAAC,IAAI,IAAI;;AAE9C,SAAO;;CAGT,MAAa,QACX,OACA,GAAG,MACe;AAClB,SAAO,MAAM,KAAK,KAAK,OAAO,GAAG,KAAK;;CAGxC,AAAO,UACL,OACA,IACA,MAAgC,EAAE,EAChB;AAClB,SAAO,KAAK,GAAG,OAAiC,IAAW,IAAI;;;AAInE,SAAgB,UACd,KACA;AACA,QAAO,IAAI,OAAU,IAAI"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { h as usePubSub, m as PubSubConfig, p as PubSub } from "../../index-
|
|
1
|
+
import { h as usePubSub, m as PubSubConfig, p as PubSub } from "../../index-CFkMqHvX.cjs";
|
|
2
2
|
export { PubSub, PubSubConfig, usePubSub };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { h as usePubSub, m as PubSubConfig, p as PubSub } from "../../index-
|
|
1
|
+
import { h as usePubSub, m as PubSubConfig, p as PubSub } from "../../index-C_3Y_s6f.mjs";
|
|
2
2
|
export { PubSub, PubSubConfig, usePubSub };
|
|
@@ -1,2 +1,77 @@
|
|
|
1
|
-
import{DefaultLogger
|
|
1
|
+
import { DefaultLogger } from "../log/log.mjs";
|
|
2
|
+
import { Emitter } from "./emitter.mjs";
|
|
3
|
+
import { uname } from "../uuid.mjs";
|
|
4
|
+
import { JsonEncoder } from "./encoder.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/common/msg/pubsub.ts
|
|
7
|
+
var PubSub = class extends Emitter {
|
|
8
|
+
name;
|
|
9
|
+
channel;
|
|
10
|
+
encoder;
|
|
11
|
+
log;
|
|
12
|
+
debug;
|
|
13
|
+
get shortId() {
|
|
14
|
+
return this.name.substr(0, 6);
|
|
15
|
+
}
|
|
16
|
+
constructor(opt) {
|
|
17
|
+
super();
|
|
18
|
+
const { name, encoder = new JsonEncoder(), channel, debug = false } = opt;
|
|
19
|
+
this.channel = channel;
|
|
20
|
+
this.encoder = encoder;
|
|
21
|
+
this.debug = debug;
|
|
22
|
+
this.name = name ?? this.channel.id ?? uname("pubsub");
|
|
23
|
+
this.log = DefaultLogger(`${this.shortId}`);
|
|
24
|
+
if (this.debug) {
|
|
25
|
+
this.channel.on("connect", () => {
|
|
26
|
+
this.log("channel connected");
|
|
27
|
+
});
|
|
28
|
+
this.channel.on("disconnect", () => {
|
|
29
|
+
this.log("channel disconnected");
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
this.channel.on("message", async ({ data }) => {
|
|
33
|
+
const info = await this.encoder.decode(data);
|
|
34
|
+
if (this.debug) this.log(`channel message, event=${info?.event}, info=`, info);
|
|
35
|
+
else this.log(`channel message, event=${info?.event}`);
|
|
36
|
+
if (info) {
|
|
37
|
+
const { event, args } = info;
|
|
38
|
+
await this.emitSuper(event, ...args);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async emitSuper(event, ...args) {
|
|
43
|
+
return await super.emit(event, ...args);
|
|
44
|
+
}
|
|
45
|
+
async emit(event, ...args) {
|
|
46
|
+
try {
|
|
47
|
+
if (this.debug) this.log(`emit(${String(event)})`, event);
|
|
48
|
+
else this.log(`emit(${String(event)})`, args.length);
|
|
49
|
+
if (!this.channel.isConnected) {
|
|
50
|
+
this.log.warn("channel not connected");
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const data = await this.encoder.encode({
|
|
54
|
+
event,
|
|
55
|
+
args
|
|
56
|
+
});
|
|
57
|
+
this.channel.postMessage(data);
|
|
58
|
+
return true;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
this.log.warn(`emit(${String(event)})`, err);
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
async publish(event, ...args) {
|
|
65
|
+
return await this.emit(event, ...args);
|
|
66
|
+
}
|
|
67
|
+
subscribe(event, fn, opt = {}) {
|
|
68
|
+
return this.on(event, fn, opt);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
function usePubSub(opt) {
|
|
72
|
+
return new PubSub(opt);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { PubSub, usePubSub };
|
|
2
77
|
//# sourceMappingURL=pubsub.mjs.map
|