velocious 1.0.430 → 1.0.432
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/bin/velocious.js +48 -0
- package/build/application.js +229 -0
- package/build/authorization/ability.js +329 -0
- package/build/authorization/base-resource.js +143 -0
- package/build/background-jobs/client.js +50 -0
- package/build/background-jobs/cron-expression.js +277 -0
- package/build/background-jobs/forked-runner-child.js +86 -0
- package/build/background-jobs/job-record.js +13 -0
- package/build/background-jobs/job-registry.js +92 -0
- package/build/background-jobs/job-runner.js +107 -0
- package/build/background-jobs/job.js +77 -0
- package/build/background-jobs/json-socket.js +78 -0
- package/build/background-jobs/main.js +926 -0
- package/build/background-jobs/normalize-error.js +26 -0
- package/build/background-jobs/scheduler.js +274 -0
- package/build/background-jobs/socket-request.js +68 -0
- package/build/background-jobs/status-reporter.js +101 -0
- package/build/background-jobs/store.js +994 -0
- package/build/background-jobs/types.js +70 -0
- package/build/background-jobs/web/authorization.js +89 -0
- package/build/background-jobs/web/controller.js +280 -0
- package/build/background-jobs/web/index.js +57 -0
- package/build/background-jobs/web/path-matcher.js +74 -0
- package/build/background-jobs/web/registry.js +49 -0
- package/build/background-jobs/worker.js +683 -0
- package/build/beacon/client.js +330 -0
- package/build/beacon/in-process-broker.js +71 -0
- package/build/beacon/in-process-client.js +139 -0
- package/build/beacon/server.js +148 -0
- package/build/beacon/types.js +55 -0
- package/build/bin/velocious.js +39 -34
- package/build/cli/base-command.js +67 -0
- package/build/cli/browser-cli.js +45 -0
- package/build/cli/commands/background-jobs-main.js +7 -0
- package/build/cli/commands/background-jobs-runner.js +7 -0
- package/build/cli/commands/background-jobs-worker.js +7 -0
- package/build/cli/commands/beacon.js +7 -0
- package/build/cli/commands/console.js +12 -0
- package/build/cli/commands/db/base-command.js +82 -0
- package/build/cli/commands/db/create.js +64 -0
- package/build/cli/commands/db/drop.js +75 -0
- package/build/cli/commands/db/migrate.js +17 -0
- package/build/cli/commands/db/reset.js +22 -0
- package/build/cli/commands/db/rollback.js +15 -0
- package/build/cli/commands/db/schema/dump.js +12 -0
- package/build/cli/commands/db/schema/load.js +12 -0
- package/build/cli/commands/db/seed.js +12 -0
- package/build/cli/commands/db/tenants/check.js +38 -0
- package/build/cli/commands/db/tenants/create.js +33 -0
- package/build/cli/commands/db/tenants/migrate.js +49 -0
- package/build/cli/commands/destroy/migration.js +7 -0
- package/build/cli/commands/generate/base-models.js +7 -0
- package/build/cli/commands/generate/frontend-models.js +12 -0
- package/build/cli/commands/generate/migration.js +7 -0
- package/build/cli/commands/generate/model.js +7 -0
- package/build/cli/commands/init.js +11 -0
- package/build/cli/commands/routes.js +7 -0
- package/build/cli/commands/run-script.js +12 -0
- package/build/cli/commands/runner.js +12 -0
- package/build/cli/commands/server.js +7 -0
- package/build/cli/commands/test.js +9 -0
- package/build/cli/index.js +152 -0
- package/build/cli/tenant-database-command-helper.js +198 -0
- package/build/cli/use-browser-cli.js +30 -0
- package/build/configuration-resolver.js +65 -0
- package/build/configuration-types.js +429 -0
- package/build/configuration.js +2590 -0
- package/build/controller.js +421 -0
- package/build/current-configuration.js +31 -0
- package/build/current.js +80 -0
- package/build/database/annotations-async-hooks.js +47 -0
- package/build/database/annotations.js +40 -0
- package/build/database/drivers/base-column.js +182 -0
- package/build/database/drivers/base-columns-index.js +81 -0
- package/build/database/drivers/base-foreign-key.js +104 -0
- package/build/database/drivers/base-table.js +156 -0
- package/build/database/drivers/base.js +1609 -0
- package/build/database/drivers/mssql/column.js +74 -0
- package/build/database/drivers/mssql/columns-index.js +6 -0
- package/build/database/drivers/mssql/connect-connection.js +16 -0
- package/build/database/drivers/mssql/foreign-key.js +12 -0
- package/build/database/drivers/mssql/index.js +590 -0
- package/build/database/drivers/mssql/options.js +79 -0
- package/build/database/drivers/mssql/query-parser.js +6 -0
- package/build/database/drivers/mssql/sql/alter-table.js +4 -0
- package/build/database/drivers/mssql/sql/create-database.js +36 -0
- package/build/database/drivers/mssql/sql/create-index.js +4 -0
- package/build/database/drivers/mssql/sql/create-table.js +4 -0
- package/build/database/drivers/mssql/sql/delete.js +19 -0
- package/build/database/drivers/mssql/sql/drop-database.js +36 -0
- package/build/database/drivers/mssql/sql/drop-table.js +4 -0
- package/build/database/drivers/mssql/sql/insert.js +4 -0
- package/build/database/drivers/mssql/sql/update.js +31 -0
- package/build/database/drivers/mssql/sql/upsert.js +23 -0
- package/build/database/drivers/mssql/structure-sql.js +120 -0
- package/build/database/drivers/mssql/table.js +145 -0
- package/build/database/drivers/mysql/column.js +112 -0
- package/build/database/drivers/mysql/columns-index.js +22 -0
- package/build/database/drivers/mysql/foreign-key.js +12 -0
- package/build/database/drivers/mysql/index.js +473 -0
- package/build/database/drivers/mysql/options.js +34 -0
- package/build/database/drivers/mysql/query-parser.js +6 -0
- package/build/database/drivers/mysql/query.js +37 -0
- package/build/database/drivers/mysql/sql/alter-table.js +6 -0
- package/build/database/drivers/mysql/sql/create-database.js +39 -0
- package/build/database/drivers/mysql/sql/create-index.js +6 -0
- package/build/database/drivers/mysql/sql/create-table.js +6 -0
- package/build/database/drivers/mysql/sql/delete.js +21 -0
- package/build/database/drivers/mysql/sql/drop-database.js +6 -0
- package/build/database/drivers/mysql/sql/drop-table.js +6 -0
- package/build/database/drivers/mysql/sql/insert.js +6 -0
- package/build/database/drivers/mysql/sql/update.js +33 -0
- package/build/database/drivers/mysql/sql/upsert.js +13 -0
- package/build/database/drivers/mysql/structure-sql.js +93 -0
- package/build/database/drivers/mysql/table.js +121 -0
- package/build/database/drivers/pgsql/column.js +90 -0
- package/build/database/drivers/pgsql/columns-index.js +6 -0
- package/build/database/drivers/pgsql/foreign-key.js +12 -0
- package/build/database/drivers/pgsql/index.js +441 -0
- package/build/database/drivers/pgsql/options.js +32 -0
- package/build/database/drivers/pgsql/query-parser.js +6 -0
- package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/build/database/drivers/pgsql/sql/create-database.js +38 -0
- package/build/database/drivers/pgsql/sql/create-index.js +6 -0
- package/build/database/drivers/pgsql/sql/create-table.js +6 -0
- package/build/database/drivers/pgsql/sql/delete.js +21 -0
- package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/build/database/drivers/pgsql/sql/insert.js +6 -0
- package/build/database/drivers/pgsql/sql/update.js +33 -0
- package/build/database/drivers/pgsql/sql/upsert.js +14 -0
- package/build/database/drivers/pgsql/structure-sql.js +126 -0
- package/build/database/drivers/pgsql/table.js +135 -0
- package/build/database/drivers/sqlite/base.js +509 -0
- package/build/database/drivers/sqlite/column.js +75 -0
- package/build/database/drivers/sqlite/columns-index.js +30 -0
- package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/build/database/drivers/sqlite/foreign-key.js +24 -0
- package/build/database/drivers/sqlite/index.js +394 -0
- package/build/database/drivers/sqlite/index.native.js +72 -0
- package/build/database/drivers/sqlite/index.web.js +99 -0
- package/build/database/drivers/sqlite/options.js +32 -0
- package/build/database/drivers/sqlite/query-parser.js +6 -0
- package/build/database/drivers/sqlite/query.js +35 -0
- package/build/database/drivers/sqlite/query.native.js +35 -0
- package/build/database/drivers/sqlite/query.web.js +49 -0
- package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/build/database/drivers/sqlite/sql/create-index.js +6 -0
- package/build/database/drivers/sqlite/sql/create-table.js +6 -0
- package/build/database/drivers/sqlite/sql/delete.js +26 -0
- package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/build/database/drivers/sqlite/sql/insert.js +6 -0
- package/build/database/drivers/sqlite/sql/update.js +33 -0
- package/build/database/drivers/sqlite/sql/upsert.js +14 -0
- package/build/database/drivers/sqlite/structure-sql.js +56 -0
- package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/build/database/drivers/sqlite/table.js +131 -0
- package/build/database/drivers/structure-sql/utils.js +35 -0
- package/build/database/handler.js +13 -0
- package/build/database/initializer-from-require-context.js +101 -0
- package/build/database/migration/index.js +438 -0
- package/build/database/migrator/files-finder.js +55 -0
- package/build/database/migrator/types.js +31 -0
- package/build/database/migrator.js +557 -0
- package/build/database/pool/async-tracked-multi-connection.js +1164 -0
- package/build/database/pool/base-methods-forward.js +52 -0
- package/build/database/pool/base.js +380 -0
- package/build/database/pool/single-multi-use.js +118 -0
- package/build/database/query/alter-table-base.js +104 -0
- package/build/database/query/base.js +49 -0
- package/build/database/query/create-database-base.js +42 -0
- package/build/database/query/create-index-base.js +117 -0
- package/build/database/query/create-table-base.js +205 -0
- package/build/database/query/delete-base.js +19 -0
- package/build/database/query/drop-database-base.js +38 -0
- package/build/database/query/drop-table-base.js +58 -0
- package/build/database/query/from-base.js +36 -0
- package/build/database/query/from-plain.js +16 -0
- package/build/database/query/from-table.js +18 -0
- package/build/database/query/index.js +533 -0
- package/build/database/query/insert-base.js +172 -0
- package/build/database/query/join-base.js +43 -0
- package/build/database/query/join-object.js +167 -0
- package/build/database/query/join-plain.js +18 -0
- package/build/database/query/join-tracker.js +93 -0
- package/build/database/query/model-class-query.js +1577 -0
- package/build/database/query/order-base.js +33 -0
- package/build/database/query/order-column.js +77 -0
- package/build/database/query/order-plain.js +28 -0
- package/build/database/query/preloader/belongs-to.js +267 -0
- package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/build/database/query/preloader/has-many.js +316 -0
- package/build/database/query/preloader/has-one.js +123 -0
- package/build/database/query/preloader/selection.js +152 -0
- package/build/database/query/preloader.js +201 -0
- package/build/database/query/query-data.js +305 -0
- package/build/database/query/select-base.js +30 -0
- package/build/database/query/select-plain.js +18 -0
- package/build/database/query/select-table-and-column.js +28 -0
- package/build/database/query/update-base.js +41 -0
- package/build/database/query/upsert-base.js +103 -0
- package/build/database/query/where-base.js +38 -0
- package/build/database/query/where-combinator.js +31 -0
- package/build/database/query/where-hash.js +77 -0
- package/build/database/query/where-model-class-hash.js +505 -0
- package/build/database/query/where-not.js +23 -0
- package/build/database/query/where-plain.js +20 -0
- package/build/database/query/with-count.js +219 -0
- package/build/database/query-parser/base-query-parser.js +40 -0
- package/build/database/query-parser/from-parser.js +49 -0
- package/build/database/query-parser/group-parser.js +55 -0
- package/build/database/query-parser/joins-parser.js +37 -0
- package/build/database/query-parser/limit-parser.js +77 -0
- package/build/database/query-parser/options.js +94 -0
- package/build/database/query-parser/order-parser.js +45 -0
- package/build/database/query-parser/select-parser.js +67 -0
- package/build/database/query-parser/where-parser.js +46 -0
- package/build/database/record/acts-as-list.js +374 -0
- package/build/database/record/attachments/download.js +49 -0
- package/build/database/record/attachments/handle.js +188 -0
- package/build/database/record/attachments/normalize-input.js +213 -0
- package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/build/database/record/attachments/storage-drivers/native.js +146 -0
- package/build/database/record/attachments/storage-drivers/s3.js +245 -0
- package/build/database/record/attachments/store.js +591 -0
- package/build/database/record/index.js +4094 -0
- package/build/database/record/instance-relationships/base.js +289 -0
- package/build/database/record/instance-relationships/belongs-to.js +84 -0
- package/build/database/record/instance-relationships/has-many.js +284 -0
- package/build/database/record/instance-relationships/has-one.js +117 -0
- package/build/database/record/record-not-found-error.js +3 -0
- package/build/database/record/relationships/base.js +195 -0
- package/build/database/record/relationships/belongs-to.js +57 -0
- package/build/database/record/relationships/has-many.js +46 -0
- package/build/database/record/relationships/has-one.js +46 -0
- package/build/database/record/state-machine.js +278 -0
- package/build/database/record/user-module.js +43 -0
- package/build/database/record/validators/base.js +27 -0
- package/build/database/record/validators/format.js +50 -0
- package/build/database/record/validators/presence.js +24 -0
- package/build/database/record/validators/uniqueness.js +124 -0
- package/build/database/table-data/index.js +241 -0
- package/build/database/table-data/table-column.js +416 -0
- package/build/database/table-data/table-foreign-key.js +69 -0
- package/build/database/table-data/table-index.js +46 -0
- package/build/database/table-data/table-reference.js +13 -0
- package/build/database/use-database.js +48 -0
- package/build/environment-handlers/base.js +561 -0
- package/build/environment-handlers/browser.js +338 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/build/environment-handlers/node/cli/commands/console.js +149 -0
- package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/build/environment-handlers/node/cli/commands/init.js +68 -0
- package/build/environment-handlers/node/cli/commands/routes.js +63 -0
- package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/build/environment-handlers/node/cli/commands/runner.js +84 -0
- package/build/environment-handlers/node/cli/commands/server.js +151 -0
- package/build/environment-handlers/node/cli/commands/test.js +118 -0
- package/build/environment-handlers/node.js +887 -0
- package/build/error-logger.js +30 -0
- package/build/frontend-model-controller.js +3491 -0
- package/build/frontend-model-resource/base-resource.js +935 -0
- package/build/frontend-models/base.js +4004 -0
- package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/build/frontend-models/event-hook-models.js +49 -0
- package/build/frontend-models/model-registry.js +28 -0
- package/build/frontend-models/outgoing-event-buffer.js +51 -0
- package/build/frontend-models/preloader.js +169 -0
- package/build/frontend-models/query.js +2245 -0
- package/build/frontend-models/resource-config-validation.js +56 -0
- package/build/frontend-models/resource-definition.js +399 -0
- package/build/frontend-models/transport-serialization.js +369 -0
- package/build/frontend-models/use-created-event.js +21 -0
- package/build/frontend-models/use-destroyed-event.js +148 -0
- package/build/frontend-models/use-model-class-event.js +164 -0
- package/build/frontend-models/use-updated-event.js +152 -0
- package/build/frontend-models/websocket-channel.js +494 -0
- package/build/frontend-models/websocket-publishers.js +224 -0
- package/build/http-client/header.js +17 -0
- package/build/http-client/index.js +139 -0
- package/build/http-client/request.js +94 -0
- package/build/http-client/response.js +151 -0
- package/build/http-client/websocket-client.js +27 -0
- package/build/http-server/client/index.js +507 -0
- package/build/http-server/client/params-to-object.js +152 -0
- package/build/http-server/client/request-buffer/form-data-part.js +139 -0
- package/build/http-server/client/request-buffer/header.js +19 -0
- package/build/http-server/client/request-buffer/index.js +535 -0
- package/build/http-server/client/request-parser.js +195 -0
- package/build/http-server/client/request-runner.js +321 -0
- package/build/http-server/client/request-timing.js +171 -0
- package/build/http-server/client/request.js +114 -0
- package/build/http-server/client/response.js +251 -0
- package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/build/http-server/client/websocket-request.js +147 -0
- package/build/http-server/client/websocket-session.js +1755 -0
- package/build/http-server/cookie.js +245 -0
- package/build/http-server/development-reloader.js +240 -0
- package/build/http-server/index.js +561 -0
- package/build/http-server/remote-address.js +77 -0
- package/build/http-server/server-client.js +222 -0
- package/build/http-server/server-lock.js +178 -0
- package/build/http-server/websocket-channel-subscribers.js +110 -0
- package/build/http-server/websocket-channel.js +137 -0
- package/build/http-server/websocket-connection.js +118 -0
- package/build/http-server/websocket-event-log-store.js +433 -0
- package/build/http-server/websocket-events-host.js +170 -0
- package/build/http-server/websocket-events.js +50 -0
- package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/build/http-server/worker-handler/in-process.js +155 -0
- package/build/http-server/worker-handler/index.js +370 -0
- package/build/http-server/worker-handler/worker-script.js +6 -0
- package/build/http-server/worker-handler/worker-thread.js +286 -0
- package/build/index.js +1 -2
- package/build/initializer.js +39 -0
- package/build/jobs/mail-delivery.js +22 -0
- package/build/logger/base-logger.js +34 -0
- package/build/logger/console-logger.js +28 -0
- package/build/logger/file-logger.js +36 -0
- package/build/logger/outputs/array-output.js +50 -0
- package/build/logger/outputs/console-output.js +32 -0
- package/build/logger/outputs/file-output.js +55 -0
- package/build/logger/outputs/stdout-output.js +64 -0
- package/build/logger.js +507 -0
- package/build/mailer/backends/smtp.js +197 -0
- package/build/mailer/base.js +337 -0
- package/build/mailer/delivery.js +70 -0
- package/build/mailer/index.js +24 -0
- package/build/mailer.js +15 -0
- package/build/plugins/sqljs-wasm-route-controller.js +70 -0
- package/build/plugins/sqljs-wasm-route.js +71 -0
- package/build/record-payload-values.js +83 -0
- package/build/routes/app-routes.js +17 -0
- package/build/routes/base-route.js +133 -0
- package/build/routes/basic-route.js +109 -0
- package/build/routes/built-in/debug/controller.js +12 -0
- package/build/routes/built-in/errors/controller.js +7 -0
- package/build/routes/get-route.js +75 -0
- package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/build/routes/index.js +50 -0
- package/build/routes/namespace-route.js +51 -0
- package/build/routes/plugin-routes.js +141 -0
- package/build/routes/post-route.js +74 -0
- package/build/routes/resolver.js +535 -0
- package/build/routes/resource-route.js +154 -0
- package/build/routes/root-route.js +11 -0
- package/build/src/authorization/ability.d.ts +24 -23
- package/build/src/authorization/ability.d.ts.map +1 -1
- package/build/src/authorization/ability.js +14 -13
- package/build/src/authorization/base-resource.d.ts +20 -26
- package/build/src/authorization/base-resource.d.ts.map +1 -1
- package/build/src/authorization/base-resource.js +13 -11
- package/build/src/configuration-types.d.ts +21 -2
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +8 -2
- package/build/src/database/query/where-combinator.d.ts.map +1 -1
- package/build/src/database/query/where-combinator.js +1 -2
- package/build/src/database/record/acts-as-list.js +2 -2
- package/build/src/database/record/attachments/store.d.ts +1 -1
- package/build/src/database/record/attachments/store.d.ts.map +1 -1
- package/build/src/database/record/attachments/store.js +2 -2
- package/build/src/database/record/index.d.ts +82 -20
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +126 -13
- package/build/src/database/record/relationships/base.d.ts +2 -2
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +3 -3
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +59 -36
- package/build/src/frontend-model-controller.d.ts +6 -6
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +4 -4
- package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +22 -10
- package/build/src/frontend-models/base.d.ts +19 -12
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +79 -48
- package/build/src/frontend-models/preloader.d.ts +6 -6
- package/build/src/frontend-models/preloader.d.ts.map +1 -1
- package/build/src/frontend-models/preloader.js +5 -5
- package/build/src/frontend-models/query.d.ts.map +1 -1
- package/build/src/frontend-models/query.js +1 -4
- package/build/src/utils/ransack.d.ts.map +1 -1
- package/build/src/utils/ransack.js +1 -2
- package/build/templates/configuration.js +61 -0
- package/build/templates/generate-migration.js +11 -0
- package/build/templates/generate-model.js +6 -0
- package/build/templates/routes.js +11 -0
- package/build/testing/base-expect.js +17 -0
- package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/build/testing/browser-test-app.js +32 -0
- package/build/testing/expect-to-change.js +55 -0
- package/build/testing/expect-utils.js +269 -0
- package/build/testing/expect.js +763 -0
- package/build/testing/request-client.js +90 -0
- package/build/testing/test-files-finder.js +364 -0
- package/build/testing/test-filter-parser.js +198 -0
- package/build/testing/test-runner.js +1168 -0
- package/build/testing/test-suite-splitter.js +177 -0
- package/build/testing/test.js +370 -0
- package/build/utils/backtrace-cleaner-node.js +87 -0
- package/build/utils/backtrace-cleaner.js +266 -0
- package/build/utils/ensure-error.js +15 -0
- package/build/utils/event-emitter.js +8 -0
- package/build/utils/file-exists.js +18 -0
- package/build/utils/format-value.js +101 -0
- package/build/utils/model-scope.js +56 -0
- package/build/utils/nest-callbacks.js +22 -0
- package/build/utils/plain-object.js +14 -0
- package/build/utils/ransack.js +859 -0
- package/build/utils/rest-args-error.js +14 -0
- package/build/utils/singularize-model-name.js +18 -0
- package/build/utils/split-sql-statements.js +88 -0
- package/build/utils/to-import-specifier.js +53 -0
- package/build/utils/with-tracked-stack-async-hooks.js +103 -0
- package/build/utils/with-tracked-stack.js +38 -0
- package/build/velocious-error.js +34 -0
- package/index.js +1 -0
- package/package.json +10 -4
- package/scripts/clean-build.js +8 -0
- package/scripts/ensure-bin-executable.js +13 -0
- package/scripts/run-tests.js +37 -0
- package/scripts/test-browser.js +486 -0
- package/src/application.js +229 -0
- package/src/authorization/ability.js +329 -0
- package/src/authorization/base-resource.js +143 -0
- package/src/background-jobs/client.js +50 -0
- package/src/background-jobs/cron-expression.js +277 -0
- package/src/background-jobs/forked-runner-child.js +86 -0
- package/src/background-jobs/job-record.js +13 -0
- package/src/background-jobs/job-registry.js +92 -0
- package/src/background-jobs/job-runner.js +107 -0
- package/src/background-jobs/job.js +77 -0
- package/src/background-jobs/json-socket.js +78 -0
- package/src/background-jobs/main.js +926 -0
- package/src/background-jobs/normalize-error.js +26 -0
- package/src/background-jobs/scheduler.js +274 -0
- package/src/background-jobs/socket-request.js +68 -0
- package/src/background-jobs/status-reporter.js +101 -0
- package/src/background-jobs/store.js +994 -0
- package/src/background-jobs/types.js +70 -0
- package/src/background-jobs/web/authorization.js +89 -0
- package/src/background-jobs/web/controller.js +280 -0
- package/src/background-jobs/web/index.js +57 -0
- package/src/background-jobs/web/path-matcher.js +74 -0
- package/src/background-jobs/web/registry.js +49 -0
- package/src/background-jobs/worker.js +683 -0
- package/src/beacon/client.js +330 -0
- package/src/beacon/in-process-broker.js +71 -0
- package/src/beacon/in-process-client.js +139 -0
- package/src/beacon/server.js +148 -0
- package/src/beacon/types.js +55 -0
- package/src/cli/base-command.js +67 -0
- package/src/cli/browser-cli.js +45 -0
- package/src/cli/commands/background-jobs-main.js +7 -0
- package/src/cli/commands/background-jobs-runner.js +7 -0
- package/src/cli/commands/background-jobs-worker.js +7 -0
- package/src/cli/commands/beacon.js +7 -0
- package/src/cli/commands/console.js +12 -0
- package/src/cli/commands/db/base-command.js +82 -0
- package/src/cli/commands/db/create.js +64 -0
- package/src/cli/commands/db/drop.js +75 -0
- package/src/cli/commands/db/migrate.js +17 -0
- package/src/cli/commands/db/reset.js +22 -0
- package/src/cli/commands/db/rollback.js +15 -0
- package/src/cli/commands/db/schema/dump.js +12 -0
- package/src/cli/commands/db/schema/load.js +12 -0
- package/src/cli/commands/db/seed.js +12 -0
- package/src/cli/commands/db/tenants/check.js +38 -0
- package/src/cli/commands/db/tenants/create.js +33 -0
- package/src/cli/commands/db/tenants/migrate.js +49 -0
- package/src/cli/commands/destroy/migration.js +7 -0
- package/src/cli/commands/generate/base-models.js +7 -0
- package/src/cli/commands/generate/frontend-models.js +12 -0
- package/src/cli/commands/generate/migration.js +7 -0
- package/src/cli/commands/generate/model.js +7 -0
- package/src/cli/commands/init.js +11 -0
- package/src/cli/commands/routes.js +7 -0
- package/src/cli/commands/run-script.js +12 -0
- package/src/cli/commands/runner.js +12 -0
- package/src/cli/commands/server.js +7 -0
- package/src/cli/commands/test.js +9 -0
- package/src/cli/index.js +152 -0
- package/src/cli/tenant-database-command-helper.js +198 -0
- package/src/cli/use-browser-cli.js +30 -0
- package/src/configuration-resolver.js +65 -0
- package/src/configuration-types.js +429 -0
- package/src/configuration.js +2590 -0
- package/src/controller.js +421 -0
- package/src/current-configuration.js +31 -0
- package/src/current.js +80 -0
- package/src/database/annotations-async-hooks.js +47 -0
- package/src/database/annotations.js +40 -0
- package/src/database/drivers/base-column.js +182 -0
- package/src/database/drivers/base-columns-index.js +81 -0
- package/src/database/drivers/base-foreign-key.js +104 -0
- package/src/database/drivers/base-table.js +156 -0
- package/src/database/drivers/base.js +1609 -0
- package/src/database/drivers/mssql/column.js +74 -0
- package/src/database/drivers/mssql/columns-index.js +6 -0
- package/src/database/drivers/mssql/connect-connection.js +16 -0
- package/src/database/drivers/mssql/foreign-key.js +12 -0
- package/src/database/drivers/mssql/index.js +590 -0
- package/src/database/drivers/mssql/options.js +79 -0
- package/src/database/drivers/mssql/query-parser.js +6 -0
- package/src/database/drivers/mssql/sql/alter-table.js +4 -0
- package/src/database/drivers/mssql/sql/create-database.js +36 -0
- package/src/database/drivers/mssql/sql/create-index.js +4 -0
- package/src/database/drivers/mssql/sql/create-table.js +4 -0
- package/src/database/drivers/mssql/sql/delete.js +19 -0
- package/src/database/drivers/mssql/sql/drop-database.js +36 -0
- package/src/database/drivers/mssql/sql/drop-table.js +4 -0
- package/src/database/drivers/mssql/sql/insert.js +4 -0
- package/src/database/drivers/mssql/sql/update.js +31 -0
- package/src/database/drivers/mssql/sql/upsert.js +23 -0
- package/src/database/drivers/mssql/structure-sql.js +120 -0
- package/src/database/drivers/mssql/table.js +145 -0
- package/src/database/drivers/mysql/column.js +112 -0
- package/src/database/drivers/mysql/columns-index.js +22 -0
- package/src/database/drivers/mysql/foreign-key.js +12 -0
- package/src/database/drivers/mysql/index.js +473 -0
- package/src/database/drivers/mysql/options.js +34 -0
- package/src/database/drivers/mysql/query-parser.js +6 -0
- package/src/database/drivers/mysql/query.js +37 -0
- package/src/database/drivers/mysql/sql/alter-table.js +6 -0
- package/src/database/drivers/mysql/sql/create-database.js +39 -0
- package/src/database/drivers/mysql/sql/create-index.js +6 -0
- package/src/database/drivers/mysql/sql/create-table.js +6 -0
- package/src/database/drivers/mysql/sql/delete.js +21 -0
- package/src/database/drivers/mysql/sql/drop-database.js +6 -0
- package/src/database/drivers/mysql/sql/drop-table.js +6 -0
- package/src/database/drivers/mysql/sql/insert.js +6 -0
- package/src/database/drivers/mysql/sql/update.js +33 -0
- package/src/database/drivers/mysql/sql/upsert.js +13 -0
- package/src/database/drivers/mysql/structure-sql.js +93 -0
- package/src/database/drivers/mysql/table.js +121 -0
- package/src/database/drivers/pgsql/column.js +90 -0
- package/src/database/drivers/pgsql/columns-index.js +6 -0
- package/src/database/drivers/pgsql/foreign-key.js +12 -0
- package/src/database/drivers/pgsql/index.js +441 -0
- package/src/database/drivers/pgsql/options.js +32 -0
- package/src/database/drivers/pgsql/query-parser.js +6 -0
- package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
- package/src/database/drivers/pgsql/sql/create-database.js +38 -0
- package/src/database/drivers/pgsql/sql/create-index.js +6 -0
- package/src/database/drivers/pgsql/sql/create-table.js +6 -0
- package/src/database/drivers/pgsql/sql/delete.js +21 -0
- package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
- package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
- package/src/database/drivers/pgsql/sql/insert.js +6 -0
- package/src/database/drivers/pgsql/sql/update.js +33 -0
- package/src/database/drivers/pgsql/sql/upsert.js +14 -0
- package/src/database/drivers/pgsql/structure-sql.js +126 -0
- package/src/database/drivers/pgsql/table.js +135 -0
- package/src/database/drivers/sqlite/base.js +509 -0
- package/src/database/drivers/sqlite/column.js +75 -0
- package/src/database/drivers/sqlite/columns-index.js +30 -0
- package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
- package/src/database/drivers/sqlite/foreign-key.js +24 -0
- package/src/database/drivers/sqlite/index.js +394 -0
- package/src/database/drivers/sqlite/index.native.js +72 -0
- package/src/database/drivers/sqlite/index.web.js +99 -0
- package/src/database/drivers/sqlite/options.js +32 -0
- package/src/database/drivers/sqlite/query-parser.js +6 -0
- package/src/database/drivers/sqlite/query.js +35 -0
- package/src/database/drivers/sqlite/query.native.js +35 -0
- package/src/database/drivers/sqlite/query.web.js +49 -0
- package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
- package/src/database/drivers/sqlite/sql/create-index.js +6 -0
- package/src/database/drivers/sqlite/sql/create-table.js +6 -0
- package/src/database/drivers/sqlite/sql/delete.js +26 -0
- package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
- package/src/database/drivers/sqlite/sql/insert.js +6 -0
- package/src/database/drivers/sqlite/sql/update.js +33 -0
- package/src/database/drivers/sqlite/sql/upsert.js +14 -0
- package/src/database/drivers/sqlite/structure-sql.js +56 -0
- package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
- package/src/database/drivers/sqlite/table.js +131 -0
- package/src/database/drivers/structure-sql/utils.js +35 -0
- package/src/database/handler.js +13 -0
- package/src/database/initializer-from-require-context.js +101 -0
- package/src/database/migration/index.js +438 -0
- package/src/database/migrator/files-finder.js +55 -0
- package/src/database/migrator/types.js +31 -0
- package/src/database/migrator.js +557 -0
- package/src/database/pool/async-tracked-multi-connection.js +1164 -0
- package/src/database/pool/base-methods-forward.js +52 -0
- package/src/database/pool/base.js +380 -0
- package/src/database/pool/single-multi-use.js +118 -0
- package/src/database/query/alter-table-base.js +104 -0
- package/src/database/query/base.js +49 -0
- package/src/database/query/create-database-base.js +42 -0
- package/src/database/query/create-index-base.js +117 -0
- package/src/database/query/create-table-base.js +205 -0
- package/src/database/query/delete-base.js +19 -0
- package/src/database/query/drop-database-base.js +38 -0
- package/src/database/query/drop-table-base.js +58 -0
- package/src/database/query/from-base.js +36 -0
- package/src/database/query/from-plain.js +16 -0
- package/src/database/query/from-table.js +18 -0
- package/src/database/query/index.js +533 -0
- package/src/database/query/insert-base.js +172 -0
- package/src/database/query/join-base.js +43 -0
- package/src/database/query/join-object.js +167 -0
- package/src/database/query/join-plain.js +18 -0
- package/src/database/query/join-tracker.js +93 -0
- package/src/database/query/model-class-query.js +1577 -0
- package/src/database/query/order-base.js +33 -0
- package/src/database/query/order-column.js +77 -0
- package/src/database/query/order-plain.js +28 -0
- package/src/database/query/preloader/belongs-to.js +267 -0
- package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
- package/src/database/query/preloader/has-many.js +316 -0
- package/src/database/query/preloader/has-one.js +123 -0
- package/src/database/query/preloader/selection.js +152 -0
- package/src/database/query/preloader.js +201 -0
- package/src/database/query/query-data.js +305 -0
- package/src/database/query/select-base.js +30 -0
- package/src/database/query/select-plain.js +18 -0
- package/src/database/query/select-table-and-column.js +28 -0
- package/src/database/query/update-base.js +41 -0
- package/src/database/query/upsert-base.js +103 -0
- package/src/database/query/where-base.js +38 -0
- package/src/database/query/where-combinator.js +31 -0
- package/src/database/query/where-hash.js +77 -0
- package/src/database/query/where-model-class-hash.js +505 -0
- package/src/database/query/where-not.js +23 -0
- package/src/database/query/where-plain.js +20 -0
- package/src/database/query/with-count.js +219 -0
- package/src/database/query-parser/base-query-parser.js +40 -0
- package/src/database/query-parser/from-parser.js +49 -0
- package/src/database/query-parser/group-parser.js +55 -0
- package/src/database/query-parser/joins-parser.js +37 -0
- package/src/database/query-parser/limit-parser.js +77 -0
- package/src/database/query-parser/options.js +94 -0
- package/src/database/query-parser/order-parser.js +45 -0
- package/src/database/query-parser/select-parser.js +67 -0
- package/src/database/query-parser/where-parser.js +46 -0
- package/src/database/record/acts-as-list.js +374 -0
- package/src/database/record/attachments/download.js +49 -0
- package/src/database/record/attachments/handle.js +188 -0
- package/src/database/record/attachments/normalize-input.js +213 -0
- package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
- package/src/database/record/attachments/storage-drivers/native.js +146 -0
- package/src/database/record/attachments/storage-drivers/s3.js +245 -0
- package/src/database/record/attachments/store.js +591 -0
- package/src/database/record/index.js +4094 -0
- package/src/database/record/instance-relationships/base.js +289 -0
- package/src/database/record/instance-relationships/belongs-to.js +84 -0
- package/src/database/record/instance-relationships/has-many.js +284 -0
- package/src/database/record/instance-relationships/has-one.js +117 -0
- package/src/database/record/record-not-found-error.js +3 -0
- package/src/database/record/relationships/base.js +195 -0
- package/src/database/record/relationships/belongs-to.js +57 -0
- package/src/database/record/relationships/has-many.js +46 -0
- package/src/database/record/relationships/has-one.js +46 -0
- package/src/database/record/state-machine.js +278 -0
- package/src/database/record/user-module.js +43 -0
- package/src/database/record/validators/base.js +27 -0
- package/src/database/record/validators/format.js +50 -0
- package/src/database/record/validators/presence.js +24 -0
- package/src/database/record/validators/uniqueness.js +124 -0
- package/src/database/table-data/index.js +241 -0
- package/src/database/table-data/table-column.js +416 -0
- package/src/database/table-data/table-foreign-key.js +69 -0
- package/src/database/table-data/table-index.js +46 -0
- package/src/database/table-data/table-reference.js +13 -0
- package/src/database/use-database.js +48 -0
- package/src/environment-handlers/base.js +561 -0
- package/src/environment-handlers/browser.js +338 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
- package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
- package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
- package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
- package/src/environment-handlers/node/cli/commands/console.js +149 -0
- package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
- package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
- package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
- package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
- package/src/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
- package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
- package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
- package/src/environment-handlers/node/cli/commands/init.js +68 -0
- package/src/environment-handlers/node/cli/commands/routes.js +63 -0
- package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
- package/src/environment-handlers/node/cli/commands/runner.js +84 -0
- package/src/environment-handlers/node/cli/commands/server.js +151 -0
- package/src/environment-handlers/node/cli/commands/test.js +118 -0
- package/src/environment-handlers/node.js +887 -0
- package/src/error-logger.js +30 -0
- package/src/frontend-model-controller.js +3491 -0
- package/src/frontend-model-resource/base-resource.js +935 -0
- package/src/frontend-models/base.js +4004 -0
- package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
- package/src/frontend-models/event-hook-models.js +49 -0
- package/src/frontend-models/model-registry.js +28 -0
- package/src/frontend-models/outgoing-event-buffer.js +51 -0
- package/src/frontend-models/preloader.js +169 -0
- package/src/frontend-models/query.js +2245 -0
- package/src/frontend-models/resource-config-validation.js +56 -0
- package/src/frontend-models/resource-definition.js +399 -0
- package/src/frontend-models/transport-serialization.js +369 -0
- package/src/frontend-models/use-created-event.js +21 -0
- package/src/frontend-models/use-destroyed-event.js +148 -0
- package/src/frontend-models/use-model-class-event.js +164 -0
- package/src/frontend-models/use-updated-event.js +152 -0
- package/src/frontend-models/websocket-channel.js +494 -0
- package/src/frontend-models/websocket-publishers.js +224 -0
- package/src/http-client/header.js +17 -0
- package/src/http-client/index.js +139 -0
- package/src/http-client/request.js +94 -0
- package/src/http-client/response.js +151 -0
- package/src/http-client/websocket-client.js +27 -0
- package/src/http-server/client/index.js +507 -0
- package/src/http-server/client/params-to-object.js +152 -0
- package/src/http-server/client/request-buffer/form-data-part.js +139 -0
- package/src/http-server/client/request-buffer/header.js +19 -0
- package/src/http-server/client/request-buffer/index.js +535 -0
- package/src/http-server/client/request-parser.js +195 -0
- package/src/http-server/client/request-runner.js +321 -0
- package/src/http-server/client/request-timing.js +171 -0
- package/src/http-server/client/request.js +114 -0
- package/src/http-server/client/response.js +251 -0
- package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
- package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
- package/src/http-server/client/websocket-request.js +147 -0
- package/src/http-server/client/websocket-session.js +1755 -0
- package/src/http-server/cookie.js +245 -0
- package/src/http-server/development-reloader.js +240 -0
- package/src/http-server/index.js +561 -0
- package/src/http-server/remote-address.js +77 -0
- package/src/http-server/server-client.js +222 -0
- package/src/http-server/server-lock.js +178 -0
- package/src/http-server/websocket-channel-subscribers.js +110 -0
- package/src/http-server/websocket-channel.js +137 -0
- package/src/http-server/websocket-connection.js +118 -0
- package/src/http-server/websocket-event-log-store.js +433 -0
- package/src/http-server/websocket-events-host.js +170 -0
- package/src/http-server/websocket-events.js +50 -0
- package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
- package/src/http-server/worker-handler/in-process.js +155 -0
- package/src/http-server/worker-handler/index.js +370 -0
- package/src/http-server/worker-handler/worker-script.js +6 -0
- package/src/http-server/worker-handler/worker-thread.js +286 -0
- package/src/initializer.js +39 -0
- package/src/jobs/.gitkeep +1 -0
- package/src/jobs/mail-delivery.js +22 -0
- package/src/logger/base-logger.js +34 -0
- package/src/logger/console-logger.js +28 -0
- package/src/logger/file-logger.js +36 -0
- package/src/logger/outputs/array-output.js +50 -0
- package/src/logger/outputs/console-output.js +32 -0
- package/src/logger/outputs/file-output.js +55 -0
- package/src/logger/outputs/stdout-output.js +64 -0
- package/src/logger.js +507 -0
- package/src/mailer/backends/smtp.js +197 -0
- package/src/mailer/base.js +337 -0
- package/src/mailer/delivery.js +70 -0
- package/src/mailer/index.js +24 -0
- package/src/mailer.js +15 -0
- package/src/plugins/sqljs-wasm-route-controller.js +70 -0
- package/src/plugins/sqljs-wasm-route.js +71 -0
- package/src/record-payload-values.js +83 -0
- package/src/routes/app-routes.js +17 -0
- package/src/routes/base-route.js +133 -0
- package/src/routes/basic-route.js +109 -0
- package/src/routes/built-in/debug/controller.js +12 -0
- package/src/routes/built-in/errors/controller.js +7 -0
- package/src/routes/built-in/errors/not-found.ejs +1 -0
- package/src/routes/get-route.js +75 -0
- package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
- package/src/routes/index.js +50 -0
- package/src/routes/namespace-route.js +51 -0
- package/src/routes/plugin-routes.js +141 -0
- package/src/routes/post-route.js +74 -0
- package/src/routes/resolver.js +535 -0
- package/src/routes/resource-route.js +154 -0
- package/src/routes/root-route.js +11 -0
- package/src/templates/configuration.js +61 -0
- package/src/templates/generate-migration.js +11 -0
- package/src/templates/generate-model.js +6 -0
- package/src/templates/routes.js +11 -0
- package/src/testing/base-expect.js +17 -0
- package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
- package/src/testing/browser-test-app.js +32 -0
- package/src/testing/expect-to-change.js +55 -0
- package/src/testing/expect-utils.js +269 -0
- package/src/testing/expect.js +763 -0
- package/src/testing/request-client.js +90 -0
- package/src/testing/test-files-finder.js +364 -0
- package/src/testing/test-filter-parser.js +198 -0
- package/src/testing/test-runner.js +1168 -0
- package/src/testing/test-suite-splitter.js +177 -0
- package/src/testing/test.js +370 -0
- package/src/types/external-modules.d.ts +57 -0
- package/src/utils/backtrace-cleaner-node.js +87 -0
- package/src/utils/backtrace-cleaner.js +266 -0
- package/src/utils/ensure-error.js +15 -0
- package/src/utils/event-emitter.js +8 -0
- package/src/utils/file-exists.js +18 -0
- package/src/utils/format-value.js +101 -0
- package/src/utils/model-scope.js +56 -0
- package/src/utils/nest-callbacks.js +22 -0
- package/src/utils/plain-object.js +14 -0
- package/src/utils/ransack.js +859 -0
- package/src/utils/rest-args-error.js +14 -0
- package/src/utils/singularize-model-name.js +18 -0
- package/src/utils/split-sql-statements.js +88 -0
- package/src/utils/to-import-specifier.js +53 -0
- package/src/utils/with-tracked-stack-async-hooks.js +103 -0
- package/src/utils/with-tracked-stack.js +38 -0
- package/src/velocious-error.js +34 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {randomUUID} from "node:crypto"
|
|
4
|
+
import net from "node:net"
|
|
5
|
+
import timeout from "awaitery/build/timeout.js"
|
|
6
|
+
|
|
7
|
+
import JsonSocket from "../background-jobs/json-socket.js"
|
|
8
|
+
import EventEmitter from "../utils/event-emitter.js"
|
|
9
|
+
|
|
10
|
+
const DEFAULT_RECONNECT_DELAY_MS = 1000
|
|
11
|
+
const MAX_RECONNECT_DELAY_MS = 30_000
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* BeaconBroadcastHandler type.
|
|
15
|
+
* @typedef {function(import("./types.js").BeaconBroadcastMessage): void} BeaconBroadcastHandler
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* BeaconClient connects to a `velocious beacon` daemon and exchanges
|
|
20
|
+
* broadcasts with all peer processes connected to the same daemon.
|
|
21
|
+
*
|
|
22
|
+
* Lifecycle:
|
|
23
|
+
* const client = new BeaconClient({host, port, peerType: "server"})
|
|
24
|
+
* await client.connect() // resolves on first successful connect
|
|
25
|
+
* await client.waitForReady({timeoutMs: 1000}) // resolves after the daemon hello-ack
|
|
26
|
+
* client.onBroadcast((message) => { ... }) // every fan-out
|
|
27
|
+
* client.publish({channel, broadcastParams, body})
|
|
28
|
+
* await client.close()
|
|
29
|
+
*
|
|
30
|
+
* Reconnect: on socket close (without an explicit `close()` call) the
|
|
31
|
+
* client schedules a reconnect with exponential backoff. While the
|
|
32
|
+
* underlying socket is down, `publish(...)` returns false and the
|
|
33
|
+
* caller can fall back to local-only delivery; subsequent reconnects do
|
|
34
|
+
* not replay missed publishes (Beacon is pubsub, not a queue).
|
|
35
|
+
*/
|
|
36
|
+
export default class BeaconClient extends EventEmitter {
|
|
37
|
+
/**
|
|
38
|
+
* Runs constructor.
|
|
39
|
+
* @param {object} args - Options.
|
|
40
|
+
* @param {string} args.host - Beacon host.
|
|
41
|
+
* @param {number} args.port - Beacon port.
|
|
42
|
+
* @param {string} [args.peerType] - Optional human-readable peer label.
|
|
43
|
+
* @param {string} [args.peerId] - Optional explicit peer id (defaults to a random UUID).
|
|
44
|
+
* @param {number} [args.reconnectDelayMs] - Starting reconnect delay in ms.
|
|
45
|
+
* @param {number} [args.maxReconnectDelayMs] - Maximum reconnect delay in ms.
|
|
46
|
+
*/
|
|
47
|
+
constructor({host, port, peerType, peerId, reconnectDelayMs, maxReconnectDelayMs}) {
|
|
48
|
+
super()
|
|
49
|
+
this.host = host
|
|
50
|
+
this.port = port
|
|
51
|
+
this.peerType = peerType
|
|
52
|
+
this.peerId = peerId || randomUUID()
|
|
53
|
+
this._initialReconnectDelayMs = reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS
|
|
54
|
+
this._maxReconnectDelayMs = maxReconnectDelayMs ?? MAX_RECONNECT_DELAY_MS
|
|
55
|
+
this._reconnectDelayMs = this._initialReconnectDelayMs
|
|
56
|
+
/**
|
|
57
|
+
* Narrows the runtime value to the documented type.
|
|
58
|
+
@type {JsonSocket | undefined} */
|
|
59
|
+
this._jsonSocket = undefined
|
|
60
|
+
/**
|
|
61
|
+
* Narrows the runtime value to the documented type.
|
|
62
|
+
@type {net.Socket | undefined} */
|
|
63
|
+
this._socket = undefined
|
|
64
|
+
this._connected = false
|
|
65
|
+
this._ready = false
|
|
66
|
+
this._closed = false
|
|
67
|
+
/**
|
|
68
|
+
* Narrows the runtime value to the documented type.
|
|
69
|
+
@type {NodeJS.Timeout | undefined} */
|
|
70
|
+
this._reconnectTimer = undefined
|
|
71
|
+
/**
|
|
72
|
+
* Narrows the runtime value to the documented type.
|
|
73
|
+
@type {Promise<void> | undefined} */
|
|
74
|
+
this._connectPromise = undefined
|
|
75
|
+
/**
|
|
76
|
+
* Last socket error observed while connected, surfaced as the disconnect reason.
|
|
77
|
+
* @type {Error | undefined}
|
|
78
|
+
*/
|
|
79
|
+
this._lastSocketError = undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Runs get peer id.
|
|
84
|
+
* @returns {string} - The peer id sent on the hello handshake.
|
|
85
|
+
*/
|
|
86
|
+
getPeerId() { return this.peerId }
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Runs is connected.
|
|
90
|
+
* @returns {boolean} - Whether the underlying socket is currently connected.
|
|
91
|
+
*/
|
|
92
|
+
isConnected() { return this._connected }
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Runs is ready.
|
|
96
|
+
* @returns {boolean} - Whether the daemon has acknowledged this peer registration.
|
|
97
|
+
*/
|
|
98
|
+
isReady() { return this._ready }
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Resolves on the first successful connect. Subsequent calls return
|
|
102
|
+
* the same promise. Subsequent reconnects after a drop are silent —
|
|
103
|
+
* use `on("connect")` / `on("disconnect", reason)` to observe them.
|
|
104
|
+
* The `disconnect` listener receives an `Error` reason: either the
|
|
105
|
+
* underlying socket error, or `Error("Beacon broker disconnected")`
|
|
106
|
+
* when the close had no preceding error.
|
|
107
|
+
* @returns {Promise<void>}
|
|
108
|
+
*/
|
|
109
|
+
async connect() {
|
|
110
|
+
if (this._closed) throw new Error("BeaconClient has been closed")
|
|
111
|
+
if (this._connectPromise) return await this._connectPromise
|
|
112
|
+
|
|
113
|
+
this._connectPromise = new Promise((resolve, reject) => {
|
|
114
|
+
const onConnect = () => {
|
|
115
|
+
this.off("connect", onConnect)
|
|
116
|
+
this.off("connect-error", onError)
|
|
117
|
+
resolve()
|
|
118
|
+
}
|
|
119
|
+
const onError = (/**
|
|
120
|
+
* Narrows the runtime value to the documented type.
|
|
121
|
+
@type {Error} */ error) => {
|
|
122
|
+
this.off("connect", onConnect)
|
|
123
|
+
this.off("connect-error", onError)
|
|
124
|
+
reject(error)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this.on("connect", onConnect)
|
|
128
|
+
this.on("connect-error", onError)
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
this._openSocket()
|
|
132
|
+
|
|
133
|
+
return await this._connectPromise
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Resolves after the Beacon daemon has acknowledged this peer's
|
|
138
|
+
* hello handshake. This is stronger than `isConnected()`: connected
|
|
139
|
+
* means the TCP socket is open, ready means the daemon has registered
|
|
140
|
+
* the peer and broadcasts can be routed through the bus.
|
|
141
|
+
* @param {object} [args] - Options.
|
|
142
|
+
* @param {number} [args.timeoutMs] - Optional timeout in milliseconds.
|
|
143
|
+
* @returns {Promise<void>}
|
|
144
|
+
*/
|
|
145
|
+
async waitForReady({timeoutMs} = {}) {
|
|
146
|
+
if (this._ready) return
|
|
147
|
+
|
|
148
|
+
/** Cleanup. @type {() => void} */
|
|
149
|
+
let cleanup = () => {}
|
|
150
|
+
const readyPromise = new Promise((resolve) => {
|
|
151
|
+
const onReady = () => {
|
|
152
|
+
cleanup()
|
|
153
|
+
resolve(undefined)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
cleanup = () => this.off("ready", onReady)
|
|
157
|
+
this.on("ready", onReady)
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
if (typeof timeoutMs === "number") {
|
|
162
|
+
await timeout({timeout: timeoutMs}, async () => {
|
|
163
|
+
await readyPromise
|
|
164
|
+
})
|
|
165
|
+
} else {
|
|
166
|
+
await readyPromise
|
|
167
|
+
}
|
|
168
|
+
} finally {
|
|
169
|
+
cleanup()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Publishes a broadcast message to all peers (including this one,
|
|
175
|
+
* unless the daemon is restarted mid-publish).
|
|
176
|
+
* @param {object} args - Broadcast args.
|
|
177
|
+
* @param {string} args.channel - Channel name.
|
|
178
|
+
* @param {Record<string, ?>} args.broadcastParams - Routing params.
|
|
179
|
+
* @param {?} args.body - Message body.
|
|
180
|
+
* @returns {boolean} - True if the publish was written to the socket. False if the client is currently disconnected.
|
|
181
|
+
*/
|
|
182
|
+
publish({channel, broadcastParams, body}) {
|
|
183
|
+
if (!this._connected || !this._jsonSocket) return false
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Message.
|
|
187
|
+
@type {import("./types.js").BeaconBroadcastMessage} */
|
|
188
|
+
const message = {
|
|
189
|
+
type: "broadcast",
|
|
190
|
+
channel,
|
|
191
|
+
broadcastParams,
|
|
192
|
+
body,
|
|
193
|
+
originPeerId: this.peerId
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
this._jsonSocket.send(message)
|
|
198
|
+
return true
|
|
199
|
+
} catch {
|
|
200
|
+
return false
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Registers a handler called once for every `broadcast` message
|
|
206
|
+
* received from the daemon (including echoes of this client's own
|
|
207
|
+
* publishes — synapse-style fan-out).
|
|
208
|
+
* @param {BeaconBroadcastHandler} handler - Handler.
|
|
209
|
+
* @returns {() => void} - Unregister function.
|
|
210
|
+
*/
|
|
211
|
+
onBroadcast(handler) {
|
|
212
|
+
this.on("broadcast", handler)
|
|
213
|
+
return () => this.off("broadcast", handler)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Runs close.
|
|
218
|
+
* @returns {Promise<void>} - Resolves once the socket is closed.
|
|
219
|
+
*/
|
|
220
|
+
async close() {
|
|
221
|
+
this._closed = true
|
|
222
|
+
|
|
223
|
+
if (this._reconnectTimer) {
|
|
224
|
+
clearTimeout(this._reconnectTimer)
|
|
225
|
+
this._reconnectTimer = undefined
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (this._socket) {
|
|
229
|
+
const socket = this._socket
|
|
230
|
+
|
|
231
|
+
await new Promise((resolve) => {
|
|
232
|
+
socket.once("close", () => resolve(undefined))
|
|
233
|
+
socket.end()
|
|
234
|
+
})
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Runs open socket.
|
|
240
|
+
* @returns {void}
|
|
241
|
+
*/
|
|
242
|
+
_openSocket() {
|
|
243
|
+
if (this._closed) return
|
|
244
|
+
|
|
245
|
+
const socket = net.createConnection({host: this.host, port: this.port})
|
|
246
|
+
this._socket = socket
|
|
247
|
+
const jsonSocket = new JsonSocket(socket)
|
|
248
|
+
this._jsonSocket = jsonSocket
|
|
249
|
+
|
|
250
|
+
socket.on("connect", () => {
|
|
251
|
+
this._connected = true
|
|
252
|
+
this._ready = false
|
|
253
|
+
this._reconnectDelayMs = this._initialReconnectDelayMs
|
|
254
|
+
|
|
255
|
+
jsonSocket.send({
|
|
256
|
+
type: "hello",
|
|
257
|
+
role: "client",
|
|
258
|
+
peerId: this.peerId,
|
|
259
|
+
peerType: this.peerType
|
|
260
|
+
})
|
|
261
|
+
|
|
262
|
+
this.emit("connect")
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
jsonSocket.on("message", (/**
|
|
266
|
+
* Narrows the runtime value to the documented type.
|
|
267
|
+
@type {import("./types.js").BeaconSocketMessage} */ message) => {
|
|
268
|
+
if (message?.type === "hello-ack" && message.peerId === this.peerId) {
|
|
269
|
+
this._ready = true
|
|
270
|
+
this.emit("ready")
|
|
271
|
+
} else if (message?.type === "broadcast") {
|
|
272
|
+
this.emit("broadcast", message)
|
|
273
|
+
}
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
jsonSocket.on("error", (error) => {
|
|
277
|
+
if (!this._connected) {
|
|
278
|
+
// Initial connect failed — surface to `connect()`'s promise via `connect-error`.
|
|
279
|
+
// No `error` emit: that channel is for established-session errors; the
|
|
280
|
+
// initial-connect path is owned by `connect-error`.
|
|
281
|
+
this.emit("connect-error", error)
|
|
282
|
+
} else {
|
|
283
|
+
// Established session error. Cache so the upcoming `close` event can
|
|
284
|
+
// surface it as the disconnect reason.
|
|
285
|
+
this._lastSocketError = error
|
|
286
|
+
this.emit("error", error)
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
jsonSocket.on("close", () => {
|
|
291
|
+
const wasConnected = this._connected
|
|
292
|
+
|
|
293
|
+
this._connected = false
|
|
294
|
+
this._ready = false
|
|
295
|
+
this._jsonSocket = undefined
|
|
296
|
+
this._socket = undefined
|
|
297
|
+
|
|
298
|
+
// Explicit close() sets `_closed = true` before ending the socket.
|
|
299
|
+
// Don't surface user-initiated teardown as a disconnect "error" —
|
|
300
|
+
// only network-driven drops should be reported.
|
|
301
|
+
if (wasConnected && !this._closed) {
|
|
302
|
+
const reason = this._lastSocketError || new Error("Beacon broker disconnected")
|
|
303
|
+
|
|
304
|
+
this.emit("disconnect", reason)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
this._lastSocketError = undefined
|
|
308
|
+
|
|
309
|
+
if (this._closed) return
|
|
310
|
+
|
|
311
|
+
this._scheduleReconnect()
|
|
312
|
+
})
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Runs schedule reconnect.
|
|
317
|
+
* @returns {void}
|
|
318
|
+
*/
|
|
319
|
+
_scheduleReconnect() {
|
|
320
|
+
if (this._reconnectTimer) return
|
|
321
|
+
|
|
322
|
+
const delay = this._reconnectDelayMs
|
|
323
|
+
|
|
324
|
+
this._reconnectTimer = setTimeout(() => {
|
|
325
|
+
this._reconnectTimer = undefined
|
|
326
|
+
this._reconnectDelayMs = Math.min(delay * 2, this._maxReconnectDelayMs)
|
|
327
|
+
this._openSocket()
|
|
328
|
+
}, delay)
|
|
329
|
+
}
|
|
330
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Module-level broker singleton for in-process Beacon mode.
|
|
5
|
+
*
|
|
6
|
+
* Every `InProcessBeaconClient` registers itself here on `connect()` and
|
|
7
|
+
* unregisters on `close()`. `publish(message)` schedules a microtask
|
|
8
|
+
* fan-out to every registered peer's `_receiveBroadcast(message)`. The
|
|
9
|
+
* microtask boundary keeps "publish, then receive" ordering safe even
|
|
10
|
+
* when the publisher and a subscriber are the same client — without it,
|
|
11
|
+
* a synchronous fan-out could re-enter the caller mid-publish if a
|
|
12
|
+
* broadcast handler synchronously published again.
|
|
13
|
+
*
|
|
14
|
+
* Designed for two scenarios:
|
|
15
|
+
* 1. Tests with multiple `Configuration` instances in one process
|
|
16
|
+
* (no TCP socket setup, deterministic ordering via microtasks).
|
|
17
|
+
* 2. Single-process production deployments that want the same
|
|
18
|
+
* `broadcastToChannel` ergonomics without running the daemon.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Defines this typedef.
|
|
23
|
+
@typedef {{_receiveBroadcast: (message: import("./types.js").BeaconBroadcastMessage) => void}} InProcessPeer */
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Peers.
|
|
27
|
+
@type {Set<InProcessPeer>} */
|
|
28
|
+
const peers = new Set()
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Registers a peer with the broker. Returns an unregister function.
|
|
32
|
+
* @param {InProcessPeer} peer - Peer instance.
|
|
33
|
+
* @returns {() => void} - Unregister function.
|
|
34
|
+
*/
|
|
35
|
+
export function registerInProcessPeer(peer) {
|
|
36
|
+
peers.add(peer)
|
|
37
|
+
|
|
38
|
+
return () => {
|
|
39
|
+
peers.delete(peer)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Schedules a fan-out of the given message to every registered peer.
|
|
45
|
+
* Each delivery is its own microtask so handlers run in the order peers
|
|
46
|
+
* registered, but never synchronously inside the publish call.
|
|
47
|
+
* @param {import("./types.js").BeaconBroadcastMessage} message - Broadcast message.
|
|
48
|
+
* @returns {void}
|
|
49
|
+
*/
|
|
50
|
+
export function publishToInProcessPeers(message) {
|
|
51
|
+
for (const peer of peers) {
|
|
52
|
+
queueMicrotask(() => {
|
|
53
|
+
try {
|
|
54
|
+
peer._receiveBroadcast(message)
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// Mirrors the daemon's per-peer fan-out resilience: a thrown
|
|
57
|
+
// handler on one peer must not prevent delivery to others. The
|
|
58
|
+
// caller's framework-error path covers higher-level reporting.
|
|
59
|
+
console.error("In-process Beacon peer threw during broadcast delivery:", error)
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Runs the getInProcessPeerCount helper.
|
|
67
|
+
* @returns {number} - Current peer count. Exposed for diagnostics and tests.
|
|
68
|
+
*/
|
|
69
|
+
export function getInProcessPeerCount() {
|
|
70
|
+
return peers.size
|
|
71
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import {randomUUID} from "node:crypto"
|
|
4
|
+
|
|
5
|
+
import EventEmitter from "../utils/event-emitter.js"
|
|
6
|
+
import {publishToInProcessPeers, registerInProcessPeer} from "./in-process-broker.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* BeaconBroadcastHandler type.
|
|
10
|
+
* @typedef {function(import("./types.js").BeaconBroadcastMessage): void} BeaconBroadcastHandler
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* In-process counterpart to `BeaconClient`. Registers with the
|
|
15
|
+
* module-level `in-process-broker` singleton so peers in the same
|
|
16
|
+
* process exchange broadcasts without ever touching TCP. Implements the
|
|
17
|
+
* same external surface as `BeaconClient` (`connect`, `publish`,
|
|
18
|
+
* `onBroadcast`, `isConnected`, `getPeerId`, `close`) so
|
|
19
|
+
* `Configuration` can use either client interchangeably.
|
|
20
|
+
*
|
|
21
|
+
* Lifecycle differs from `BeaconClient` in two intentional ways:
|
|
22
|
+
* - `connect()` and `waitForReady()` resolve immediately; there is no broker to wait for.
|
|
23
|
+
* - There is no reconnect loop and no `connect-error` / `disconnect`
|
|
24
|
+
* event surface, because nothing can fail.
|
|
25
|
+
*/
|
|
26
|
+
export default class InProcessBeaconClient extends EventEmitter {
|
|
27
|
+
/**
|
|
28
|
+
* Runs constructor.
|
|
29
|
+
* @param {object} [args] - Options.
|
|
30
|
+
* @param {string} [args.peerType] - Optional human-readable peer label.
|
|
31
|
+
* @param {string} [args.peerId] - Optional explicit peer id (defaults to a random UUID).
|
|
32
|
+
*/
|
|
33
|
+
constructor({peerType, peerId} = {}) {
|
|
34
|
+
super()
|
|
35
|
+
this.peerType = peerType
|
|
36
|
+
this.peerId = peerId || randomUUID()
|
|
37
|
+
this._connected = false
|
|
38
|
+
/**
|
|
39
|
+
* Narrows the runtime value to the documented type.
|
|
40
|
+
@type {(() => void) | undefined} */
|
|
41
|
+
this._unregister = undefined
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Runs get peer id.
|
|
46
|
+
* @returns {string} - Peer id.
|
|
47
|
+
*/
|
|
48
|
+
getPeerId() { return this.peerId }
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Runs is connected.
|
|
52
|
+
* @returns {boolean} - Whether the peer is registered with the broker.
|
|
53
|
+
*/
|
|
54
|
+
isConnected() { return this._connected }
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Runs is ready.
|
|
58
|
+
* @returns {boolean} - Whether the peer is ready to publish through the broker.
|
|
59
|
+
*/
|
|
60
|
+
isReady() { return this._connected }
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Registers with the in-process broker. Idempotent.
|
|
64
|
+
* @returns {Promise<void>}
|
|
65
|
+
*/
|
|
66
|
+
async connect() {
|
|
67
|
+
if (this._connected) return
|
|
68
|
+
|
|
69
|
+
this._unregister = registerInProcessPeer(this)
|
|
70
|
+
this._connected = true
|
|
71
|
+
this.emit("connect")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* In-process peers are ready as soon as they are connected.
|
|
76
|
+
* @returns {Promise<void>}
|
|
77
|
+
*/
|
|
78
|
+
async waitForReady() {
|
|
79
|
+
if (!this._connected) await this.connect()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Publishes a broadcast to every registered peer (including this
|
|
84
|
+
* one). Returns false if `connect()` hasn't been called yet, matching
|
|
85
|
+
* `BeaconClient` semantics.
|
|
86
|
+
* @param {object} args - Broadcast args.
|
|
87
|
+
* @param {string} args.channel - Channel name.
|
|
88
|
+
* @param {Record<string, ?>} args.broadcastParams - Routing params.
|
|
89
|
+
* @param {?} args.body - Message body.
|
|
90
|
+
* @returns {boolean} - True when the broadcast was queued.
|
|
91
|
+
*/
|
|
92
|
+
publish({channel, broadcastParams, body}) {
|
|
93
|
+
if (!this._connected) return false
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Message.
|
|
97
|
+
@type {import("./types.js").BeaconBroadcastMessage} */
|
|
98
|
+
const message = {
|
|
99
|
+
type: "broadcast",
|
|
100
|
+
channel,
|
|
101
|
+
broadcastParams,
|
|
102
|
+
body,
|
|
103
|
+
originPeerId: this.peerId
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
publishToInProcessPeers(message)
|
|
107
|
+
|
|
108
|
+
return true
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Registers a handler called once for every broadcast received.
|
|
113
|
+
* @param {BeaconBroadcastHandler} handler - Handler.
|
|
114
|
+
* @returns {() => void} - Unregister function.
|
|
115
|
+
*/
|
|
116
|
+
onBroadcast(handler) {
|
|
117
|
+
this.on("broadcast", handler)
|
|
118
|
+
return () => this.off("broadcast", handler)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Receives a broadcast from the broker. Called by `in-process-broker`.
|
|
123
|
+
* @param {import("./types.js").BeaconBroadcastMessage} message - Broadcast message.
|
|
124
|
+
* @returns {void}
|
|
125
|
+
*/
|
|
126
|
+
_receiveBroadcast(message) {
|
|
127
|
+
this.emit("broadcast", message)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Runs close.
|
|
132
|
+
* @returns {Promise<void>} - Unregisters from the broker.
|
|
133
|
+
*/
|
|
134
|
+
async close() {
|
|
135
|
+
if (this._unregister) this._unregister()
|
|
136
|
+
this._unregister = undefined
|
|
137
|
+
this._connected = false
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
import net from "net"
|
|
4
|
+
|
|
5
|
+
import JsonSocket from "../background-jobs/json-socket.js"
|
|
6
|
+
import Logger from "../logger.js"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Beacon broker daemon.
|
|
10
|
+
*
|
|
11
|
+
* Accepts JsonSocket connections from any number of peer processes and
|
|
12
|
+
* fans every `broadcast` message out to every connected peer.
|
|
13
|
+
* Intentionally stateless — there is no persistence, no replay, no
|
|
14
|
+
* channel-name filtering on the daemon. Per-process subscription
|
|
15
|
+
* matching (already implemented by `_broadcastToChannelLocal`) does the
|
|
16
|
+
* filtering.
|
|
17
|
+
*/
|
|
18
|
+
export default class BeaconServer {
|
|
19
|
+
/**
|
|
20
|
+
* Runs constructor.
|
|
21
|
+
* @param {object} args - Options.
|
|
22
|
+
* @param {import("../configuration.js").default} args.configuration - Configuration.
|
|
23
|
+
* @param {string} [args.host] - Hostname to bind. Defaults to the configured beacon host.
|
|
24
|
+
* @param {number} [args.port] - Port to bind. Defaults to the configured beacon port.
|
|
25
|
+
*/
|
|
26
|
+
constructor({configuration, host, port}) {
|
|
27
|
+
this.configuration = configuration
|
|
28
|
+
const config = configuration.getBeaconConfig()
|
|
29
|
+
this.host = host || config.host
|
|
30
|
+
this.port = typeof port === "number" ? port : config.port
|
|
31
|
+
this.logger = new Logger(this)
|
|
32
|
+
/**
|
|
33
|
+
* Narrows the runtime value to the documented type.
|
|
34
|
+
@type {Set<JsonSocket>} */
|
|
35
|
+
this.peers = new Set()
|
|
36
|
+
/**
|
|
37
|
+
* Narrows the runtime value to the documented type.
|
|
38
|
+
@type {net.Server | undefined} */
|
|
39
|
+
this.server = undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Runs start.
|
|
44
|
+
* @returns {Promise<void>} - Resolves when listening.
|
|
45
|
+
*/
|
|
46
|
+
async start() {
|
|
47
|
+
const server = net.createServer((socket) => this._handleConnection(socket))
|
|
48
|
+
this.server = server
|
|
49
|
+
|
|
50
|
+
await new Promise((resolve, reject) => {
|
|
51
|
+
server.once("error", reject)
|
|
52
|
+
server.listen(this.port, this.host, () => resolve(undefined))
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const address = server.address()
|
|
56
|
+
|
|
57
|
+
if (address && typeof address === "object") {
|
|
58
|
+
this.port = address.port
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Runs stop.
|
|
64
|
+
* @returns {Promise<void>} - Resolves when closed.
|
|
65
|
+
*/
|
|
66
|
+
async stop() {
|
|
67
|
+
for (const peer of this.peers) {
|
|
68
|
+
peer.close()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!this.server) return
|
|
72
|
+
|
|
73
|
+
const {server} = this
|
|
74
|
+
|
|
75
|
+
await new Promise((resolve) => server.close(() => resolve(undefined)))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Runs get port.
|
|
80
|
+
* @returns {number} - Bound port.
|
|
81
|
+
*/
|
|
82
|
+
getPort() {
|
|
83
|
+
return this.port
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Runs get peer count.
|
|
88
|
+
* @returns {number} - Number of connected peers.
|
|
89
|
+
*/
|
|
90
|
+
getPeerCount() {
|
|
91
|
+
return this.peers.size
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Runs handle connection.
|
|
96
|
+
* @param {import("net").Socket} socket - Socket.
|
|
97
|
+
* @returns {void}
|
|
98
|
+
*/
|
|
99
|
+
_handleConnection(socket) {
|
|
100
|
+
const jsonSocket = new JsonSocket(socket)
|
|
101
|
+
/**
|
|
102
|
+
* Defines peerId.
|
|
103
|
+
@type {string | undefined} */
|
|
104
|
+
let peerId
|
|
105
|
+
|
|
106
|
+
const cleanup = () => {
|
|
107
|
+
this.peers.delete(jsonSocket)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
jsonSocket.on("close", cleanup)
|
|
111
|
+
jsonSocket.on("error", (error) => {
|
|
112
|
+
this.logger.warn(() => ["Beacon connection error:", error])
|
|
113
|
+
cleanup()
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Handles a beacon socket message.
|
|
118
|
+
* @param {import("./types.js").BeaconSocketMessage} message - Socket message.
|
|
119
|
+
*/
|
|
120
|
+
jsonSocket.on("message", (message) => {
|
|
121
|
+
if (!peerId && message?.type === "hello") {
|
|
122
|
+
peerId = message.peerId
|
|
123
|
+
this.peers.add(jsonSocket)
|
|
124
|
+
jsonSocket.send({type: "hello-ack", peerId})
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (message?.type === "broadcast") {
|
|
129
|
+
this._fanOut(message)
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Runs fan out.
|
|
136
|
+
* @param {import("./types.js").BeaconBroadcastMessage} message - Broadcast message.
|
|
137
|
+
* @returns {void}
|
|
138
|
+
*/
|
|
139
|
+
_fanOut(message) {
|
|
140
|
+
for (const peer of this.peers) {
|
|
141
|
+
try {
|
|
142
|
+
peer.send(message)
|
|
143
|
+
} catch (error) {
|
|
144
|
+
this.logger.warn(() => ["Beacon fan-out send failed:", error])
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|