@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.
- package/dist/.tsbuildinfo +1 -0
- package/dist/collector.d.ts +27 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +23 -0
- package/dist/hub.d.ts +35 -0
- package/dist/hub.d.ts.map +1 -0
- package/dist/hub.js +51 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/socket.d.ts +77 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +40 -0
- package/package.json +34 -0
- package/src/collector.ts +37 -0
- package/src/docs.test.ts +65 -0
- package/src/hub.ts +86 -0
- package/src/index.test.ts +92 -0
- package/src/index.ts +32 -0
- package/src/socket.ts +118 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/typescript/lib/lib.es2022.full.d.ts","../../core/dist/descriptor.d.ts","../../core/dist/app.d.ts","../../core/dist/constants.d.ts","../../core/dist/scope.d.ts","../../core/dist/registry.d.ts","../../core/dist/index.d.ts","../../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
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
};
|
package/dist/socket.d.ts
ADDED
|
@@ -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
|
+
}
|
package/src/collector.ts
ADDED
|
@@ -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
|
+
}
|
package/src/docs.test.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { expandExamples } from "../../../scripts/inject-jsdoc-examples.mjs";
|
|
5
|
+
import {
|
|
6
|
+
collectFiles,
|
|
7
|
+
collectTestSnippets,
|
|
8
|
+
} from "../../../scripts/snippets.mjs";
|
|
9
|
+
|
|
10
|
+
const packageName = "@smitejs/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
|
+
}
|