@smitejs/messaging 2.0.0-SNAPSHOT
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/dist/.tsbuildinfo +1 -0
- package/dist/broker.d.ts +31 -0
- package/dist/broker.d.ts.map +1 -0
- package/dist/broker.js +54 -0
- package/dist/channel.d.ts +87 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +54 -0
- package/dist/collector.d.ts +32 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +29 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/package.json +35 -0
- package/src/broker.ts +77 -0
- package/src/channel.ts +152 -0
- package/src/collector.ts +52 -0
- package/src/docs.test.ts +65 -0
- package/src/index.test.ts +119 -0
- package/src/index.ts +32 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/typescript/lib/lib.es2022.full.d.ts","../../core/dist/descriptor.d.ts","../../core/dist/app.d.ts","../../core/dist/constants.d.ts","../../core/dist/scope.d.ts","../../core/dist/registry.d.ts","../../core/dist/index.d.ts","../../../node_modules/zod/v4/core/json-schema.d.cts","../../../node_modules/zod/v4/core/standard-schema.d.cts","../../../node_modules/zod/v4/core/registries.d.cts","../../../node_modules/zod/v4/core/to-json-schema.d.cts","../../../node_modules/zod/v4/core/util.d.cts","../../../node_modules/zod/v4/core/versions.d.cts","../../../node_modules/zod/v4/core/schemas.d.cts","../../../node_modules/zod/v4/core/checks.d.cts","../../../node_modules/zod/v4/core/errors.d.cts","../../../node_modules/zod/v4/core/core.d.cts","../../../node_modules/zod/v4/core/parse.d.cts","../../../node_modules/zod/v4/core/regexes.d.cts","../../../node_modules/zod/v4/locales/ar.d.cts","../../../node_modules/zod/v4/locales/az.d.cts","../../../node_modules/zod/v4/locales/be.d.cts","../../../node_modules/zod/v4/locales/bg.d.cts","../../../node_modules/zod/v4/locales/ca.d.cts","../../../node_modules/zod/v4/locales/cs.d.cts","../../../node_modules/zod/v4/locales/da.d.cts","../../../node_modules/zod/v4/locales/de.d.cts","../../../node_modules/zod/v4/locales/el.d.cts","../../../node_modules/zod/v4/locales/en.d.cts","../../../node_modules/zod/v4/locales/eo.d.cts","../../../node_modules/zod/v4/locales/es.d.cts","../../../node_modules/zod/v4/locales/fa.d.cts","../../../node_modules/zod/v4/locales/fi.d.cts","../../../node_modules/zod/v4/locales/fr.d.cts","../../../node_modules/zod/v4/locales/fr-CA.d.cts","../../../node_modules/zod/v4/locales/he.d.cts","../../../node_modules/zod/v4/locales/hr.d.cts","../../../node_modules/zod/v4/locales/hu.d.cts","../../../node_modules/zod/v4/locales/hy.d.cts","../../../node_modules/zod/v4/locales/id.d.cts","../../../node_modules/zod/v4/locales/is.d.cts","../../../node_modules/zod/v4/locales/it.d.cts","../../../node_modules/zod/v4/locales/ja.d.cts","../../../node_modules/zod/v4/locales/ka.d.cts","../../../node_modules/zod/v4/locales/kh.d.cts","../../../node_modules/zod/v4/locales/km.d.cts","../../../node_modules/zod/v4/locales/ko.d.cts","../../../node_modules/zod/v4/locales/lt.d.cts","../../../node_modules/zod/v4/locales/mk.d.cts","../../../node_modules/zod/v4/locales/ms.d.cts","../../../node_modules/zod/v4/locales/nl.d.cts","../../../node_modules/zod/v4/locales/no.d.cts","../../../node_modules/zod/v4/locales/ota.d.cts","../../../node_modules/zod/v4/locales/ps.d.cts","../../../node_modules/zod/v4/locales/pl.d.cts","../../../node_modules/zod/v4/locales/pt.d.cts","../../../node_modules/zod/v4/locales/ro.d.cts","../../../node_modules/zod/v4/locales/ru.d.cts","../../../node_modules/zod/v4/locales/sl.d.cts","../../../node_modules/zod/v4/locales/sv.d.cts","../../../node_modules/zod/v4/locales/ta.d.cts","../../../node_modules/zod/v4/locales/th.d.cts","../../../node_modules/zod/v4/locales/tr.d.cts","../../../node_modules/zod/v4/locales/ua.d.cts","../../../node_modules/zod/v4/locales/uk.d.cts","../../../node_modules/zod/v4/locales/ur.d.cts","../../../node_modules/zod/v4/locales/uz.d.cts","../../../node_modules/zod/v4/locales/vi.d.cts","../../../node_modules/zod/v4/locales/zh-CN.d.cts","../../../node_modules/zod/v4/locales/zh-TW.d.cts","../../../node_modules/zod/v4/locales/yo.d.cts","../../../node_modules/zod/v4/locales/index.d.cts","../../../node_modules/zod/v4/core/doc.d.cts","../../../node_modules/zod/v4/core/api.d.cts","../../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../../node_modules/zod/v4/core/index.d.cts","../../../node_modules/zod/v4/classic/errors.d.cts","../../../node_modules/zod/v4/classic/parse.d.cts","../../../node_modules/zod/v4/classic/schemas.d.cts","../../../node_modules/zod/v4/classic/checks.d.cts","../../../node_modules/zod/v4/classic/compat.d.cts","../../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../../node_modules/zod/v4/classic/iso.d.cts","../../../node_modules/zod/v4/classic/coerce.d.cts","../../../node_modules/zod/v4/classic/external.d.cts","../../../node_modules/zod/index.d.cts","../src/channel.ts","../src/collector.ts","../src/broker.ts","../src/index.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/ssh2/index.d.ts","../../../node_modules/@types/docker-modem/index.d.ts","../../../node_modules/@types/dockerode/index.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/unist/index.d.ts","../../../node_modules/@types/hast/index.d.ts","../../../node_modules/@types/linkify-it/build/index.cjs.d.ts","../../../node_modules/@types/linkify-it/index.d.ts","../../../node_modules/mdurl/lib/index.d.ts","../../../node_modules/@types/markdown-it/dist/index.cjs.d.ts","../../../node_modules/@types/markdown-it/index.d.ts","../../../node_modules/@types/mdast/index.d.ts","../../../node_modules/@types/mdurl/build/index.cjs.d.ts","../../../node_modules/@types/mdurl/index.d.ts","../../../node_modules/@types/ssh2-streams/index.d.ts"],"fileIdsList":[[159,209,223,226,227,229,241,259,260],[159,209,220,226,227,241,259,260,261],[159,209,226,227],[159,209,226,227,264],[159,209,226,227,266],[159,209,226,227,266,268],[159,209,226,227,269],[159,209,226,227,272],[159,206,207,209,226,227],[159,208,209,226,227],[209,226,227],[159,209,214,226,227,244],[159,209,210,215,220,226,227,229,241,252],[159,209,210,211,220,226,227,229],[154,155,156,159,209,226,227],[159,209,212,226,227,253],[159,209,213,214,221,226,227,230],[159,209,214,226,227,241,249],[159,209,215,217,220,226,227,229],[159,208,209,216,226,227],[159,209,217,218,226,227],[159,209,219,220,226,227],[159,208,209,220,226,227],[159,209,220,221,222,226,227,241,252],[159,209,220,221,222,226,227,236,241,244],[159,201,209,217,220,223,226,227,229,241,252],[159,209,220,221,223,224,226,227,229,241,249,252],[159,209,223,225,226,227,241,249,252],[157,158,159,160,161,162,163,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258],[159,209,220,226,227],[159,209,226,227,228,252],[159,209,217,220,226,227,229,241],[159,209,226,227,230],[159,209,226,227,231],[159,208,209,226,227,232],[159,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258],[159,209,226,227,234],[159,209,226,227,235],[159,209,220,226,227,236,237],[159,209,226,227,236,238,253,255],[159,209,221,226,227],[159,209,220,226,227,241,242,244],[159,209,226,227,243,244],[159,209,226,227,241,242],[159,209,226,227,244],[159,209,226,227,245],[159,206,209,226,227,241,246,252],[159,209,220,226,227,247,248],[159,209,226,227,247,248],[159,209,214,226,227,229,241,249],[159,209,226,227,250],[159,209,226,227,229,251],[159,209,223,226,227,235,252],[159,209,214,226,227,253],[159,209,226,227,241,254],[159,209,226,227,228,255],[159,209,226,227,256],[159,201,209,226,227],[159,201,209,220,222,226,227,232,241,244,252,254,255,257],[159,209,226,227,241,258],[159,209,226,227,241,259],[159,209,220,223,225,226,227,229,241,259],[159,173,177,209,226,227,252],[159,173,209,226,227,241,252],[159,168,209,226,227],[159,170,173,209,226,227,249,252],[159,209,226,227,229,249],[159,209,226,227,259],[159,168,209,226,227,259],[159,170,173,209,226,227,229,252],[159,165,166,169,172,209,220,226,227,241,252],[159,173,180,209,226,227],[159,165,171,209,226,227],[159,173,194,195,209,226,227],[159,169,173,209,226,227,244,252,259],[159,194,209,226,227,259],[159,167,168,209,226,227,259],[159,173,209,226,227],[159,167,168,169,170,171,172,173,174,175,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,195,196,197,198,199,200,209,226,227],[159,173,188,209,226,227],[159,173,180,181,209,226,227],[159,171,173,181,182,209,226,227],[159,172,209,226,227],[159,165,168,173,209,226,227],[159,173,177,181,182,209,226,227],[159,177,209,226,227],[159,171,173,176,209,226,227,252],[159,165,170,173,180,209,226,227],[159,209,226,227,241],[159,168,173,194,209,226,227,257,259],[148,159,209,226,227],[139,159,209,226,227],[139,142,159,209,226,227],[74,134,137,139,140,141,142,143,144,145,146,147,159,209,226,227],[70,72,142,159,209,226,227],[139,140,159,209,226,227],[71,139,141,159,209,226,227],[72,74,76,77,78,79,159,209,226,227],[74,76,78,79,159,209,226,227],[74,76,78,159,209,226,227],[71,74,76,77,79,159,209,226,227],[70,72,73,74,75,76,77,78,79,80,81,134,135,136,137,138,159,209,226,227],[70,72,73,76,159,209,226,227],[72,73,76,159,209,226,227],[76,79,159,209,226,227],[70,71,73,74,75,77,78,79,159,209,226,227],[70,71,72,76,139,159,209,226,227],[76,77,78,79,159,209,226,227],[78,159,209,226,227],[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,159,209,226,227],[64,159,209,226,227],[64,65,66,67,68,159,209,226,227],[69,151,159,209,226,227],[69,149,159,209,226,227],[69,149,150,159,209,226,227],[150,151,152,159,209,226,227]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3cbad9a1ba4453443026ed38e4b8be018abb26565fa7c944376463ad9df07c41","impliedFormat":1},{"version":"ef07fb22b1b3ad89bc5c9ebd252ff68e81bca1507eb2852b396f10c07d43829c","impliedFormat":99},{"version":"05231a76ecb4853c3b515e27d873556403b9b13edbd4a4163762ef9485b3fd86","impliedFormat":99},{"version":"35eb03cfedd8efacead37f1b3d6eee65dd846cda1f3f0eb7890899beead8842c","impliedFormat":99},{"version":"ed90b73c3541b92f452f9b2fadc25f25fbbfdd1b772dc11a4b6cf780cc75975a","impliedFormat":99},{"version":"61f44bd2cf47909041497e551ebd8227b144224a4f0951000f91017ac72f2834","impliedFormat":99},{"version":"c4bc20ce6023d9f6a6532a99bcbd75b32763bc700ce96cc922d456b73dbcacb1","impliedFormat":99},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"f1c14d25520b0e9e1eb08dca0d39f0f0ce1aa9b64c0cb8ce13c1717426a505f0","signature":"d8d3523d6f480ed4c982f1efe53d1c76b0e777097f8b74a4ce595f7ea74eb847","impliedFormat":99},{"version":"0b3e04fdbe4210a89064615eb5415906759ba0c67070e59e0e28341a26040330","signature":"7735055a4177006e1aca4bb36895242db3270954cdcc84a995b5860960334165","impliedFormat":99},{"version":"2c3f957344c27c272eadf60036616d39f8e7199b8fb5ac5b41e5b39a35ca2027","signature":"de090b7fa0c147bae8c58eb9318be6019156375ff6c9d3f0830d5037d4313712","impliedFormat":99},{"version":"7f096c747d420294c51a3dbb65e4686c80c2dbf7aab6d9394869693782e1295e","signature":"138b764bbad3a46a98addfb8905f397fbfe73c5e8f40fc5efac191c43ab8d99f","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"4371055bb001f40596e2e236b27583e13bf11e75d937962f8947d56519237fb8","impliedFormat":1},{"version":"89189df027e8910200a4b65af1e29a996225cf25975f5c438fbe9361c008fc6b","impliedFormat":1},{"version":"4555baaea5dfc93e0c0ba3fc326b0ba3ad50bb2ab887fa2dff49c7da7bd3bcaa","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"347a238c5800881e93ca9d17bece9f7eaf61b000dd1575b67264cb4ececc10b6","impliedFormat":1},{"version":"742f21debb3937c3839a63245648238555bdab1ea095d43fd10c88a64029bf76","impliedFormat":1},{"version":"7cfdf3b9a5ba934a058bfc9390c074104dc7223b7e3c16fd5335206d789bc3d3","impliedFormat":1},{"version":"74b19240ade8cf0b56f8c7c3fe2d1981811156deb4457c1b38737aa9b6bfca1b","impliedFormat":1},{"version":"8a7219b41d3c1c93f3f3b779146f313efade2404eeece88dcd366df7e2364977","impliedFormat":1},{"version":"a109c4289d59d9019cfe1eeab506fe57817ee549499b02a83a7e9d3bdf662d63","impliedFormat":1},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"0944f27ebff4b20646b71e7e3faaaae50a6debd40bc63e225de1320dd15c5795","impliedFormat":1},{"version":"5d30565583300c9256072a013ac0318cc603ff769b4c5cafc222394ea93963e1","impliedFormat":1},{"version":"2e23be37a190953f60cdc4a62f89e5dfe4d6c64f38c71564bc0fb63c7810c9a1","impliedFormat":1}],"root":[[150,153]],"options":{"composite":true,"declaration":true,"declarationMap":true,"exactOptionalPropertyTypes":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[261,1],[262,2],[263,3],[265,4],[266,3],[267,5],[269,6],[270,7],[271,4],[272,3],[273,8],[206,9],[207,9],[208,10],[159,11],[209,12],[210,13],[211,14],[154,3],[157,15],[155,3],[156,3],[212,16],[213,17],[214,18],[215,19],[216,20],[217,21],[218,21],[219,22],[220,23],[221,24],[222,25],[160,3],[158,3],[223,26],[224,27],[225,28],[259,29],[226,30],[227,3],[228,31],[229,32],[230,33],[231,34],[232,35],[233,36],[234,37],[235,38],[236,39],[237,39],[238,40],[239,3],[240,41],[241,42],[243,43],[242,44],[244,45],[245,46],[246,47],[247,48],[248,49],[249,50],[250,51],[251,52],[252,53],[253,54],[254,55],[255,56],[256,57],[161,3],[162,3],[163,3],[202,58],[203,3],[204,3],[205,45],[257,59],[258,60],[274,61],[260,62],[264,3],[164,3],[268,3],[61,3],[62,3],[12,3],[10,3],[11,3],[16,3],[15,3],[2,3],[17,3],[18,3],[19,3],[20,3],[21,3],[22,3],[23,3],[24,3],[3,3],[25,3],[26,3],[4,3],[27,3],[31,3],[28,3],[29,3],[30,3],[32,3],[33,3],[34,3],[5,3],[35,3],[36,3],[37,3],[38,3],[6,3],[42,3],[39,3],[40,3],[41,3],[43,3],[7,3],[44,3],[49,3],[50,3],[45,3],[46,3],[47,3],[48,3],[8,3],[54,3],[51,3],[52,3],[53,3],[55,3],[9,3],[56,3],[63,3],[57,3],[58,3],[60,3],[59,3],[1,3],[14,3],[13,3],[180,63],[190,64],[179,63],[200,65],[171,66],[170,67],[199,68],[193,69],[198,70],[173,71],[187,72],[172,73],[196,74],[168,75],[167,68],[197,76],[169,77],[174,78],[175,3],[178,78],[165,3],[201,79],[191,80],[182,81],[183,82],[185,83],[181,84],[184,85],[194,68],[176,86],[177,87],[186,88],[166,89],[189,80],[188,78],[192,3],[195,90],[149,91],[143,92],[147,93],[144,93],[140,92],[148,94],[145,95],[146,93],[141,96],[142,97],[136,98],[77,99],[79,100],[135,3],[78,101],[139,102],[138,103],[137,104],[70,3],[80,99],[81,3],[72,105],[76,106],[71,3],[73,107],[74,108],[75,3],[82,109],[83,109],[84,109],[85,109],[86,109],[87,109],[88,109],[89,109],[90,109],[91,109],[92,109],[93,109],[94,109],[95,109],[97,109],[96,109],[98,109],[99,109],[100,109],[101,109],[102,109],[134,110],[103,109],[104,109],[105,109],[106,109],[107,109],[108,109],[109,109],[110,109],[111,109],[112,109],[113,109],[114,109],[115,109],[117,109],[116,109],[118,109],[119,109],[120,109],[121,109],[122,109],[123,109],[124,109],[125,109],[126,109],[127,109],[128,109],[129,109],[130,109],[133,109],[131,109],[132,109],[65,111],[66,3],[64,3],[69,112],[68,111],[67,3],[152,113],[150,114],[151,115],[153,116]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
package/dist/broker.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AppDescriptor } from "@smitejs/core";
|
|
2
|
+
import type { CollectedChannel } from "./collector.js";
|
|
3
|
+
/**
|
|
4
|
+
* A runtime handle returned by {@link broker}: the collected channels, plus
|
|
5
|
+
* `publish` to deliver a payload and `lookup` to find a channel by name.
|
|
6
|
+
*
|
|
7
|
+
* @group Executor
|
|
8
|
+
*/
|
|
9
|
+
export interface MessageBroker {
|
|
10
|
+
readonly channels: readonly CollectedChannel[];
|
|
11
|
+
/** Delivers a payload to a channel's consumers; resolves the number sent. */
|
|
12
|
+
readonly publish: (channel: string, payload: unknown) => Promise<number>;
|
|
13
|
+
/** Finds a collected channel by name, if the app declares one. */
|
|
14
|
+
readonly lookup: (channel: string) => CollectedChannel | undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A runtime in-memory broker that walks an app's `messaging.channel` IR tree
|
|
18
|
+
* (via child refs, never the registry) and delivers published payloads to the
|
|
19
|
+
* registered consumers. `queue` channels route to the most recent consumer;
|
|
20
|
+
* `topic` channels fan out to every consumer. Works standalone and behind a
|
|
21
|
+
* transport — same stateless per-trigger contract as every executor.
|
|
22
|
+
*
|
|
23
|
+
* @group Executor
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const bus = broker(app);
|
|
27
|
+
* const delivered = await bus.publish("events", { kind: "order.placed" });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function broker(app: AppDescriptor): MessageBroker;
|
|
31
|
+
//# sourceMappingURL=broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAC;CACpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,aAAa,CAcxD"}
|
package/dist/broker.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { finalizeDescriptor } from "@smitejs/core";
|
|
2
|
+
import { channelsOf } from "./collector.js";
|
|
3
|
+
/**
|
|
4
|
+
* A runtime in-memory broker that walks an app's `messaging.channel` IR tree
|
|
5
|
+
* (via child refs, never the registry) and delivers published payloads to the
|
|
6
|
+
* registered consumers. `queue` channels route to the most recent consumer;
|
|
7
|
+
* `topic` channels fan out to every consumer. Works standalone and behind a
|
|
8
|
+
* transport — same stateless per-trigger contract as every executor.
|
|
9
|
+
*
|
|
10
|
+
* @group Executor
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const bus = broker(app);
|
|
14
|
+
* const delivered = await bus.publish("events", { kind: "order.placed" });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function broker(app) {
|
|
18
|
+
finalizeDescriptor(app);
|
|
19
|
+
const channels = channelsOf(app);
|
|
20
|
+
const byName = new Map(channels.map((channel) => [channel.name, channel]));
|
|
21
|
+
return {
|
|
22
|
+
channels,
|
|
23
|
+
lookup: (channelName) => byName.get(channelName),
|
|
24
|
+
publish: async (channelName, payload) => {
|
|
25
|
+
const channel = byName.get(channelName);
|
|
26
|
+
if (channel === undefined)
|
|
27
|
+
return 0;
|
|
28
|
+
return dispatchToChannel(channel, payload);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const dispatchToChannel = async (channel, payload) => {
|
|
33
|
+
const parsed = safePayload(channel, payload);
|
|
34
|
+
if (parsed.error !== undefined)
|
|
35
|
+
throw parsed.error;
|
|
36
|
+
const envelope = {
|
|
37
|
+
id: `${channel.name}:${Date.now()}`,
|
|
38
|
+
channel: channel.name,
|
|
39
|
+
publishedAt: Date.now(),
|
|
40
|
+
payload: parsed.payload,
|
|
41
|
+
};
|
|
42
|
+
const targets = channel.kind === "queue" ? channel.consumers.slice(-1) : channel.consumers;
|
|
43
|
+
await Promise.all(targets.map((consumer) => Promise.resolve(consumer(envelope))));
|
|
44
|
+
return targets.length;
|
|
45
|
+
};
|
|
46
|
+
const safePayload = (channel, payload) => {
|
|
47
|
+
if (channel.schema === undefined)
|
|
48
|
+
return { payload };
|
|
49
|
+
const result = channel.schema.safeParse(payload);
|
|
50
|
+
if (result.success) {
|
|
51
|
+
return { payload: result.data };
|
|
52
|
+
}
|
|
53
|
+
return { payload: result.error.issues, error: result.error.issues };
|
|
54
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { AppDescriptor, Descriptor } from "@smitejs/core";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* A named inbound/outbound messaging endpoint. `queue` delivers each message
|
|
5
|
+
* to one consumer; `topic` broadcasts to every consumer on the channel.
|
|
6
|
+
*
|
|
7
|
+
* @group Types
|
|
8
|
+
*/
|
|
9
|
+
export type ChannelKind = "queue" | "topic";
|
|
10
|
+
/**
|
|
11
|
+
* The envelope a consumer receives.
|
|
12
|
+
*
|
|
13
|
+
* @group Types
|
|
14
|
+
*/
|
|
15
|
+
export interface MessageEnvelope<Payload> {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly channel: string;
|
|
18
|
+
readonly publishedAt: number;
|
|
19
|
+
readonly payload: Payload;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A consumer for a channel: receives each delivered {@link MessageEnvelope}.
|
|
23
|
+
*
|
|
24
|
+
* @group Types
|
|
25
|
+
*/
|
|
26
|
+
export type MessageConsumer<Payload> = (envelope: MessageEnvelope<Payload>) => void | Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* A `messaging.channel` IR node.
|
|
29
|
+
*
|
|
30
|
+
* @group Internals
|
|
31
|
+
*/
|
|
32
|
+
export interface MessagingChannelDescriptor<Payload> extends Descriptor<"messaging.channel", {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly kind: ChannelKind;
|
|
35
|
+
readonly schema?: z.ZodType<Payload>;
|
|
36
|
+
}> {
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A node wrapping a channel's consumer function.
|
|
40
|
+
*
|
|
41
|
+
* @group Internals
|
|
42
|
+
*/
|
|
43
|
+
export interface MessagingConsumerDescriptor<Payload> extends Descriptor<"messaging.consumer", {
|
|
44
|
+
readonly fn: MessageConsumer<Payload>;
|
|
45
|
+
}> {
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A channel builder: pick a `kind` and optional zod `schema` from one shared
|
|
49
|
+
* `channel(app, name)` piece, then attach consumers with `on(fn)`. Always a
|
|
50
|
+
* builder; each `on()` relates a `messaging.consumer` child under the channel.
|
|
51
|
+
*
|
|
52
|
+
* @group Builders
|
|
53
|
+
*/
|
|
54
|
+
export interface MessagingChannelBuilder<Payload> {
|
|
55
|
+
/** Sets the delivery semantics (`queue` or `topic`, default `topic`). */
|
|
56
|
+
readonly kind: <NextKind extends ChannelKind>(kind: NextKind) => MessagingChannelBuilder<Payload>;
|
|
57
|
+
/** Sets the zod schema each envelope payload is validated against. */
|
|
58
|
+
readonly schema: <Next extends Payload>(schema: z.ZodType<Next>) => MessagingChannelBuilder<Next>;
|
|
59
|
+
/** Registers a consumer; `queue` delivers to one, `topic` to every one. */
|
|
60
|
+
readonly on: (fn: MessageConsumer<Payload>) => MessagingChannelBuilder<Payload>;
|
|
61
|
+
/** The underlying `messaging.channel` IR node. */
|
|
62
|
+
readonly node: MessagingChannelDescriptor<Payload>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a channel builder for an app. The shared `(app, name)` piece yields a
|
|
66
|
+
* builder that refines `kind`/`schema` and attaches any number of `messaging
|
|
67
|
+
* .consumer` children, related under the app's `messaging.channel` node.
|
|
68
|
+
*
|
|
69
|
+
* @group Builders
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* const orders = channel(app, "orders")
|
|
73
|
+
* .kind("topic")
|
|
74
|
+
* .schema(z.object({ orderId: z.string() }))
|
|
75
|
+
* .on(() => undefined);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function channel<Payload = unknown>(app: AppDescriptor, name: string): MessagingChannelBuilder<Payload>;
|
|
79
|
+
/**
|
|
80
|
+
* Fires a channel's consumers with a fresh envelope at the given (or current)
|
|
81
|
+
* instant. `queue` routes to the most recent consumer; `topic` fans out to
|
|
82
|
+
* every consumer. Returns the number of consumers invoked.
|
|
83
|
+
*
|
|
84
|
+
* @group Executor
|
|
85
|
+
*/
|
|
86
|
+
export declare const dispatchTo: <Payload = unknown>(descriptor: MessagingChannelDescriptor<Payload>, consumers: readonly MessagingConsumerDescriptor<Payload>[], payload: unknown, at?: number | Date) => Promise<number>;
|
|
87
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5C;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,OAAO;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,IAAI,CACrC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,KAC/B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;GAIG;AACH,MAAM,WAAW,0BAA0B,CAAC,OAAO,CACjD,SAAQ,UAAU,CAChB,mBAAmB,EACnB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC,CACF;CAAG;AAEN;;;;GAIG;AACH,MAAM,WAAW,2BAA2B,CAAC,OAAO,CAClD,SAAQ,UAAU,CAChB,oBAAoB,EACpB;IAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAAE,CAC1C;CAAG;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB,CAAC,OAAO;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,SAAS,WAAW,EAC1C,IAAI,EAAE,QAAQ,KACX,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACtC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,OAAO,EACpC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KACpB,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,EAAE,CACX,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC,KACzB,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACtC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC;CACpD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAG,OAAO,EACvC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,GACX,uBAAuB,CAAC,OAAO,CAAC,CA+BlC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,GAAG,OAAO,EAC1C,YAAY,0BAA0B,CAAC,OAAO,CAAC,EAC/C,WAAW,SAAS,2BAA2B,CAAC,OAAO,CAAC,EAAE,EAC1D,SAAS,OAAO,EAChB,KAAI,MAAM,GAAG,IAAiB,KAC7B,OAAO,CAAC,MAAM,CAYhB,CAAC"}
|
package/dist/channel.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { defineDescriptor, refine, relate } from "@smitejs/core";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a channel builder for an app. The shared `(app, name)` piece yields a
|
|
4
|
+
* builder that refines `kind`/`schema` and attaches any number of `messaging
|
|
5
|
+
* .consumer` children, related under the app's `messaging.channel` node.
|
|
6
|
+
*
|
|
7
|
+
* @group Builders
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const orders = channel(app, "orders")
|
|
11
|
+
* .kind("topic")
|
|
12
|
+
* .schema(z.object({ orderId: z.string() }))
|
|
13
|
+
* .on(() => undefined);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function channel(app, name) {
|
|
17
|
+
const descriptor = defineDescriptor("messaging.channel", `${app.__key}:channel:${name}`, { name, kind: "topic" });
|
|
18
|
+
relate(app, "messaging.channel", descriptor);
|
|
19
|
+
let consumerCount = 0;
|
|
20
|
+
const builder = {
|
|
21
|
+
node: descriptor,
|
|
22
|
+
kind: (kind) => {
|
|
23
|
+
refine(descriptor, { kind });
|
|
24
|
+
return builder;
|
|
25
|
+
},
|
|
26
|
+
schema: (schema) => {
|
|
27
|
+
refine(descriptor, { schema });
|
|
28
|
+
return builder;
|
|
29
|
+
},
|
|
30
|
+
on: (fn) => {
|
|
31
|
+
const consumer = defineDescriptor("messaging.consumer", `${descriptor.__key}:consumer:${consumerCount++}`, { fn });
|
|
32
|
+
relate(descriptor, "messaging.consumer", consumer);
|
|
33
|
+
return builder;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
return builder;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fires a channel's consumers with a fresh envelope at the given (or current)
|
|
40
|
+
* instant. `queue` routes to the most recent consumer; `topic` fans out to
|
|
41
|
+
* every consumer. Returns the number of consumers invoked.
|
|
42
|
+
*
|
|
43
|
+
* @group Executor
|
|
44
|
+
*/
|
|
45
|
+
export const dispatchTo = (descriptor, consumers, payload, at = Date.now()) => {
|
|
46
|
+
const envelope = {
|
|
47
|
+
id: `${descriptor.data.name}:${Date.now()}`,
|
|
48
|
+
channel: descriptor.data.name,
|
|
49
|
+
publishedAt: typeof at === "number" ? at : at.getTime(),
|
|
50
|
+
payload: payload,
|
|
51
|
+
};
|
|
52
|
+
const targets = descriptor.data.kind === "queue" ? consumers.slice(-1) : consumers;
|
|
53
|
+
return Promise.all(targets.map((consumer) => Promise.resolve(consumer.data.fn(envelope)))).then(() => targets.length);
|
|
54
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AppDescriptor } from "@smitejs/core";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { ChannelKind, MessageConsumer } from "./channel.js";
|
|
4
|
+
/**
|
|
5
|
+
* A channel as seen by artifact generators: its name, kind, and the payload
|
|
6
|
+
* schema it validates against.
|
|
7
|
+
*
|
|
8
|
+
* @group Collector
|
|
9
|
+
*/
|
|
10
|
+
export interface CollectedChannel<Payload = unknown> {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly kind: ChannelKind;
|
|
13
|
+
readonly schema?: z.ZodType<Payload>;
|
|
14
|
+
readonly consumers: readonly MessageConsumer<Payload>[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Walks an app's `messaging.channel` children and returns the collected
|
|
18
|
+
* channels with their consumers. Shared by artifact generators and the broker
|
|
19
|
+
* executor.
|
|
20
|
+
*
|
|
21
|
+
* @group Collector
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* channel(app, "a").on(() => undefined);
|
|
25
|
+
* channel(app, "b")
|
|
26
|
+
* .kind("queue")
|
|
27
|
+
* .on(() => undefined);
|
|
28
|
+
* const collected = channelsOf(app);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function channelsOf(app: AppDescriptor): readonly CollectedChannel[];
|
|
32
|
+
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,GAAG,OAAO;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;CACzD;AAOD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,gBAAgB,EAAE,CAoB1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { childrenOf } from "@smitejs/core";
|
|
2
|
+
/**
|
|
3
|
+
* Walks an app's `messaging.channel` children and returns the collected
|
|
4
|
+
* channels with their consumers. Shared by artifact generators and the broker
|
|
5
|
+
* executor.
|
|
6
|
+
*
|
|
7
|
+
* @group Collector
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* channel(app, "a").on(() => undefined);
|
|
11
|
+
* channel(app, "b")
|
|
12
|
+
* .kind("queue")
|
|
13
|
+
* .on(() => undefined);
|
|
14
|
+
* const collected = channelsOf(app);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function channelsOf(app) {
|
|
18
|
+
return childrenOf(app, "messaging.channel").map((node) => {
|
|
19
|
+
const channelNode = node;
|
|
20
|
+
return {
|
|
21
|
+
name: channelNode.data.name,
|
|
22
|
+
kind: channelNode.data.kind,
|
|
23
|
+
...(channelNode.data.schema === undefined
|
|
24
|
+
? {}
|
|
25
|
+
: { schema: channelNode.data.schema }),
|
|
26
|
+
consumers: childrenOf(node, "messaging.consumer").map((consumer) => consumer.data.fn),
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { channel, dispatchTo } from "./channel.js";
|
|
2
|
+
export type { ChannelKind, MessageConsumer, MessageEnvelope, MessagingChannelBuilder, MessagingChannelDescriptor, MessagingConsumerDescriptor, } from "./channel.js";
|
|
3
|
+
export { broker } from "./broker.js";
|
|
4
|
+
export type { MessageBroker } from "./broker.js";
|
|
5
|
+
export { channelsOf } from "./collector.js";
|
|
6
|
+
export type { CollectedChannel } from "./collector.js";
|
|
7
|
+
import { broker } from "./broker.js";
|
|
8
|
+
import { channel } from "./channel.js";
|
|
9
|
+
import { channelsOf } from "./collector.js";
|
|
10
|
+
/**
|
|
11
|
+
* The messaging namespace: one import for the whole messaging app extensor —
|
|
12
|
+
* channel builders, the broker executor, and the collector.
|
|
13
|
+
*
|
|
14
|
+
* @group Surface
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const bundle = messaging;
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const messaging: {
|
|
21
|
+
broker: typeof broker;
|
|
22
|
+
channel: typeof channel;
|
|
23
|
+
channelsOf: typeof channelsOf;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;;;;CAIrB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { channel, dispatchTo } from "./channel.js";
|
|
2
|
+
export { broker } from "./broker.js";
|
|
3
|
+
export { channelsOf } from "./collector.js";
|
|
4
|
+
import { broker } from "./broker.js";
|
|
5
|
+
import { channel } from "./channel.js";
|
|
6
|
+
import { channelsOf } from "./collector.js";
|
|
7
|
+
/**
|
|
8
|
+
* The messaging namespace: one import for the whole messaging app extensor —
|
|
9
|
+
* channel builders, the broker executor, and the collector.
|
|
10
|
+
*
|
|
11
|
+
* @group Surface
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const bundle = messaging;
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export const messaging = {
|
|
18
|
+
broker,
|
|
19
|
+
channel,
|
|
20
|
+
channelsOf,
|
|
21
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@smitejs/messaging",
|
|
3
|
+
"version": "2.0.0-SNAPSHOT",
|
|
4
|
+
"description": "Messaging endpoints for Smite: channels with consumers, producers, and an in-memory broker executor.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/githiago-f/smite.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/githiago-f/smite#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/githiago-f/smite/issues"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": ["dist", "!dist/**/*.test.*", "!dist/.tsbuildinfo"],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc -b",
|
|
27
|
+
"test": "vitest run"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@smitejs/core": "^2.0.0-SNAPSHOT",
|
|
31
|
+
"@smitejs/handlers": "^2.0.0-SNAPSHOT",
|
|
32
|
+
"zod": "^4.0.0"
|
|
33
|
+
},
|
|
34
|
+
"sideEffects": false
|
|
35
|
+
}
|
package/src/broker.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { finalizeDescriptor } from "@smitejs/core";
|
|
2
|
+
import type { AppDescriptor } from "@smitejs/core";
|
|
3
|
+
import { channelsOf } from "./collector.js";
|
|
4
|
+
import type { CollectedChannel } from "./collector.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A runtime handle returned by {@link broker}: the collected channels, plus
|
|
8
|
+
* `publish` to deliver a payload and `lookup` to find a channel by name.
|
|
9
|
+
*
|
|
10
|
+
* @group Executor
|
|
11
|
+
*/
|
|
12
|
+
export interface MessageBroker {
|
|
13
|
+
readonly channels: readonly CollectedChannel[];
|
|
14
|
+
/** Delivers a payload to a channel's consumers; resolves the number sent. */
|
|
15
|
+
readonly publish: (channel: string, payload: unknown) => Promise<number>;
|
|
16
|
+
/** Finds a collected channel by name, if the app declares one. */
|
|
17
|
+
readonly lookup: (channel: string) => CollectedChannel | undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A runtime in-memory broker that walks an app's `messaging.channel` IR tree
|
|
22
|
+
* (via child refs, never the registry) and delivers published payloads to the
|
|
23
|
+
* registered consumers. `queue` channels route to the most recent consumer;
|
|
24
|
+
* `topic` channels fan out to every consumer. Works standalone and behind a
|
|
25
|
+
* transport — same stateless per-trigger contract as every executor.
|
|
26
|
+
*
|
|
27
|
+
* @group Executor
|
|
28
|
+
* @example Publish a message to a channel
|
|
29
|
+
*/
|
|
30
|
+
export function broker(app: AppDescriptor): MessageBroker {
|
|
31
|
+
finalizeDescriptor(app);
|
|
32
|
+
const channels = channelsOf(app);
|
|
33
|
+
const byName = new Map(channels.map((channel) => [channel.name, channel]));
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
channels,
|
|
37
|
+
lookup: (channelName) => byName.get(channelName),
|
|
38
|
+
publish: async (channelName, payload) => {
|
|
39
|
+
const channel = byName.get(channelName);
|
|
40
|
+
if (channel === undefined) return 0;
|
|
41
|
+
return dispatchToChannel(channel, payload);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const dispatchToChannel = async (
|
|
47
|
+
channel: CollectedChannel,
|
|
48
|
+
payload: unknown,
|
|
49
|
+
): Promise<number> => {
|
|
50
|
+
const parsed = safePayload(channel, payload);
|
|
51
|
+
if (parsed.error !== undefined) throw parsed.error;
|
|
52
|
+
|
|
53
|
+
const envelope = {
|
|
54
|
+
id: `${channel.name}:${Date.now()}`,
|
|
55
|
+
channel: channel.name,
|
|
56
|
+
publishedAt: Date.now(),
|
|
57
|
+
payload: parsed.payload,
|
|
58
|
+
};
|
|
59
|
+
const targets =
|
|
60
|
+
channel.kind === "queue" ? channel.consumers.slice(-1) : channel.consumers;
|
|
61
|
+
await Promise.all(
|
|
62
|
+
targets.map((consumer) => Promise.resolve(consumer(envelope))),
|
|
63
|
+
);
|
|
64
|
+
return targets.length;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const safePayload = (
|
|
68
|
+
channel: CollectedChannel,
|
|
69
|
+
payload: unknown,
|
|
70
|
+
): { readonly payload: unknown; readonly error?: unknown } => {
|
|
71
|
+
if (channel.schema === undefined) return { payload };
|
|
72
|
+
const result = channel.schema.safeParse(payload);
|
|
73
|
+
if (result.success) {
|
|
74
|
+
return { payload: result.data };
|
|
75
|
+
}
|
|
76
|
+
return { payload: result.error.issues, error: result.error.issues };
|
|
77
|
+
};
|
package/src/channel.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { defineDescriptor, refine, relate } from "@smitejs/core";
|
|
2
|
+
import type { AppDescriptor, Descriptor } from "@smitejs/core";
|
|
3
|
+
import type { z } from "zod";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A named inbound/outbound messaging endpoint. `queue` delivers each message
|
|
7
|
+
* to one consumer; `topic` broadcasts to every consumer on the channel.
|
|
8
|
+
*
|
|
9
|
+
* @group Types
|
|
10
|
+
*/
|
|
11
|
+
export type ChannelKind = "queue" | "topic";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The envelope a consumer receives.
|
|
15
|
+
*
|
|
16
|
+
* @group Types
|
|
17
|
+
*/
|
|
18
|
+
export interface MessageEnvelope<Payload> {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly channel: string;
|
|
21
|
+
readonly publishedAt: number;
|
|
22
|
+
readonly payload: Payload;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A consumer for a channel: receives each delivered {@link MessageEnvelope}.
|
|
27
|
+
*
|
|
28
|
+
* @group Types
|
|
29
|
+
*/
|
|
30
|
+
export type MessageConsumer<Payload> = (
|
|
31
|
+
envelope: MessageEnvelope<Payload>,
|
|
32
|
+
) => void | Promise<void>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A `messaging.channel` IR node.
|
|
36
|
+
*
|
|
37
|
+
* @group Internals
|
|
38
|
+
*/
|
|
39
|
+
export interface MessagingChannelDescriptor<Payload>
|
|
40
|
+
extends Descriptor<
|
|
41
|
+
"messaging.channel",
|
|
42
|
+
{
|
|
43
|
+
readonly name: string;
|
|
44
|
+
readonly kind: ChannelKind;
|
|
45
|
+
readonly schema?: z.ZodType<Payload>;
|
|
46
|
+
}
|
|
47
|
+
> {}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A node wrapping a channel's consumer function.
|
|
51
|
+
*
|
|
52
|
+
* @group Internals
|
|
53
|
+
*/
|
|
54
|
+
export interface MessagingConsumerDescriptor<Payload>
|
|
55
|
+
extends Descriptor<
|
|
56
|
+
"messaging.consumer",
|
|
57
|
+
{ readonly fn: MessageConsumer<Payload> }
|
|
58
|
+
> {}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* A channel builder: pick a `kind` and optional zod `schema` from one shared
|
|
62
|
+
* `channel(app, name)` piece, then attach consumers with `on(fn)`. Always a
|
|
63
|
+
* builder; each `on()` relates a `messaging.consumer` child under the channel.
|
|
64
|
+
*
|
|
65
|
+
* @group Builders
|
|
66
|
+
*/
|
|
67
|
+
export interface MessagingChannelBuilder<Payload> {
|
|
68
|
+
/** Sets the delivery semantics (`queue` or `topic`, default `topic`). */
|
|
69
|
+
readonly kind: <NextKind extends ChannelKind>(
|
|
70
|
+
kind: NextKind,
|
|
71
|
+
) => MessagingChannelBuilder<Payload>;
|
|
72
|
+
/** Sets the zod schema each envelope payload is validated against. */
|
|
73
|
+
readonly schema: <Next extends Payload>(
|
|
74
|
+
schema: z.ZodType<Next>,
|
|
75
|
+
) => MessagingChannelBuilder<Next>;
|
|
76
|
+
/** Registers a consumer; `queue` delivers to one, `topic` to every one. */
|
|
77
|
+
readonly on: (
|
|
78
|
+
fn: MessageConsumer<Payload>,
|
|
79
|
+
) => MessagingChannelBuilder<Payload>;
|
|
80
|
+
/** The underlying `messaging.channel` IR node. */
|
|
81
|
+
readonly node: MessagingChannelDescriptor<Payload>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Creates a channel builder for an app. The shared `(app, name)` piece yields a
|
|
86
|
+
* builder that refines `kind`/`schema` and attaches any number of `messaging
|
|
87
|
+
* .consumer` children, related under the app's `messaging.channel` node.
|
|
88
|
+
*
|
|
89
|
+
* @group Builders
|
|
90
|
+
* @example Define a channel
|
|
91
|
+
*/
|
|
92
|
+
export function channel<Payload = unknown>(
|
|
93
|
+
app: AppDescriptor,
|
|
94
|
+
name: string,
|
|
95
|
+
): MessagingChannelBuilder<Payload> {
|
|
96
|
+
const descriptor = defineDescriptor(
|
|
97
|
+
"messaging.channel",
|
|
98
|
+
`${app.__key}:channel:${name}`,
|
|
99
|
+
{ name, kind: "topic" },
|
|
100
|
+
) as MessagingChannelDescriptor<Payload>;
|
|
101
|
+
relate(app, "messaging.channel", descriptor);
|
|
102
|
+
|
|
103
|
+
let consumerCount = 0;
|
|
104
|
+
|
|
105
|
+
const builder: MessagingChannelBuilder<Payload> = {
|
|
106
|
+
node: descriptor,
|
|
107
|
+
kind: <NextKind extends ChannelKind>(kind: NextKind) => {
|
|
108
|
+
refine(descriptor, { kind });
|
|
109
|
+
return builder;
|
|
110
|
+
},
|
|
111
|
+
schema: <Next extends Payload>(schema: z.ZodType<Next>) => {
|
|
112
|
+
refine(descriptor, { schema });
|
|
113
|
+
return builder as unknown as MessagingChannelBuilder<Next>;
|
|
114
|
+
},
|
|
115
|
+
on: (fn: MessageConsumer<Payload>) => {
|
|
116
|
+
const consumer = defineDescriptor(
|
|
117
|
+
"messaging.consumer",
|
|
118
|
+
`${descriptor.__key}:consumer:${consumerCount++}`,
|
|
119
|
+
{ fn },
|
|
120
|
+
);
|
|
121
|
+
relate(descriptor, "messaging.consumer", consumer);
|
|
122
|
+
return builder;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
return builder;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Fires a channel's consumers with a fresh envelope at the given (or current)
|
|
130
|
+
* instant. `queue` routes to the most recent consumer; `topic` fans out to
|
|
131
|
+
* every consumer. Returns the number of consumers invoked.
|
|
132
|
+
*
|
|
133
|
+
* @group Executor
|
|
134
|
+
*/
|
|
135
|
+
export const dispatchTo = <Payload = unknown>(
|
|
136
|
+
descriptor: MessagingChannelDescriptor<Payload>,
|
|
137
|
+
consumers: readonly MessagingConsumerDescriptor<Payload>[],
|
|
138
|
+
payload: unknown,
|
|
139
|
+
at: number | Date = Date.now(),
|
|
140
|
+
): Promise<number> => {
|
|
141
|
+
const envelope: MessageEnvelope<Payload> = {
|
|
142
|
+
id: `${descriptor.data.name}:${Date.now()}`,
|
|
143
|
+
channel: descriptor.data.name,
|
|
144
|
+
publishedAt: typeof at === "number" ? at : at.getTime(),
|
|
145
|
+
payload: payload as Payload,
|
|
146
|
+
};
|
|
147
|
+
const targets =
|
|
148
|
+
descriptor.data.kind === "queue" ? consumers.slice(-1) : consumers;
|
|
149
|
+
return Promise.all(
|
|
150
|
+
targets.map((consumer) => Promise.resolve(consumer.data.fn(envelope))),
|
|
151
|
+
).then(() => targets.length);
|
|
152
|
+
};
|
package/src/collector.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { childrenOf } from "@smitejs/core";
|
|
2
|
+
import type { AppDescriptor, Descriptor } from "@smitejs/core";
|
|
3
|
+
import type { z } from "zod";
|
|
4
|
+
import type { ChannelKind, MessageConsumer } from "./channel.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A channel as seen by artifact generators: its name, kind, and the payload
|
|
8
|
+
* schema it validates against.
|
|
9
|
+
*
|
|
10
|
+
* @group Collector
|
|
11
|
+
*/
|
|
12
|
+
export interface CollectedChannel<Payload = unknown> {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly kind: ChannelKind;
|
|
15
|
+
readonly schema?: z.ZodType<Payload>;
|
|
16
|
+
readonly consumers: readonly MessageConsumer<Payload>[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type ChannelNode = Descriptor<
|
|
20
|
+
"messaging.channel",
|
|
21
|
+
{ name: string; kind: ChannelKind; schema?: z.ZodType }
|
|
22
|
+
>;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Walks an app's `messaging.channel` children and returns the collected
|
|
26
|
+
* channels with their consumers. Shared by artifact generators and the broker
|
|
27
|
+
* executor.
|
|
28
|
+
*
|
|
29
|
+
* @group Collector
|
|
30
|
+
* @example Collect an app's channels
|
|
31
|
+
*/
|
|
32
|
+
export function channelsOf(app: AppDescriptor): readonly CollectedChannel[] {
|
|
33
|
+
return childrenOf(app, "messaging.channel").map((node) => {
|
|
34
|
+
const channelNode = node as ChannelNode;
|
|
35
|
+
return {
|
|
36
|
+
name: channelNode.data.name,
|
|
37
|
+
kind: channelNode.data.kind,
|
|
38
|
+
...(channelNode.data.schema === undefined
|
|
39
|
+
? {}
|
|
40
|
+
: { schema: channelNode.data.schema }),
|
|
41
|
+
consumers: childrenOf(node, "messaging.consumer").map(
|
|
42
|
+
(consumer) =>
|
|
43
|
+
(
|
|
44
|
+
consumer as Descriptor<
|
|
45
|
+
"messaging.consumer",
|
|
46
|
+
{ fn: MessageConsumer<unknown> }
|
|
47
|
+
>
|
|
48
|
+
).data.fn,
|
|
49
|
+
),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
package/src/docs.test.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { expandExamples } from "../../../scripts/inject-jsdoc-examples.mjs";
|
|
5
|
+
import {
|
|
6
|
+
collectFiles,
|
|
7
|
+
collectTestSnippets,
|
|
8
|
+
} from "../../../scripts/snippets.mjs";
|
|
9
|
+
|
|
10
|
+
const packageName = "@smitejs/messaging";
|
|
11
|
+
const rootDir = process.cwd();
|
|
12
|
+
const srcDir = join(rootDir, "packages/messaging/src");
|
|
13
|
+
|
|
14
|
+
const exampleReferences = async () => {
|
|
15
|
+
const { snippetIndex } = await collectTestSnippets({
|
|
16
|
+
packageName,
|
|
17
|
+
rootDir,
|
|
18
|
+
srcDir,
|
|
19
|
+
});
|
|
20
|
+
const files = await collectFiles(srcDir, (filePath) =>
|
|
21
|
+
filePath.endsWith(".ts"),
|
|
22
|
+
);
|
|
23
|
+
const references: Array<{ filePath: string; title: string }> = [];
|
|
24
|
+
|
|
25
|
+
for (const filePath of files) {
|
|
26
|
+
const source = await readFile(filePath, "utf8");
|
|
27
|
+
const exampleTag = /^(\s*\*[^\S\r\n]*)@example[^\S\r\n]+([^\r\n]+?)\s*$/gmu;
|
|
28
|
+
for (const match of source.matchAll(exampleTag)) {
|
|
29
|
+
references.push({ filePath, title: match[2]?.trim() ?? "" });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return { snippetIndex, references };
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
describe("documentation integrity", () => {
|
|
37
|
+
it("every @example resolves to a tested #section snippet", async () => {
|
|
38
|
+
const { snippetIndex, references } = await exampleReferences();
|
|
39
|
+
const missing = references
|
|
40
|
+
.filter(({ title }) => !snippetIndex.has(title.toLowerCase()))
|
|
41
|
+
.map(
|
|
42
|
+
({ filePath, title }) =>
|
|
43
|
+
`- Missing tested snippet "${title}" in ${filePath}`,
|
|
44
|
+
);
|
|
45
|
+
expect(missing).toEqual([]);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("renders each referenced snippet into a code block", async () => {
|
|
49
|
+
const { snippetIndex, snippets } = await collectTestSnippets({
|
|
50
|
+
packageName,
|
|
51
|
+
rootDir,
|
|
52
|
+
srcDir,
|
|
53
|
+
});
|
|
54
|
+
for (const snippet of snippets) {
|
|
55
|
+
const rendered = expandExamples(
|
|
56
|
+
` * @example ${snippet.title}\n`,
|
|
57
|
+
snippetIndex,
|
|
58
|
+
packageName,
|
|
59
|
+
"synthetic.d.ts",
|
|
60
|
+
);
|
|
61
|
+
expect(rendered).toContain("```ts");
|
|
62
|
+
expect(rendered).toContain(snippet.code.split("\n")[0]);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { childrenOf, clear, createApp } from "@smitejs/core";
|
|
2
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { broker, channel, channelsOf, messaging } from "./index.js";
|
|
5
|
+
|
|
6
|
+
afterEach(() => clear());
|
|
7
|
+
|
|
8
|
+
describe("channel builders", () => {
|
|
9
|
+
it("defines a channel and attaches consumers", () => {
|
|
10
|
+
const app = createApp();
|
|
11
|
+
|
|
12
|
+
// #section - Define a channel
|
|
13
|
+
const orders = channel(app, "orders")
|
|
14
|
+
.kind("topic")
|
|
15
|
+
.schema(z.object({ orderId: z.string() }))
|
|
16
|
+
.on(() => undefined);
|
|
17
|
+
// #endsection
|
|
18
|
+
|
|
19
|
+
expect(orders.node.__kind).toBe("messaging.channel");
|
|
20
|
+
expect(orders.node.data.name).toBe("orders");
|
|
21
|
+
expect(orders.node.data.kind).toBe("topic");
|
|
22
|
+
expect(childrenOf(app, "messaging.channel").length).toBe(1);
|
|
23
|
+
expect(childrenOf(orders.node, "messaging.consumer").length).toBe(1);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("registers a queue channel with a single consumer", () => {
|
|
27
|
+
const app = createApp();
|
|
28
|
+
channel(app, "inbox")
|
|
29
|
+
.kind("queue")
|
|
30
|
+
.on(() => undefined);
|
|
31
|
+
const [collected] = channelsOf(app);
|
|
32
|
+
expect(collected?.kind).toBe("queue");
|
|
33
|
+
expect(collected?.consumers.length).toBe(1);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("collects an app's channels", () => {
|
|
37
|
+
const app = createApp();
|
|
38
|
+
|
|
39
|
+
// #section - Collect an app's channels
|
|
40
|
+
channel(app, "a").on(() => undefined);
|
|
41
|
+
channel(app, "b")
|
|
42
|
+
.kind("queue")
|
|
43
|
+
.on(() => undefined);
|
|
44
|
+
const collected = channelsOf(app);
|
|
45
|
+
// #endsection
|
|
46
|
+
|
|
47
|
+
expect(collected.map((entry) => entry.name).sort()).toEqual(["a", "b"]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe("broker executor", () => {
|
|
52
|
+
it("publishes to a topic and fans out to every consumer", async () => {
|
|
53
|
+
const app = createApp();
|
|
54
|
+
const seen: string[] = [];
|
|
55
|
+
channel(app, "events")
|
|
56
|
+
.kind("topic")
|
|
57
|
+
.on(({ payload }) => {
|
|
58
|
+
seen.push(`first:${String((payload as { kind: string }).kind)}`);
|
|
59
|
+
})
|
|
60
|
+
.on(({ payload }) => {
|
|
61
|
+
seen.push(`second:${String((payload as { kind: string }).kind)}`);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// #section - Publish a message to a channel
|
|
65
|
+
const bus = broker(app);
|
|
66
|
+
const delivered = await bus.publish("events", { kind: "order.placed" });
|
|
67
|
+
// #endsection
|
|
68
|
+
|
|
69
|
+
expect(delivered).toBe(2);
|
|
70
|
+
expect(seen).toEqual(["first:order.placed", "second:order.placed"]);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("routes a queue to the most recent consumer", async () => {
|
|
74
|
+
const app = createApp();
|
|
75
|
+
const seen: string[] = [];
|
|
76
|
+
channel(app, "inbox")
|
|
77
|
+
.kind("queue")
|
|
78
|
+
.on(() => {
|
|
79
|
+
seen.push("first");
|
|
80
|
+
})
|
|
81
|
+
.on(() => {
|
|
82
|
+
seen.push("second");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const bus = broker(app);
|
|
86
|
+
await bus.publish("inbox", "hello");
|
|
87
|
+
expect(seen).toEqual(["second"]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("validates a payload against the channel schema", async () => {
|
|
91
|
+
const app = createApp();
|
|
92
|
+
channel(app, "validated")
|
|
93
|
+
.schema(z.object({ value: z.number() }))
|
|
94
|
+
.on(() => undefined);
|
|
95
|
+
|
|
96
|
+
const bus = broker(app);
|
|
97
|
+
expect(await bus.publish("validated", { value: 2 })).toBe(1);
|
|
98
|
+
await expect(
|
|
99
|
+
bus.publish("validated", { value: "no" }),
|
|
100
|
+
).rejects.toBeTruthy();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("returns 0 for an unknown channel", async () => {
|
|
104
|
+
const app = createApp();
|
|
105
|
+
const bus = broker(app);
|
|
106
|
+
expect(await bus.publish("missing", null)).toBe(0);
|
|
107
|
+
expect(bus.lookup("missing")).toBeUndefined();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("registers a messaging namespace bundle", () => {
|
|
111
|
+
// #section - Declare a messaging bundle
|
|
112
|
+
const bundle = messaging;
|
|
113
|
+
// #endsection
|
|
114
|
+
|
|
115
|
+
expect(typeof bundle.broker).toBe("function");
|
|
116
|
+
expect(typeof bundle.channel).toBe("function");
|
|
117
|
+
expect(typeof bundle.channelsOf).toBe("function");
|
|
118
|
+
});
|
|
119
|
+
});
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { channel, dispatchTo } from "./channel.js";
|
|
2
|
+
export type {
|
|
3
|
+
ChannelKind,
|
|
4
|
+
MessageConsumer,
|
|
5
|
+
MessageEnvelope,
|
|
6
|
+
MessagingChannelBuilder,
|
|
7
|
+
MessagingChannelDescriptor,
|
|
8
|
+
MessagingConsumerDescriptor,
|
|
9
|
+
} from "./channel.js";
|
|
10
|
+
|
|
11
|
+
export { broker } from "./broker.js";
|
|
12
|
+
export type { MessageBroker } from "./broker.js";
|
|
13
|
+
|
|
14
|
+
export { channelsOf } from "./collector.js";
|
|
15
|
+
export type { CollectedChannel } from "./collector.js";
|
|
16
|
+
|
|
17
|
+
import { broker } from "./broker.js";
|
|
18
|
+
import { channel } from "./channel.js";
|
|
19
|
+
import { channelsOf } from "./collector.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The messaging namespace: one import for the whole messaging app extensor —
|
|
23
|
+
* channel builders, the broker executor, and the collector.
|
|
24
|
+
*
|
|
25
|
+
* @group Surface
|
|
26
|
+
* @example Declare a messaging bundle
|
|
27
|
+
*/
|
|
28
|
+
export const messaging = {
|
|
29
|
+
broker,
|
|
30
|
+
channel,
|
|
31
|
+
channelsOf,
|
|
32
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": "src",
|
|
5
|
+
"outDir": "dist",
|
|
6
|
+
"tsBuildInfoFile": "dist/.tsbuildinfo"
|
|
7
|
+
},
|
|
8
|
+
"include": ["src/**/*.ts"],
|
|
9
|
+
"exclude": ["src/**/*.test.ts"],
|
|
10
|
+
"references": [{ "path": "../core" }, { "path": "../handlers" }]
|
|
11
|
+
}
|