@smitejs/realtime 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","../../handlers/dist/index.d.ts","../src/socket.ts","../src/collector.ts","../src/hub.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":[[80,130,144,147,148,150,162,180,181],[80,130,141,147,148,162,180,181,182],[80,130,147,148],[80,130,147,148,185],[80,130,147,148,187],[80,130,147,148,187,189],[80,130,147,148,190],[80,130,147,148,193],[80,127,128,130,147,148],[80,129,130,147,148],[130,147,148],[80,130,135,147,148,165],[80,130,131,136,141,147,148,150,162,173],[80,130,131,132,141,147,148,150],[75,76,77,80,130,147,148],[80,130,133,147,148,174],[80,130,134,135,142,147,148,151],[80,130,135,147,148,162,170],[80,130,136,138,141,147,148,150],[80,129,130,137,147,148],[80,130,138,139,147,148],[80,130,140,141,147,148],[80,129,130,141,147,148],[80,130,141,142,143,147,148,162,173],[80,130,141,142,143,147,148,157,162,165],[80,122,130,138,141,144,147,148,150,162,173],[80,130,141,142,144,145,147,148,150,162,170,173],[80,130,144,146,147,148,162,170,173],[78,79,80,81,82,83,84,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179],[80,130,141,147,148],[80,130,147,148,149,173],[80,130,138,141,147,148,150,162],[80,130,147,148,151],[80,130,147,148,152],[80,129,130,147,148,153],[80,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179],[80,130,147,148,155],[80,130,147,148,156],[80,130,141,147,148,157,158],[80,130,147,148,157,159,174,176],[80,130,142,147,148],[80,130,141,147,148,162,163,165],[80,130,147,148,164,165],[80,130,147,148,162,163],[80,130,147,148,165],[80,130,147,148,166],[80,127,130,147,148,162,167,173],[80,130,141,147,148,168,169],[80,130,147,148,168,169],[80,130,135,147,148,150,162,170],[80,130,147,148,171],[80,130,147,148,150,172],[80,130,144,147,148,156,173],[80,130,135,147,148,174],[80,130,147,148,162,175],[80,130,147,148,149,176],[80,130,147,148,177],[80,122,130,147,148],[80,122,130,141,143,147,148,153,162,165,173,175,176,178],[80,130,147,148,162,179],[80,130,147,148,162,180],[80,130,141,144,146,147,148,150,162,180],[80,94,98,130,147,148,173],[80,94,130,147,148,162,173],[80,89,130,147,148],[80,91,94,130,147,148,170,173],[80,130,147,148,150,170],[80,130,147,148,180],[80,89,130,147,148,180],[80,91,94,130,147,148,150,173],[80,86,87,90,93,130,141,147,148,162,173],[80,94,101,130,147,148],[80,86,92,130,147,148],[80,94,115,116,130,147,148],[80,90,94,130,147,148,165,173,180],[80,115,130,147,148,180],[80,88,89,130,147,148,180],[80,94,130,147,148],[80,88,89,90,91,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,130,147,148],[80,94,109,130,147,148],[80,94,101,102,130,147,148],[80,92,94,102,103,130,147,148],[80,93,130,147,148],[80,86,89,94,130,147,148],[80,94,98,102,103,130,147,148],[80,98,130,147,148],[80,92,94,97,130,147,148,173],[80,86,91,94,101,130,147,148],[80,130,147,148,162],[80,89,94,115,130,147,148,178,180],[64,80,130,147,148],[64,65,66,67,68,80,130,147,148],[69,71,80,130,147,148],[69,71,72,80,130,147,148],[71,72,73,80,130,147,148],[69,70,80,130,147,148]],"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":"73035e5635b83a538e20e2f46d3f2498489d1c8487f2a30ab4b21a5a5ef6fb39","impliedFormat":99},{"version":"bf5d7974195049996b42edac57335bcbc557db9807d9a95191309a4d273bd5a8","signature":"82df2583230fb1914738c72aedaa52638e81b8c3c60015c0b2771e7c459a7807","impliedFormat":99},{"version":"ebc6969e1575512ac1d867f23fe85a6cf2ef9305a9c1511e8b0964b3ca4056e0","signature":"1687e75ae8ac8f1b349c785d69ee6bdabb174e6cb5129bf14615e68a4ecf77b5","impliedFormat":99},{"version":"5bc18f49fbf6fc51db9c65cb29a3bedd0a1f202a1e18dc729e24bc3bc3917359","signature":"0ca2f0a567c37453068943897295859f2810c85d927ee19c17a657e0b3cc3450","impliedFormat":99},{"version":"43f52a7072320de4a7d613cd2219e7e712a491727f2320252d4938aa32575c7b","signature":"816e95c2b91c0e1aea974ad37ae59ac171527d7e60194659e4c09d5b06772267","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":[[71,74]],"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":[[182,1],[183,2],[184,3],[186,4],[187,3],[188,5],[190,6],[191,7],[192,4],[193,3],[194,8],[127,9],[128,9],[129,10],[80,11],[130,12],[131,13],[132,14],[75,3],[78,15],[76,3],[77,3],[133,16],[134,17],[135,18],[136,19],[137,20],[138,21],[139,21],[140,22],[141,23],[142,24],[143,25],[81,3],[79,3],[144,26],[145,27],[146,28],[180,29],[147,30],[148,3],[149,31],[150,32],[151,33],[152,34],[153,35],[154,36],[155,37],[156,38],[157,39],[158,39],[159,40],[160,3],[161,41],[162,42],[164,43],[163,44],[165,45],[166,46],[167,47],[168,48],[169,49],[170,50],[171,51],[172,52],[173,53],[174,54],[175,55],[176,56],[177,57],[82,3],[83,3],[84,3],[123,58],[124,3],[125,3],[126,45],[178,59],[179,60],[195,61],[181,62],[185,3],[85,3],[189,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],[101,63],[111,64],[100,63],[121,65],[92,66],[91,67],[120,68],[114,69],[119,70],[94,71],[108,72],[93,73],[117,74],[89,75],[88,68],[118,76],[90,77],[95,78],[96,3],[99,78],[86,3],[122,79],[112,80],[103,81],[104,82],[106,83],[102,84],[105,85],[115,68],[97,86],[98,87],[107,88],[87,89],[110,80],[109,78],[113,3],[116,90],[65,91],[66,3],[64,3],[69,92],[68,91],[67,3],[70,3],[72,93],[73,94],[74,95],[71,96]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
@@ -0,0 +1,27 @@
1
+ import type { AppDescriptor } from "@smitejs/core";
2
+ import type { RealtimeEventKind } from "./socket.js";
3
+ /**
4
+ * A realtime socket as seen by artifact generators: its name and the
5
+ * lifecycle/message events declared on it.
6
+ *
7
+ * @group Collector
8
+ */
9
+ export interface CollectedSocket {
10
+ readonly name: string;
11
+ readonly events: readonly RealtimeEventKind[];
12
+ }
13
+ /**
14
+ * Walks an app's `realtime.socket` children and returns the collected sockets
15
+ * with the events they handle. Shared by artifact generators and the hub
16
+ * executor.
17
+ *
18
+ * @group Collector
19
+ * @example
20
+ * ```ts
21
+ * socket(app, "presence").onConnect(() => undefined);
22
+ * socket(app, "chat").onMessage(() => undefined);
23
+ * const collected = socketsOf(app);
24
+ * ```
25
+ */
26
+ export declare function socketsOf(app: AppDescriptor): readonly CollectedSocket[];
27
+ //# 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,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC/C;AAKD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,eAAe,EAAE,CAUxE"}
@@ -0,0 +1,23 @@
1
+ import { childrenOf } from "@smitejs/core";
2
+ /**
3
+ * Walks an app's `realtime.socket` children and returns the collected sockets
4
+ * with the events they handle. Shared by artifact generators and the hub
5
+ * executor.
6
+ *
7
+ * @group Collector
8
+ * @example
9
+ * ```ts
10
+ * socket(app, "presence").onConnect(() => undefined);
11
+ * socket(app, "chat").onMessage(() => undefined);
12
+ * const collected = socketsOf(app);
13
+ * ```
14
+ */
15
+ export function socketsOf(app) {
16
+ return childrenOf(app, "realtime.socket").map((node) => {
17
+ const socketNode = node;
18
+ return {
19
+ name: socketNode.data.name,
20
+ events: childrenOf(node, "realtime.event").map((event) => event.data.event),
21
+ };
22
+ });
23
+ }
package/dist/hub.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import type { AppDescriptor } from "@smitejs/core";
2
+ import type { CollectedSocket } from "./collector.js";
3
+ /**
4
+ * A runtime handle returned by {@link realtime}. The transport (a WebSocket
5
+ * server, SSE) decides *when*; the hub decides *what runs*.
6
+ *
7
+ * @group Executor
8
+ */
9
+ export interface RealtimeHub {
10
+ readonly sockets: readonly CollectedSocket[];
11
+ /** Opens a connection, returns the connection id, runs `connect` handlers. */
12
+ readonly connect: (socket: string, connection: string) => Promise<string>;
13
+ /** Fires a socket's `message` handlers with `{ connection, payload }`. */
14
+ readonly emit: (socket: string, payload: unknown) => Promise<number>;
15
+ /** Closes a connection and runs the socket's `disconnect` handlers. */
16
+ readonly disconnect: (socket: string, connection: string) => Promise<number>;
17
+ }
18
+ /**
19
+ * Turns an app into a runtime realtime hub. Walks the app's `realtime.socket`
20
+ * IR tree via child refs — never the registry — and drives each socket's
21
+ * `connect`, `message`, and `disconnect` events on demand.
22
+ *
23
+ * @group Executor
24
+ * @example
25
+ * ```ts
26
+ * const chat = hub(app);
27
+ * await chat.connect("room", "conn-1");
28
+ * await chat.emit("room", { text: "hi" });
29
+ * await chat.disconnect("room", "conn-1");
30
+ * ```
31
+ */
32
+ export declare function hub(app: AppDescriptor, options?: {
33
+ readonly onError?: (error: unknown) => void;
34
+ }): RealtimeHub;
35
+ //# sourceMappingURL=hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAStD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9E;AAED;;;;;;;GAOG;AACH,wBAAgB,GAAG,CACjB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,GAC5D,WAAW,CA8Cb"}
package/dist/hub.js ADDED
@@ -0,0 +1,51 @@
1
+ import { childrenOf, finalizeDescriptor } from "@smitejs/core";
2
+ import { socketsOf } from "./collector.js";
3
+ /**
4
+ * Turns an app into a runtime realtime hub. Walks the app's `realtime.socket`
5
+ * IR tree via child refs — never the registry — and drives each socket's
6
+ * `connect`, `message`, and `disconnect` events on demand.
7
+ *
8
+ * @group Executor
9
+ * @example
10
+ * ```ts
11
+ * const chat = hub(app);
12
+ * await chat.connect("room", "conn-1");
13
+ * await chat.emit("room", { text: "hi" });
14
+ * await chat.disconnect("room", "conn-1");
15
+ * ```
16
+ */
17
+ export function hub(app, options = {}) {
18
+ finalizeDescriptor(app);
19
+ const sockets = socketsOf(app);
20
+ const socketNodes = childrenOf(app, "realtime.socket");
21
+ const eventsOf = (socket) => {
22
+ const node = socketNodes.find((candidate) => candidate.data.name === socket);
23
+ if (node === undefined)
24
+ return [];
25
+ return childrenOf(node, "realtime.event");
26
+ };
27
+ const fire = async (socket, event, context) => {
28
+ const targets = eventsOf(socket).filter((entry) => entry.data.event === event);
29
+ if (targets.length === 0)
30
+ return 0;
31
+ const fn = targets[0]?.data.fn;
32
+ if (typeof fn !== "function")
33
+ return 0;
34
+ try {
35
+ await Promise.resolve(fn(context));
36
+ }
37
+ catch (error) {
38
+ options.onError?.(error);
39
+ }
40
+ return targets.length;
41
+ };
42
+ return {
43
+ sockets,
44
+ connect: async (socket, connection) => {
45
+ await fire(socket, "connect", { connection });
46
+ return connection;
47
+ },
48
+ emit: async (socket, payload) => fire(socket, "message", { connection: socket, payload }),
49
+ disconnect: async (socket, connection) => fire(socket, "disconnect", { connection }),
50
+ };
51
+ }
@@ -0,0 +1,25 @@
1
+ export { hub } from "./hub.js";
2
+ export type { RealtimeHub } from "./hub.js";
3
+ export { socketsOf } from "./collector.js";
4
+ export type { CollectedSocket } from "./collector.js";
5
+ export { socket } from "./socket.js";
6
+ export type { RealtimeEventDescriptor, RealtimeEventKind, RealtimeMessageContext, RealtimeMessageHandler, RealtimeSocketBuilder, RealtimeSocketDescriptor, } from "./socket.js";
7
+ import { socketsOf } from "./collector.js";
8
+ import { hub } from "./hub.js";
9
+ import { socket } from "./socket.js";
10
+ /**
11
+ * The realtime namespace: one import for the whole realtime app extensor —
12
+ * socket builders, the runtime hub, and the collector.
13
+ *
14
+ * @group Surface
15
+ * @example
16
+ * ```ts
17
+ * const bundle = realtime;
18
+ * ```
19
+ */
20
+ export declare const realtime: {
21
+ hub: typeof hub;
22
+ socket: typeof socket;
23
+ socketsOf: typeof socketsOf;
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,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;;;CAIpB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { hub } from "./hub.js";
2
+ export { socketsOf } from "./collector.js";
3
+ export { socket } from "./socket.js";
4
+ import { socketsOf } from "./collector.js";
5
+ import { hub } from "./hub.js";
6
+ import { socket } from "./socket.js";
7
+ /**
8
+ * The realtime namespace: one import for the whole realtime app extensor —
9
+ * socket builders, the runtime hub, and the collector.
10
+ *
11
+ * @group Surface
12
+ * @example
13
+ * ```ts
14
+ * const bundle = realtime;
15
+ * ```
16
+ */
17
+ export const realtime = {
18
+ hub,
19
+ socket,
20
+ socketsOf,
21
+ };
@@ -0,0 +1,77 @@
1
+ import type { AppDescriptor, Descriptor } from "@smitejs/core";
2
+ import type { EmptyHandler } from "@smitejs/handlers";
3
+ /**
4
+ * A lifecycle or message event on a realtime socket. `connect` and `disconnect`
5
+ * are zero-input handlers; `message` also receives the payload.
6
+ *
7
+ * @group Types
8
+ */
9
+ export type RealtimeEventKind = "connect" | "disconnect" | "message";
10
+ /**
11
+ * The context a realtime message handler receives.
12
+ *
13
+ * @group Types
14
+ */
15
+ export interface RealtimeMessageContext {
16
+ readonly connection: string;
17
+ readonly payload: unknown;
18
+ }
19
+ /**
20
+ * A handler for a realtime `message` event.
21
+ *
22
+ * @group Types
23
+ */
24
+ export type RealtimeMessageHandler = (context: RealtimeMessageContext) => void | Promise<void>;
25
+ /**
26
+ * A `realtime.socket` IR node.
27
+ *
28
+ * @group Internals
29
+ */
30
+ export interface RealtimeSocketDescriptor extends Descriptor<"realtime.socket", {
31
+ readonly name: string;
32
+ }> {
33
+ }
34
+ /**
35
+ * A node wrapping the function for one `connect`, `message`, or `disconnect`
36
+ * event.
37
+ *
38
+ * @group Internals
39
+ */
40
+ export interface RealtimeEventDescriptor extends Descriptor<"realtime.event", {
41
+ readonly event: RealtimeEventKind;
42
+ readonly fn: EmptyHandler | RealtimeMessageHandler;
43
+ }> {
44
+ }
45
+ /**
46
+ * A realtime socket builder: attach handlers from one shared
47
+ * `socket(app, name)` piece. Each `on*` relates a `realtime.event` child under
48
+ * the socket node; the same builder composes all three kinds.
49
+ *
50
+ * @group Builders
51
+ */
52
+ export interface RealtimeSocketBuilder {
53
+ /** Registers a zero-input handler for the socket `connect` event. */
54
+ readonly onConnect: (fn: EmptyHandler) => RealtimeSocketBuilder;
55
+ /** Registers a handler receiving `{ connection, payload }` for `message`. */
56
+ readonly onMessage: (fn: RealtimeMessageHandler) => RealtimeSocketBuilder;
57
+ /** Registers a zero-input handler for the socket `disconnect` event. */
58
+ readonly onDisconnect: (fn: EmptyHandler) => RealtimeSocketBuilder;
59
+ /** The underlying `realtime.socket` IR node. */
60
+ readonly node: RealtimeSocketDescriptor;
61
+ }
62
+ /**
63
+ * Creates a realtime socket builder for an app. The shared `(app, name)` piece
64
+ * yields a builder that attaches `realtime.event` children for `connect`,
65
+ * `message`, and `disconnect`, related under the app's `realtime.socket` node.
66
+ *
67
+ * @group Builders
68
+ * @example
69
+ * ```ts
70
+ * const chat = socket(app, "chat")
71
+ * .onConnect(() => undefined)
72
+ * .onMessage(({ payload }) => void payload)
73
+ * .onDisconnect(() => undefined);
74
+ * ```
75
+ */
76
+ export declare function socket(app: AppDescriptor, name: string): RealtimeSocketBuilder;
77
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AAErE;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,sBAAsB,KAC5B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;GAIG;AACH,MAAM,WAAW,wBACf,SAAQ,UAAU,CAAC,iBAAiB,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAErE;;;;;GAKG;AACH,MAAM,WAAW,uBACf,SAAQ,UAAU,CAChB,gBAAgB,EAChB;IACE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,sBAAsB,CAAC;CACpD,CACF;CAAG;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,qBAAqB,CAAC;IAChE,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,sBAAsB,KAAK,qBAAqB,CAAC;IAC1E,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,qBAAqB,CAAC;IACnE,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CACpB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,GACX,qBAAqB,CAiCvB"}
package/dist/socket.js ADDED
@@ -0,0 +1,40 @@
1
+ import { defineDescriptor, relate } from "@smitejs/core";
2
+ import { emptyHandler } from "@smitejs/handlers";
3
+ /**
4
+ * Creates a realtime socket builder for an app. The shared `(app, name)` piece
5
+ * yields a builder that attaches `realtime.event` children for `connect`,
6
+ * `message`, and `disconnect`, related under the app's `realtime.socket` node.
7
+ *
8
+ * @group Builders
9
+ * @example
10
+ * ```ts
11
+ * const chat = socket(app, "chat")
12
+ * .onConnect(() => undefined)
13
+ * .onMessage(({ payload }) => void payload)
14
+ * .onDisconnect(() => undefined);
15
+ * ```
16
+ */
17
+ export function socket(app, name) {
18
+ const descriptor = defineDescriptor("realtime.socket", `${app.__key}:socket:${name}`, { name });
19
+ relate(app, "realtime.socket", descriptor);
20
+ const addEvent = (event, fn) => {
21
+ const eventNode = defineDescriptor("realtime.event", `${descriptor.__key}:event:${event}`, { event, fn });
22
+ relate(descriptor, "realtime.event", eventNode);
23
+ };
24
+ const builder = {
25
+ node: descriptor,
26
+ onConnect: (fn) => {
27
+ addEvent("connect", emptyHandler({ name: `socket:${name}` }, fn));
28
+ return builder;
29
+ },
30
+ onMessage: (fn) => {
31
+ addEvent("message", fn);
32
+ return builder;
33
+ },
34
+ onDisconnect: (fn) => {
35
+ addEvent("disconnect", emptyHandler({ name: `socket:${name}` }, fn));
36
+ return builder;
37
+ },
38
+ };
39
+ return builder;
40
+ }
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@smitejs/realtime",
3
+ "version": "2.0.0-SNAPSHOT",
4
+ "description": "Realtime event handlers for Smite: socket descriptors with connect/message/disconnect events, hub executor, and collector.",
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
+ },
33
+ "sideEffects": false
34
+ }
@@ -0,0 +1,37 @@
1
+ import { childrenOf } from "@smitejs/core";
2
+ import type { AppDescriptor, Descriptor } from "@smitejs/core";
3
+ import type { RealtimeEventKind } from "./socket.js";
4
+
5
+ /**
6
+ * A realtime socket as seen by artifact generators: its name and the
7
+ * lifecycle/message events declared on it.
8
+ *
9
+ * @group Collector
10
+ */
11
+ export interface CollectedSocket {
12
+ readonly name: string;
13
+ readonly events: readonly RealtimeEventKind[];
14
+ }
15
+
16
+ type SocketNode = Descriptor<"realtime.socket", { name: string }>;
17
+ type EventNode = Descriptor<"realtime.event", { event: RealtimeEventKind }>;
18
+
19
+ /**
20
+ * Walks an app's `realtime.socket` children and returns the collected sockets
21
+ * with the events they handle. Shared by artifact generators and the hub
22
+ * executor.
23
+ *
24
+ * @group Collector
25
+ * @example Collect an app's sockets
26
+ */
27
+ export function socketsOf(app: AppDescriptor): readonly CollectedSocket[] {
28
+ return childrenOf(app, "realtime.socket").map((node) => {
29
+ const socketNode = node as SocketNode;
30
+ return {
31
+ name: socketNode.data.name,
32
+ events: (childrenOf(node, "realtime.event") as readonly EventNode[]).map(
33
+ (event) => event.data.event,
34
+ ),
35
+ };
36
+ });
37
+ }
@@ -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/realtime";
11
+ const rootDir = process.cwd();
12
+ const srcDir = join(rootDir, "packages/realtime/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
+ });
package/src/hub.ts ADDED
@@ -0,0 +1,86 @@
1
+ import { childrenOf, finalizeDescriptor } from "@smitejs/core";
2
+ import type { AppDescriptor, Descriptor } from "@smitejs/core";
3
+ import { socketsOf } from "./collector.js";
4
+ import type { CollectedSocket } from "./collector.js";
5
+ import type { RealtimeEventKind } from "./socket.js";
6
+
7
+ type SocketNode = Descriptor<"realtime.socket", { name: string }>;
8
+ type EventNode = Descriptor<
9
+ "realtime.event",
10
+ { event: RealtimeEventKind; fn: unknown }
11
+ >;
12
+
13
+ /**
14
+ * A runtime handle returned by {@link realtime}. The transport (a WebSocket
15
+ * server, SSE) decides *when*; the hub decides *what runs*.
16
+ *
17
+ * @group Executor
18
+ */
19
+ export interface RealtimeHub {
20
+ readonly sockets: readonly CollectedSocket[];
21
+ /** Opens a connection, returns the connection id, runs `connect` handlers. */
22
+ readonly connect: (socket: string, connection: string) => Promise<string>;
23
+ /** Fires a socket's `message` handlers with `{ connection, payload }`. */
24
+ readonly emit: (socket: string, payload: unknown) => Promise<number>;
25
+ /** Closes a connection and runs the socket's `disconnect` handlers. */
26
+ readonly disconnect: (socket: string, connection: string) => Promise<number>;
27
+ }
28
+
29
+ /**
30
+ * Turns an app into a runtime realtime hub. Walks the app's `realtime.socket`
31
+ * IR tree via child refs — never the registry — and drives each socket's
32
+ * `connect`, `message`, and `disconnect` events on demand.
33
+ *
34
+ * @group Executor
35
+ * @example Drive a socket's events
36
+ */
37
+ export function hub(
38
+ app: AppDescriptor,
39
+ options: { readonly onError?: (error: unknown) => void } = {},
40
+ ): RealtimeHub {
41
+ finalizeDescriptor(app);
42
+ const sockets = socketsOf(app);
43
+ const socketNodes = childrenOf(
44
+ app,
45
+ "realtime.socket",
46
+ ) as readonly SocketNode[];
47
+
48
+ const eventsOf = (socket: string): readonly EventNode[] => {
49
+ const node = socketNodes.find(
50
+ (candidate) => candidate.data.name === socket,
51
+ );
52
+ if (node === undefined) return [];
53
+ return childrenOf(node, "realtime.event") as readonly EventNode[];
54
+ };
55
+
56
+ const fire = async (
57
+ socket: string,
58
+ event: RealtimeEventKind,
59
+ context: unknown,
60
+ ): Promise<number> => {
61
+ const targets = eventsOf(socket).filter(
62
+ (entry) => entry.data.event === event,
63
+ );
64
+ if (targets.length === 0) return 0;
65
+ const fn = targets[0]?.data.fn as ((value: unknown) => unknown) | undefined;
66
+ if (typeof fn !== "function") return 0;
67
+ try {
68
+ await Promise.resolve(fn(context));
69
+ } catch (error) {
70
+ options.onError?.(error);
71
+ }
72
+ return targets.length;
73
+ };
74
+
75
+ return {
76
+ sockets,
77
+ connect: async (socket, connection) => {
78
+ await fire(socket, "connect", { connection });
79
+ return connection;
80
+ },
81
+ emit: async (socket, payload) =>
82
+ fire(socket, "message", { connection: socket, payload }),
83
+ disconnect: async (socket, connection) =>
84
+ fire(socket, "disconnect", { connection }),
85
+ };
86
+ }
@@ -0,0 +1,92 @@
1
+ import { childrenOf, clear, createApp } from "@smitejs/core";
2
+ import { afterEach, describe, expect, it } from "vitest";
3
+ import { hub, realtime, socket, socketsOf } from "./index.js";
4
+
5
+ afterEach(() => clear());
6
+
7
+ describe("socket builders", () => {
8
+ it("defines a socket with lifecycle and message events", () => {
9
+ const app = createApp();
10
+
11
+ // #section - Define a socket
12
+ const chat = socket(app, "chat")
13
+ .onConnect(() => undefined)
14
+ .onMessage(({ payload }) => void payload)
15
+ .onDisconnect(() => undefined);
16
+ // #endsection
17
+
18
+ expect(chat.node.__kind).toBe("realtime.socket");
19
+ expect(chat.node.data.name).toBe("chat");
20
+ const events = childrenOf(chat.node, "realtime.event");
21
+ expect(
22
+ events.map((node) => (node as { data: { event: string } }).data.event),
23
+ ).toEqual(["connect", "message", "disconnect"]);
24
+ expect(childrenOf(app, "realtime.socket").length).toBe(1);
25
+ });
26
+
27
+ it("collects an app's sockets", () => {
28
+ const app = createApp();
29
+
30
+ // #section - Collect an app's sockets
31
+ socket(app, "presence").onConnect(() => undefined);
32
+ socket(app, "chat").onMessage(() => undefined);
33
+ const collected = socketsOf(app);
34
+ // #endsection
35
+
36
+ expect(collected.map((entry) => entry.name).sort()).toEqual([
37
+ "chat",
38
+ "presence",
39
+ ]);
40
+ expect(collected.find((entry) => entry.name === "chat")?.events).toEqual([
41
+ "message",
42
+ ]);
43
+ });
44
+
45
+ it("registers a realtime namespace bundle", () => {
46
+ // #section - Declare a realtime bundle
47
+ const bundle = realtime;
48
+ // #endsection
49
+
50
+ expect(typeof bundle.hub).toBe("function");
51
+ expect(typeof bundle.socket).toBe("function");
52
+ expect(typeof bundle.socketsOf).toBe("function");
53
+ });
54
+ });
55
+
56
+ describe("hub executor", () => {
57
+ it("drives connect, message, and disconnect events", async () => {
58
+ const app = createApp();
59
+ const log: string[] = [];
60
+ socket(app, "room")
61
+ .onConnect(() => {
62
+ log.push("connect");
63
+ })
64
+ .onMessage(({ payload }) => {
65
+ log.push(`msg:${String((payload as { text: string }).text)}`);
66
+ })
67
+ .onDisconnect(() => {
68
+ log.push("disconnect");
69
+ });
70
+
71
+ // #section - Drive a socket's events
72
+ const chat = hub(app);
73
+ await chat.connect("room", "conn-1");
74
+ await chat.emit("room", { text: "hi" });
75
+ await chat.disconnect("room", "conn-1");
76
+ // #endsection
77
+
78
+ expect(log).toEqual(["connect", "msg:hi", "disconnect"]);
79
+ });
80
+
81
+ it("ignores unknown sockets and missing events", async () => {
82
+ const app = createApp();
83
+ socket(app, "room").onMessage(() => undefined);
84
+
85
+ const bus = hub(app, { onError: () => undefined });
86
+
87
+ await expect(bus.connect("room", "c")).resolves.toBe("c");
88
+ await expect(bus.emit("missing", {})).resolves.toBe(0);
89
+ await expect(bus.disconnect("room", "c")).resolves.toBe(0);
90
+ expect(bus.sockets.map((entry) => entry.name)).toEqual(["room"]);
91
+ });
92
+ });
package/src/index.ts ADDED
@@ -0,0 +1,32 @@
1
+ export { hub } from "./hub.js";
2
+ export type { RealtimeHub } from "./hub.js";
3
+
4
+ export { socketsOf } from "./collector.js";
5
+ export type { CollectedSocket } from "./collector.js";
6
+
7
+ export { socket } from "./socket.js";
8
+ export type {
9
+ RealtimeEventDescriptor,
10
+ RealtimeEventKind,
11
+ RealtimeMessageContext,
12
+ RealtimeMessageHandler,
13
+ RealtimeSocketBuilder,
14
+ RealtimeSocketDescriptor,
15
+ } from "./socket.js";
16
+
17
+ import { socketsOf } from "./collector.js";
18
+ import { hub } from "./hub.js";
19
+ import { socket } from "./socket.js";
20
+
21
+ /**
22
+ * The realtime namespace: one import for the whole realtime app extensor —
23
+ * socket builders, the runtime hub, and the collector.
24
+ *
25
+ * @group Surface
26
+ * @example Declare a realtime bundle
27
+ */
28
+ export const realtime = {
29
+ hub,
30
+ socket,
31
+ socketsOf,
32
+ };
package/src/socket.ts ADDED
@@ -0,0 +1,118 @@
1
+ import { defineDescriptor, relate } from "@smitejs/core";
2
+ import type { AppDescriptor, Descriptor } from "@smitejs/core";
3
+ import type { EmptyHandler } from "@smitejs/handlers";
4
+ import { emptyHandler } from "@smitejs/handlers";
5
+
6
+ /**
7
+ * A lifecycle or message event on a realtime socket. `connect` and `disconnect`
8
+ * are zero-input handlers; `message` also receives the payload.
9
+ *
10
+ * @group Types
11
+ */
12
+ export type RealtimeEventKind = "connect" | "disconnect" | "message";
13
+
14
+ /**
15
+ * The context a realtime message handler receives.
16
+ *
17
+ * @group Types
18
+ */
19
+ export interface RealtimeMessageContext {
20
+ readonly connection: string;
21
+ readonly payload: unknown;
22
+ }
23
+
24
+ /**
25
+ * A handler for a realtime `message` event.
26
+ *
27
+ * @group Types
28
+ */
29
+ export type RealtimeMessageHandler = (
30
+ context: RealtimeMessageContext,
31
+ ) => void | Promise<void>;
32
+
33
+ /**
34
+ * A `realtime.socket` IR node.
35
+ *
36
+ * @group Internals
37
+ */
38
+ export interface RealtimeSocketDescriptor
39
+ extends Descriptor<"realtime.socket", { readonly name: string }> {}
40
+
41
+ /**
42
+ * A node wrapping the function for one `connect`, `message`, or `disconnect`
43
+ * event.
44
+ *
45
+ * @group Internals
46
+ */
47
+ export interface RealtimeEventDescriptor
48
+ extends Descriptor<
49
+ "realtime.event",
50
+ {
51
+ readonly event: RealtimeEventKind;
52
+ readonly fn: EmptyHandler | RealtimeMessageHandler;
53
+ }
54
+ > {}
55
+
56
+ /**
57
+ * A realtime socket builder: attach handlers from one shared
58
+ * `socket(app, name)` piece. Each `on*` relates a `realtime.event` child under
59
+ * the socket node; the same builder composes all three kinds.
60
+ *
61
+ * @group Builders
62
+ */
63
+ export interface RealtimeSocketBuilder {
64
+ /** Registers a zero-input handler for the socket `connect` event. */
65
+ readonly onConnect: (fn: EmptyHandler) => RealtimeSocketBuilder;
66
+ /** Registers a handler receiving `{ connection, payload }` for `message`. */
67
+ readonly onMessage: (fn: RealtimeMessageHandler) => RealtimeSocketBuilder;
68
+ /** Registers a zero-input handler for the socket `disconnect` event. */
69
+ readonly onDisconnect: (fn: EmptyHandler) => RealtimeSocketBuilder;
70
+ /** The underlying `realtime.socket` IR node. */
71
+ readonly node: RealtimeSocketDescriptor;
72
+ }
73
+
74
+ /**
75
+ * Creates a realtime socket builder for an app. The shared `(app, name)` piece
76
+ * yields a builder that attaches `realtime.event` children for `connect`,
77
+ * `message`, and `disconnect`, related under the app's `realtime.socket` node.
78
+ *
79
+ * @group Builders
80
+ * @example Define a socket
81
+ */
82
+ export function socket(
83
+ app: AppDescriptor,
84
+ name: string,
85
+ ): RealtimeSocketBuilder {
86
+ const descriptor = defineDescriptor(
87
+ "realtime.socket",
88
+ `${app.__key}:socket:${name}`,
89
+ { name },
90
+ );
91
+ relate(app, "realtime.socket", descriptor);
92
+
93
+ const addEvent = (event: RealtimeEventKind, fn: unknown): void => {
94
+ const eventNode = defineDescriptor(
95
+ "realtime.event",
96
+ `${descriptor.__key}:event:${event}`,
97
+ { event, fn },
98
+ );
99
+ relate(descriptor, "realtime.event", eventNode);
100
+ };
101
+
102
+ const builder: RealtimeSocketBuilder = {
103
+ node: descriptor,
104
+ onConnect: (fn) => {
105
+ addEvent("connect", emptyHandler({ name: `socket:${name}` }, fn));
106
+ return builder;
107
+ },
108
+ onMessage: (fn) => {
109
+ addEvent("message", fn);
110
+ return builder;
111
+ },
112
+ onDisconnect: (fn) => {
113
+ addEvent("disconnect", emptyHandler({ name: `socket:${name}` }, fn));
114
+ return builder;
115
+ },
116
+ };
117
+ return builder;
118
+ }
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
+ }