@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.
@@ -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"}
@@ -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"}
@@ -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
+ }
@@ -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
+ };
@@ -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
+ }
@@ -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
+ }