@hot-updater/server 1.0.0-rc.18 → 1.0.0-rc.21
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/LICENSE +12 -14
- package/dist/adapters/drizzle.cjs +6 -8
- package/dist/adapters/drizzle.d.cts +2 -2
- package/dist/adapters/drizzle.d.mts +2 -2
- package/dist/adapters/drizzle.mjs +1 -3
- package/dist/adapters/drizzleExecutor.d.cts +1 -1
- package/dist/adapters/drizzleExecutor.d.mts +1 -1
- package/dist/adapters/kysely.cjs +4 -6
- package/dist/adapters/kysely.d.cts +3 -3
- package/dist/adapters/kysely.d.mts +3 -3
- package/dist/adapters/kysely.mjs +1 -3
- package/dist/adapters/kyselyExecutor.d.cts +1 -2
- package/dist/adapters/kyselyExecutor.d.mts +1 -2
- package/dist/adapters/mongodb.cjs +10 -21
- package/dist/adapters/mongodb.d.cts +1 -1
- package/dist/adapters/mongodb.d.mts +1 -1
- package/dist/adapters/mongodb.mjs +9 -20
- package/dist/adapters/mongodbAdapter.cjs +11 -11
- package/dist/adapters/mongodbAdapter.d.cts +1 -1
- package/dist/adapters/mongodbAdapter.d.mts +1 -1
- package/dist/adapters/mongodbAdapter.mjs +1 -1
- package/dist/adapters/prisma.cjs +7 -9
- package/dist/adapters/prisma.d.cts +1 -1
- package/dist/adapters/prisma.d.mts +1 -1
- package/dist/adapters/prisma.mjs +1 -3
- package/dist/adapters/prismaExecutor.cjs +2 -3
- package/dist/adapters/prismaExecutor.mjs +1 -2
- package/dist/adapters/sqlProviders.cjs +7 -2
- package/dist/adapters/sqlProviders.mjs +6 -1
- package/dist/assembly/assemblePlugins.cjs +26 -48
- package/dist/assembly/assemblePlugins.d.cts +2 -5
- package/dist/assembly/assemblePlugins.d.mts +2 -5
- package/dist/assembly/assemblePlugins.mjs +19 -45
- package/dist/assembly/clientPlugins.cjs +6 -4
- package/dist/assembly/clientPlugins.mjs +2 -0
- package/dist/assembly/configError.d.cts +1 -6
- package/dist/assembly/configError.d.mts +1 -6
- package/dist/assembly/configError.mjs +1 -6
- package/dist/core/api.cjs +0 -40
- package/dist/core/api.d.cts +5 -16
- package/dist/core/api.d.mts +5 -16
- package/dist/core/api.mjs +1 -37
- package/dist/core/baseCandidates.cjs +0 -43
- package/dist/core/baseCandidates.mjs +2 -43
- package/dist/core/operations.cjs +13 -12
- package/dist/core/operations.mjs +6 -5
- package/dist/core/reads.cjs +4 -4
- package/dist/core/reads.d.cts +2 -41
- package/dist/core/reads.d.mts +2 -41
- package/dist/core/reads.mjs +3 -3
- package/dist/core/releases.cjs +6 -6
- package/dist/core/releases.mjs +1 -1
- package/dist/core/writes.cjs +2 -2
- package/dist/core/writes.mjs +1 -1
- package/dist/createHotUpdaterCore.cjs +39 -39
- package/dist/createHotUpdaterCore.d.cts +61 -8
- package/dist/createHotUpdaterCore.d.mts +61 -8
- package/dist/createHotUpdaterCore.mjs +35 -32
- package/dist/db/engineDrizzleSchema.cjs +3 -4
- package/dist/db/engineDrizzleSchema.mjs +1 -2
- package/dist/db/enginePrismaSchema.cjs +4 -5
- package/dist/db/enginePrismaSchema.d.cts +1 -1
- package/dist/db/enginePrismaSchema.d.mts +1 -1
- package/dist/db/enginePrismaSchema.mjs +1 -2
- package/dist/db/releaseCatalog.cjs +6 -6
- package/dist/db/releaseCatalog.mjs +1 -1
- package/dist/db/updateArtifacts.cjs +6 -6
- package/dist/db/updateArtifacts.mjs +1 -1
- package/dist/handler.cjs +3 -4
- package/dist/handler.mjs +1 -1
- package/dist/handlerAdminRoutes.cjs +1 -2
- package/dist/handlerAdminRoutes.mjs +1 -2
- package/dist/handlerVersionRoutes.cjs +2 -2
- package/dist/handlerVersionRoutes.mjs +2 -2
- package/dist/index.cjs +9 -2
- package/dist/index.d.cts +4 -3
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +2 -1
- package/dist/node.cjs +3 -6
- package/dist/node.d.cts +3 -3
- package/dist/node.d.mts +3 -3
- package/dist/node.mjs +4 -4
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugins/api-keys/index.cjs +8 -52
- package/dist/plugins/api-keys/index.d.cts +1 -84
- package/dist/plugins/api-keys/index.d.mts +1 -84
- package/dist/plugins/api-keys/index.mjs +2 -49
- package/dist/plugins/definePlugin.d.cts +2 -200
- package/dist/plugins/definePlugin.d.mts +2 -200
- package/dist/plugins/insights/index.cjs +7 -126
- package/dist/plugins/insights/index.d.cts +1 -398
- package/dist/plugins/insights/index.d.mts +1 -398
- package/dist/plugins/insights/index.mjs +2 -121
- package/dist/plugins/official.cjs +30 -0
- package/dist/plugins/official.mjs +29 -0
- package/dist/storageAccess.cjs +13 -10
- package/dist/storageAccess.mjs +13 -10
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.mts +1 -1
- package/package.json +15 -37
- package/dist/_virtual/_rolldown/runtime.cjs +0 -23
- package/dist/assembly/clientPlugins.d.cts +0 -16
- package/dist/assembly/clientPlugins.d.mts +0 -16
- package/dist/assembly/configError.cjs +0 -7
- package/dist/assembly/databasePlugins.cjs +0 -27
- package/dist/assembly/databasePlugins.d.cts +0 -43
- package/dist/assembly/databasePlugins.d.mts +0 -43
- package/dist/assembly/databasePlugins.mjs +0 -26
- package/dist/assembly/pluginCli.cjs +0 -125
- package/dist/assembly/pluginCli.d.cts +0 -59
- package/dist/assembly/pluginCli.d.mts +0 -59
- package/dist/assembly/pluginCli.mjs +0 -121
- package/dist/core/baseCandidates.d.cts +0 -17
- package/dist/core/baseCandidates.d.mts +0 -17
- package/dist/core/schema.cjs +0 -279
- package/dist/core/schema.d.cts +0 -307
- package/dist/core/schema.d.mts +0 -307
- package/dist/core/schema.mjs +0 -277
- package/dist/database/aggregateBatching.cjs +0 -626
- package/dist/database/aggregateBatching.d.cts +0 -10
- package/dist/database/aggregateBatching.d.mts +0 -10
- package/dist/database/aggregateBatching.mjs +0 -625
- package/dist/database/busy.cjs +0 -36
- package/dist/database/busy.d.cts +0 -12
- package/dist/database/busy.d.mts +0 -12
- package/dist/database/busy.mjs +0 -36
- package/dist/database/cursor.cjs +0 -44
- package/dist/database/cursor.d.cts +0 -7
- package/dist/database/cursor.d.mts +0 -7
- package/dist/database/cursor.mjs +0 -40
- package/dist/database/database.cjs +0 -63
- package/dist/database/database.d.cts +0 -136
- package/dist/database/database.d.mts +0 -136
- package/dist/database/database.mjs +0 -63
- package/dist/database/definitions.d.cts +0 -78
- package/dist/database/definitions.d.mts +0 -78
- package/dist/database/engine.cjs +0 -37
- package/dist/database/engine.d.cts +0 -41
- package/dist/database/engine.d.mts +0 -41
- package/dist/database/engine.mjs +0 -37
- package/dist/database/engineAggregates.cjs +0 -118
- package/dist/database/engineAggregates.mjs +0 -115
- package/dist/database/engineReads.cjs +0 -182
- package/dist/database/engineReads.d.cts +0 -35
- package/dist/database/engineReads.d.mts +0 -35
- package/dist/database/engineReads.mjs +0 -181
- package/dist/database/engineTransaction.cjs +0 -399
- package/dist/database/engineTransaction.d.cts +0 -26
- package/dist/database/engineTransaction.d.mts +0 -26
- package/dist/database/engineTransaction.mjs +0 -398
- package/dist/database/errors.cjs +0 -27
- package/dist/database/errors.d.cts +0 -21
- package/dist/database/errors.d.mts +0 -21
- package/dist/database/errors.mjs +0 -24
- package/dist/database/fence.cjs +0 -125
- package/dist/database/fence.d.cts +0 -42
- package/dist/database/fence.d.mts +0 -42
- package/dist/database/fence.mjs +0 -117
- package/dist/database/index.cjs +0 -136
- package/dist/database/index.d.cts +0 -18
- package/dist/database/index.d.mts +0 -18
- package/dist/database/index.mjs +0 -16
- package/dist/database/kv/kvAdapter.cjs +0 -285
- package/dist/database/kv/kvAdapter.d.cts +0 -109
- package/dist/database/kv/kvAdapter.d.mts +0 -109
- package/dist/database/kv/kvAdapter.mjs +0 -284
- package/dist/database/resolveSchema.cjs +0 -199
- package/dist/database/resolveSchema.d.cts +0 -42
- package/dist/database/resolveSchema.d.mts +0 -42
- package/dist/database/resolveSchema.mjs +0 -196
- package/dist/database/retention.cjs +0 -92
- package/dist/database/retention.mjs +0 -90
- package/dist/database/schema.cjs +0 -24
- package/dist/database/schema.d.cts +0 -90
- package/dist/database/schema.d.mts +0 -90
- package/dist/database/schema.mjs +0 -23
- package/dist/database/sql/sqlAdapter.cjs +0 -290
- package/dist/database/sql/sqlAdapter.d.cts +0 -46
- package/dist/database/sql/sqlAdapter.d.mts +0 -46
- package/dist/database/sql/sqlAdapter.mjs +0 -287
- package/dist/database/sql/sqlSchema.cjs +0 -171
- package/dist/database/sql/sqlSchema.d.cts +0 -8
- package/dist/database/sql/sqlSchema.d.mts +0 -8
- package/dist/database/sql/sqlSchema.mjs +0 -165
- package/dist/db/coreDatabase.cjs +0 -85
- package/dist/db/coreDatabase.d.cts +0 -57
- package/dist/db/coreDatabase.d.mts +0 -57
- package/dist/db/coreDatabase.mjs +0 -78
- package/dist/db/createBundleDiff.cjs +0 -144
- package/dist/db/createBundleDiff.d.cts +0 -17
- package/dist/db/createBundleDiff.d.mts +0 -17
- package/dist/db/createBundleDiff.mjs +0 -141
- package/dist/db/engineMigrator.cjs +0 -53
- package/dist/db/engineMigrator.mjs +0 -53
- package/dist/db/engineSql.cjs +0 -26
- package/dist/db/engineSql.d.cts +0 -17
- package/dist/db/engineSql.d.mts +0 -17
- package/dist/db/engineSql.mjs +0 -25
- package/dist/db/engineSqlMigrator.cjs +0 -66
- package/dist/db/engineSqlMigrator.mjs +0 -66
- package/dist/db/fixedMigratorShared.cjs +0 -12
- package/dist/db/fixedMigratorShared.mjs +0 -11
- package/dist/db/index.cjs +0 -50
- package/dist/db/index.d.cts +0 -23
- package/dist/db/index.d.mts +0 -23
- package/dist/db/index.mjs +0 -33
- package/dist/db/releaseCatalog.d.cts +0 -16
- package/dist/db/releaseCatalog.d.mts +0 -16
- package/dist/db/schemaSettings.cjs +0 -63
- package/dist/db/schemaSettings.d.cts +0 -12
- package/dist/db/schemaSettings.d.mts +0 -12
- package/dist/db/schemaSettings.mjs +0 -62
- package/dist/db/settingsMigrator.cjs +0 -92
- package/dist/db/settingsMigrator.mjs +0 -89
- package/dist/db/types.cjs +0 -11
- package/dist/db/types.d.cts +0 -78
- package/dist/db/types.d.mts +0 -78
- package/dist/db/types.mjs +0 -10
- package/dist/diff.cjs +0 -3
- package/dist/diff.d.cts +0 -2
- package/dist/diff.d.mts +0 -2
- package/dist/diff.mjs +0 -2
- package/dist/plugins/api-keys/apiKeys.cjs +0 -139
- package/dist/plugins/api-keys/apiKeys.d.cts +0 -27
- package/dist/plugins/api-keys/apiKeys.d.mts +0 -27
- package/dist/plugins/api-keys/apiKeys.mjs +0 -129
- package/dist/plugins/api-keys/cli.cjs +0 -115
- package/dist/plugins/api-keys/cli.mjs +0 -114
- package/dist/plugins/api-keys/model.cjs +0 -58
- package/dist/plugins/api-keys/model.d.cts +0 -26
- package/dist/plugins/api-keys/model.d.mts +0 -26
- package/dist/plugins/api-keys/model.mjs +0 -58
- package/dist/plugins/api-keys/schema.cjs +0 -38
- package/dist/plugins/api-keys/schema.d.cts +0 -44
- package/dist/plugins/api-keys/schema.d.mts +0 -44
- package/dist/plugins/api-keys/schema.mjs +0 -39
- package/dist/plugins/definePlugin.cjs +0 -5
- package/dist/plugins/definePlugin.mjs +0 -5
- package/dist/plugins/index.cjs +0 -38
- package/dist/plugins/index.d.cts +0 -12
- package/dist/plugins/index.d.mts +0 -12
- package/dist/plugins/index.mjs +0 -9
- package/dist/plugins/insights/contract.cjs +0 -193
- package/dist/plugins/insights/contract.mjs +0 -189
- package/dist/plugins/insights/domain.d.cts +0 -149
- package/dist/plugins/insights/domain.d.mts +0 -149
- package/dist/plugins/insights/errors.cjs +0 -15
- package/dist/plugins/insights/errors.mjs +0 -14
- package/dist/plugins/insights/eventInput.cjs +0 -284
- package/dist/plugins/insights/eventInput.mjs +0 -282
- package/dist/plugins/insights/eventRow.cjs +0 -49
- package/dist/plugins/insights/eventRow.d.cts +0 -64
- package/dist/plugins/insights/eventRow.d.mts +0 -64
- package/dist/plugins/insights/eventRow.mjs +0 -47
- package/dist/plugins/insights/model.cjs +0 -17
- package/dist/plugins/insights/model.d.cts +0 -10
- package/dist/plugins/insights/model.d.mts +0 -10
- package/dist/plugins/insights/model.mjs +0 -17
- package/dist/plugins/insights/modelTypes.d.cts +0 -176
- package/dist/plugins/insights/modelTypes.d.mts +0 -176
- package/dist/plugins/insights/overview.cjs +0 -109
- package/dist/plugins/insights/overview.d.cts +0 -15
- package/dist/plugins/insights/overview.d.mts +0 -15
- package/dist/plugins/insights/overview.mjs +0 -107
- package/dist/plugins/insights/provider.cjs +0 -375
- package/dist/plugins/insights/provider.d.cts +0 -6
- package/dist/plugins/insights/provider.d.mts +0 -6
- package/dist/plugins/insights/provider.mjs +0 -374
- package/dist/plugins/insights/queryInput.cjs +0 -93
- package/dist/plugins/insights/queryInput.mjs +0 -91
- package/dist/plugins/insights/reads.cjs +0 -681
- package/dist/plugins/insights/reads.d.cts +0 -61
- package/dist/plugins/insights/reads.d.mts +0 -61
- package/dist/plugins/insights/reads.mjs +0 -674
- package/dist/plugins/insights/recordEvent.cjs +0 -319
- package/dist/plugins/insights/recordEvent.d.cts +0 -18
- package/dist/plugins/insights/recordEvent.d.mts +0 -18
- package/dist/plugins/insights/recordEvent.mjs +0 -316
- package/dist/plugins/insights/routes.cjs +0 -96
- package/dist/plugins/insights/routes.mjs +0 -95
- package/dist/plugins/insights/schema.cjs +0 -489
- package/dist/plugins/insights/schema.d.cts +0 -698
- package/dist/plugins/insights/schema.d.mts +0 -698
- package/dist/plugins/insights/schema.mjs +0 -483
- package/dist/plugins/insights/testing/eventRow.d.mts +0 -64
- package/dist/plugins/insights/testing/expectInsightsIndex.mjs +0 -18
- package/dist/plugins/insights/testing/fixtures.d.mts +0 -8
- package/dist/plugins/insights/testing/fixtures.mjs +0 -25
- package/dist/plugins/insights/testing/index.d.mts +0 -24
- package/dist/plugins/insights/testing/index.mjs +0 -25
- package/dist/plugins/insights/testing/insightsModelTests.mjs +0 -714
- package/dist/plugins/insights/testing/modelTypes.d.mts +0 -176
- package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.d.mts +0 -11
- package/dist/plugins/insights/testing/setupInsightsHttpTestSuite.mjs +0 -107
- package/dist/plugins/insights/testing/setupInsightsModelTestSuite.d.mts +0 -11
- package/dist/plugins/insights/testing/setupInsightsModelTestSuite.mjs +0 -31
- package/dist/plugins/insights/testing/types.d.mts +0 -26
- package/dist/plugins/insights/types.d.cts +0 -33
- package/dist/plugins/insights/types.d.mts +0 -33
- package/src/adapters/drizzle.conformance.integration.spec.ts +0 -34
- package/src/adapters/drizzle.readBudgets.integration.spec.ts +0 -43
- package/src/adapters/drizzle.spec.ts +0 -314
- package/src/adapters/drizzle.ts +0 -64
- package/src/adapters/drizzleExecutor.ts +0 -166
- package/src/adapters/kysely.conformance.integration.spec.ts +0 -36
- package/src/adapters/kysely.readBudgets.integration.spec.ts +0 -44
- package/src/adapters/kysely.spec.ts +0 -244
- package/src/adapters/kysely.ts +0 -46
- package/src/adapters/kyselyExecutor.ts +0 -53
- package/src/adapters/mongodb.integration.spec.ts +0 -271
- package/src/adapters/mongodb.readBudgets.integration.spec.ts +0 -61
- package/src/adapters/mongodb.ts +0 -45
- package/src/adapters/mongodbAdapter.ts +0 -307
- package/src/adapters/prisma.conformance.integration.spec.ts +0 -36
- package/src/adapters/prisma.integration.spec.ts +0 -146
- package/src/adapters/prisma.readBudgets.integration.spec.ts +0 -43
- package/src/adapters/prisma.spec.ts +0 -257
- package/src/adapters/prisma.ts +0 -74
- package/src/adapters/prismaExecutor.ts +0 -107
- package/src/adapters/prismaTestClients.ts +0 -182
- package/src/adapters/sqlProviders.ts +0 -14
- package/src/assembly/assemblePlugins.ts +0 -302
- package/src/assembly/assembly.spec.ts +0 -377
- package/src/assembly/assembly.types.spec.ts +0 -203
- package/src/assembly/clientPlugins.ts +0 -113
- package/src/assembly/configError.ts +0 -4
- package/src/assembly/databasePlugins.spec.ts +0 -71
- package/src/assembly/databasePlugins.ts +0 -102
- package/src/assembly/pluginCli.spec.ts +0 -254
- package/src/assembly/pluginCli.ts +0 -248
- package/src/assembly/pluginRoutes.spec.ts +0 -186
- package/src/core/api.ts +0 -139
- package/src/core/baseCandidates.spec.ts +0 -378
- package/src/core/baseCandidates.ts +0 -136
- package/src/core/index.ts +0 -44
- package/src/core/operations.spec.ts +0 -415
- package/src/core/operations.ts +0 -551
- package/src/core/reads.spec.ts +0 -300
- package/src/core/reads.ts +0 -417
- package/src/core/releases.spec.ts +0 -308
- package/src/core/releases.ts +0 -345
- package/src/core/schema.ts +0 -173
- package/src/core/writes.ts +0 -160
- package/src/createHotUpdaterCore.ts +0 -260
- package/src/database/aggregateBatching.spec.ts +0 -577
- package/src/database/aggregateBatching.ts +0 -803
- package/src/database/busy.spec.ts +0 -45
- package/src/database/busy.ts +0 -50
- package/src/database/cursor.ts +0 -65
- package/src/database/database.ts +0 -366
- package/src/database/database.types.spec.ts +0 -135
- package/src/database/definitions.ts +0 -76
- package/src/database/engine.ts +0 -62
- package/src/database/engineAggregates.spec.ts +0 -536
- package/src/database/engineAggregates.ts +0 -189
- package/src/database/engineReads.spec.ts +0 -219
- package/src/database/engineReads.ts +0 -304
- package/src/database/engineTransaction.spec.ts +0 -710
- package/src/database/engineTransaction.ts +0 -582
- package/src/database/errors.ts +0 -30
- package/src/database/fence.spec.ts +0 -223
- package/src/database/fence.ts +0 -175
- package/src/database/index.ts +0 -160
- package/src/database/kv/kvAdapter.batching.integration.spec.ts +0 -15
- package/src/database/kv/kvAdapter.conformance.integration.spec.ts +0 -19
- package/src/database/kv/kvAdapter.readBudgets.integration.spec.ts +0 -17
- package/src/database/kv/kvAdapter.spec.ts +0 -595
- package/src/database/kv/kvAdapter.ts +0 -479
- package/src/database/kv/kvTestStore.ts +0 -118
- package/src/database/memory.readBudgets.integration.spec.ts +0 -13
- package/src/database/resolveSchema.spec.ts +0 -230
- package/src/database/resolveSchema.ts +0 -375
- package/src/database/retention.spec.ts +0 -314
- package/src/database/retention.ts +0 -129
- package/src/database/schema.ts +0 -213
- package/src/database/schema.types.spec.ts +0 -94
- package/src/database/sql/docker-compose.yml +0 -36
- package/src/database/sql/sqlAdapter.integration.spec.ts +0 -145
- package/src/database/sql/sqlAdapter.readBudgets.integration.spec.ts +0 -123
- package/src/database/sql/sqlAdapter.spec.ts +0 -343
- package/src/database/sql/sqlAdapter.ts +0 -552
- package/src/database/sql/sqlSchema.ts +0 -286
- package/src/database/sql/sqlTestExecutors.ts +0 -183
- package/src/databaseTestSuite.spec.ts +0 -44
- package/src/db/bundleRows.spec.ts +0 -164
- package/src/db/bundleRows.ts +0 -10
- package/src/db/coreDatabase.ts +0 -153
- package/src/db/createBundleDiff.spec.ts +0 -464
- package/src/db/createBundleDiff.ts +0 -370
- package/src/db/engineDrizzleSchema.ts +0 -72
- package/src/db/engineMigrator.ts +0 -105
- package/src/db/enginePrismaSchema.ts +0 -147
- package/src/db/engineSql.spec.ts +0 -130
- package/src/db/engineSql.ts +0 -48
- package/src/db/engineSqlMigrator.ts +0 -116
- package/src/db/fixedMigratorShared.ts +0 -17
- package/src/db/index.spec.ts +0 -554
- package/src/db/index.ts +0 -93
- package/src/db/node-sqlite.d.ts +0 -25
- package/src/db/pluginTables.spec.ts +0 -248
- package/src/db/releaseCatalog.ts +0 -106
- package/src/db/schemaSettings.ts +0 -104
- package/src/db/settingsMigrator.spec.ts +0 -65
- package/src/db/settingsMigrator.ts +0 -152
- package/src/db/types.ts +0 -82
- package/src/db/updateArtifacts.spec.ts +0 -235
- package/src/db/updateArtifacts.ts +0 -473
- package/src/db/updateCheck.bench.ts +0 -47
- package/src/diff.ts +0 -6
- package/src/handler-standalone.integration.spec.ts +0 -321
- package/src/handler.spec.ts +0 -273
- package/src/handler.testFixtures.ts +0 -25
- package/src/handler.ts +0 -302
- package/src/handlerAdminRoutes.spec.ts +0 -183
- package/src/handlerAdminRoutes.ts +0 -536
- package/src/handlerAuth.integration.spec.ts +0 -33
- package/src/handlerErrors.ts +0 -7
- package/src/handlerManagement.spec.ts +0 -202
- package/src/handlerParameters.ts +0 -105
- package/src/handlerReleaseCatalogRoutes.ts +0 -176
- package/src/handlerTypes.ts +0 -19
- package/src/handlerVersionRoutes.ts +0 -25
- package/src/index.ts +0 -13
- package/src/internalRouter.ts +0 -104
- package/src/lintRules.spec.ts +0 -76
- package/src/node.spec.ts +0 -119
- package/src/node.ts +0 -111
- package/src/plugins/api-keys/apiKeys.integration.spec.ts +0 -92
- package/src/plugins/api-keys/apiKeys.spec.ts +0 -166
- package/src/plugins/api-keys/apiKeys.ts +0 -214
- package/src/plugins/api-keys/apiKeysPlugin.spec.ts +0 -168
- package/src/plugins/api-keys/cli.spec.ts +0 -187
- package/src/plugins/api-keys/cli.ts +0 -140
- package/src/plugins/api-keys/index.ts +0 -73
- package/src/plugins/api-keys/model.ts +0 -88
- package/src/plugins/api-keys/schema.ts +0 -22
- package/src/plugins/definePlugin.ts +0 -242
- package/src/plugins/index.ts +0 -73
- package/src/plugins/insights/contract.spec.ts +0 -285
- package/src/plugins/insights/contract.ts +0 -372
- package/src/plugins/insights/domain.ts +0 -176
- package/src/plugins/insights/errors.ts +0 -11
- package/src/plugins/insights/eventInput.ts +0 -381
- package/src/plugins/insights/eventRow.ts +0 -209
- package/src/plugins/insights/index.ts +0 -222
- package/src/plugins/insights/insights.integration.spec.ts +0 -921
- package/src/plugins/insights/insightsRollout.integration.spec.ts +0 -186
- package/src/plugins/insights/model.spec.ts +0 -64
- package/src/plugins/insights/model.ts +0 -18
- package/src/plugins/insights/modelTypes.ts +0 -197
- package/src/plugins/insights/overview.spec.ts +0 -64
- package/src/plugins/insights/overview.ts +0 -214
- package/src/plugins/insights/provider.spec.ts +0 -585
- package/src/plugins/insights/provider.ts +0 -704
- package/src/plugins/insights/queryInput.ts +0 -142
- package/src/plugins/insights/reads.spec.ts +0 -1013
- package/src/plugins/insights/reads.ts +0 -1037
- package/src/plugins/insights/recordEvent.spec.ts +0 -897
- package/src/plugins/insights/recordEvent.ts +0 -476
- package/src/plugins/insights/retention.spec.ts +0 -115
- package/src/plugins/insights/routes.ts +0 -149
- package/src/plugins/insights/schema.ts +0 -409
- package/src/plugins/insights/testing/expectInsightsIndex.spec.ts +0 -42
- package/src/plugins/insights/testing/expectInsightsIndex.ts +0 -20
- package/src/plugins/insights/testing/fixtures.ts +0 -30
- package/src/plugins/insights/testing/index.ts +0 -45
- package/src/plugins/insights/testing/insightsModelTests.ts +0 -860
- package/src/plugins/insights/testing/setupInsightsHttpTestSuite.ts +0 -152
- package/src/plugins/insights/testing/setupInsightsModelTestSuite.ts +0 -36
- package/src/plugins/insights/testing/types.ts +0 -30
- package/src/plugins/insights/types.ts +0 -55
- package/src/plugins/pluginTestHarness.spec.ts +0 -56
- package/src/readBudgets.testFixtures.ts +0 -15
- package/src/releaseCatalogRoutes.integration.spec.ts +0 -200
- package/src/retention.spec.ts +0 -73
- package/src/runtime.spec.ts +0 -207
- package/src/runtime.testFixtures.ts +0 -60
- package/src/runtimeBundles.integration.spec.ts +0 -112
- package/src/storageAccess.spec.ts +0 -152
- package/src/storageAccess.ts +0 -141
- package/src/testUtilsMutation.integration.spec.ts +0 -216
- package/src/testUtilsPackage.integration.spec.ts +0 -180
- package/src/types/index.ts +0 -2
- package/src/version.ts +0 -3
package/src/core/schema.ts
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { defineAggregate, defineTable } from "../database/schema";
|
|
2
|
-
|
|
3
|
-
/** A channel's id is `channel:` and its name's channel key, so ids share channel_key's bound. */
|
|
4
|
-
const CHANNEL_ID = { type: "string", maxLength: 1408, ascii: true } as const;
|
|
5
|
-
|
|
6
|
-
/** Core's schema version: the `schema.core` settings row. */
|
|
7
|
-
export const HOT_UPDATER_SCHEMA_VERSION = "1.0.0";
|
|
8
|
-
|
|
9
|
-
const bundles = defineTable(
|
|
10
|
-
{
|
|
11
|
-
id: { type: "string", maxLength: 36 },
|
|
12
|
-
platform: { type: "string", maxLength: 16 },
|
|
13
|
-
git_commit_hash: { type: "string", maxLength: 255, required: false },
|
|
14
|
-
metadata: { type: "json" },
|
|
15
|
-
manifest_storage_uri: { type: "string" },
|
|
16
|
-
manifest_file_hash: { type: "string" },
|
|
17
|
-
asset_base_storage_uri: { type: "string" },
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
key: ["id"],
|
|
21
|
-
indexes: {
|
|
22
|
-
byPlatform: { eq: ["platform"], sort: ["id"] },
|
|
23
|
-
all: { eq: [], sort: ["id"] },
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const bundlePatches = defineTable(
|
|
29
|
-
{
|
|
30
|
-
id: { type: "string", maxLength: 255 },
|
|
31
|
-
bundle_id: {
|
|
32
|
-
type: "string",
|
|
33
|
-
maxLength: 36,
|
|
34
|
-
references: { model: "bundles", onDelete: "cascade" },
|
|
35
|
-
},
|
|
36
|
-
base_bundle_id: {
|
|
37
|
-
type: "string",
|
|
38
|
-
maxLength: 36,
|
|
39
|
-
references: { model: "bundles", onDelete: "cascade" },
|
|
40
|
-
},
|
|
41
|
-
base_file_hash: { type: "string" },
|
|
42
|
-
patch_file_hash: { type: "string" },
|
|
43
|
-
patch_storage_uri: { type: "string" },
|
|
44
|
-
byte_size: { type: "integer" },
|
|
45
|
-
order_index: { type: "integer" },
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
key: ["id"],
|
|
49
|
-
indexes: {
|
|
50
|
-
pair: { eq: ["bundle_id", "base_bundle_id"], sort: [], unique: true },
|
|
51
|
-
byBundle: {
|
|
52
|
-
eq: ["bundle_id"],
|
|
53
|
-
sort: ["order_index"],
|
|
54
|
-
root: { model: "bundles" },
|
|
55
|
-
},
|
|
56
|
-
byBase: { eq: ["base_bundle_id"], sort: ["bundle_id"] },
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
const releases = defineTable(
|
|
62
|
-
{
|
|
63
|
-
id: { type: "string", maxLength: 36 },
|
|
64
|
-
revision: { type: "integer" },
|
|
65
|
-
scope_key: { type: "string", maxLength: 2048, ascii: true },
|
|
66
|
-
channel_id: {
|
|
67
|
-
...CHANNEL_ID,
|
|
68
|
-
references: { model: "channels", onDelete: "restrict" },
|
|
69
|
-
},
|
|
70
|
-
platform: { type: "string", maxLength: 16 },
|
|
71
|
-
kind: { type: "string", maxLength: 16 },
|
|
72
|
-
bundle_id: {
|
|
73
|
-
type: "string",
|
|
74
|
-
maxLength: 36,
|
|
75
|
-
required: false,
|
|
76
|
-
references: { model: "bundles", onDelete: "restrict" },
|
|
77
|
-
},
|
|
78
|
-
strategy: { type: "string", maxLength: 16 },
|
|
79
|
-
target_app_version: { type: "string", required: false },
|
|
80
|
-
fingerprint_hash: { type: "string", maxLength: 255, required: false },
|
|
81
|
-
enabled: { type: "boolean" },
|
|
82
|
-
should_force_update: { type: "boolean" },
|
|
83
|
-
message: { type: "string", required: false },
|
|
84
|
-
rollout_cohort_count: { type: "integer" },
|
|
85
|
-
target_cohorts: { type: "json" },
|
|
86
|
-
operation: { type: "string", maxLength: 16 },
|
|
87
|
-
source_release_id: {
|
|
88
|
-
type: "string",
|
|
89
|
-
maxLength: 36,
|
|
90
|
-
required: false,
|
|
91
|
-
references: { model: "releases", onDelete: "none" },
|
|
92
|
-
},
|
|
93
|
-
created_at_ms: { type: "integer" },
|
|
94
|
-
updated_at_ms: { type: "integer" },
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
key: ["id"],
|
|
98
|
-
indexes: {
|
|
99
|
-
byScope: {
|
|
100
|
-
eq: ["scope_key"],
|
|
101
|
-
sort: ["id"],
|
|
102
|
-
root: { model: "release_catalogs" },
|
|
103
|
-
},
|
|
104
|
-
byScopeEnabled: {
|
|
105
|
-
eq: ["scope_key", "enabled"],
|
|
106
|
-
sort: ["id"],
|
|
107
|
-
root: { model: "release_catalogs" },
|
|
108
|
-
},
|
|
109
|
-
byChannelPlatform: { eq: ["channel_id", "platform"], sort: ["id"] },
|
|
110
|
-
byChannelPlatformEnabled: {
|
|
111
|
-
eq: ["channel_id", "platform", "enabled"],
|
|
112
|
-
sort: ["id"],
|
|
113
|
-
},
|
|
114
|
-
byBundle: { eq: ["bundle_id"], sort: ["id"] },
|
|
115
|
-
all: { eq: [], sort: ["id"] },
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
/** One compiled catalog per scope; the update check reads exactly this row. */
|
|
121
|
-
const releaseCatalogs = defineTable(
|
|
122
|
-
{
|
|
123
|
-
scope_key: { type: "string", maxLength: 2048, ascii: true },
|
|
124
|
-
catalog_id: { type: "string", maxLength: 255 },
|
|
125
|
-
strategy: { type: "string", maxLength: 16 },
|
|
126
|
-
channel_id: {
|
|
127
|
-
...CHANNEL_ID,
|
|
128
|
-
references: { model: "channels", onDelete: "none" },
|
|
129
|
-
},
|
|
130
|
-
channel_key: { type: "string", maxLength: 1400, ascii: true },
|
|
131
|
-
platform: { type: "string", maxLength: 16 },
|
|
132
|
-
fingerprint_hash: { type: "string", maxLength: 255, required: false },
|
|
133
|
-
generation: { type: "integer" },
|
|
134
|
-
payload: { type: "string" },
|
|
135
|
-
catalog_hash: { type: "string", maxLength: 71 },
|
|
136
|
-
byte_size: { type: "integer" },
|
|
137
|
-
is_tombstone: { type: "boolean" },
|
|
138
|
-
updated_at_ms: { type: "integer" },
|
|
139
|
-
},
|
|
140
|
-
{ key: ["scope_key"], indexes: { all: { eq: [], sort: ["scope_key"] } } },
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
const channels = defineTable(
|
|
144
|
-
{
|
|
145
|
-
id: CHANNEL_ID,
|
|
146
|
-
name: { type: "string", maxLength: 255, unique: true },
|
|
147
|
-
},
|
|
148
|
-
{ key: ["id"], indexes: { all: { eq: [], sort: ["name"] } } },
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
/** Bundles per platform and in total (`platform_key` is a platform or `*`). */
|
|
152
|
-
const bundleTotals = defineAggregate(
|
|
153
|
-
{ platform_key: { type: "string", maxLength: 16 } },
|
|
154
|
-
{
|
|
155
|
-
key: ["platform_key"],
|
|
156
|
-
counters: ["bundles"],
|
|
157
|
-
indexes: { byPlatform: { eq: ["platform_key"], sort: [] } },
|
|
158
|
-
},
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
export const coreSchema = {
|
|
162
|
-
bundles,
|
|
163
|
-
bundle_patches: bundlePatches,
|
|
164
|
-
releases,
|
|
165
|
-
release_catalogs: releaseCatalogs,
|
|
166
|
-
channels,
|
|
167
|
-
bundle_totals: bundleTotals,
|
|
168
|
-
} as const;
|
|
169
|
-
|
|
170
|
-
export type CoreSchema = typeof coreSchema;
|
|
171
|
-
|
|
172
|
-
/** Core's module: always installed, never a plugin. */
|
|
173
|
-
export const coreModule = { id: "core", schema: coreSchema } as const;
|
package/src/core/writes.ts
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
BundlePatchRow,
|
|
3
|
-
BundleRow,
|
|
4
|
-
BundleRowUpdate,
|
|
5
|
-
ChannelDeleteResult,
|
|
6
|
-
ChannelInsertResult,
|
|
7
|
-
ChannelRow,
|
|
8
|
-
} from "@hot-updater/plugin-core";
|
|
9
|
-
|
|
10
|
-
import type { HotUpdaterTransaction, TableRow } from "../database/database";
|
|
11
|
-
import { DatabaseConstraintError } from "../database/errors";
|
|
12
|
-
import { toChannelRow, type CoreDatabase } from "./reads";
|
|
13
|
-
import type { CoreSchema } from "./schema";
|
|
14
|
-
|
|
15
|
-
export type CoreTransaction = HotUpdaterTransaction<CoreSchema>;
|
|
16
|
-
export type StoredBundle = TableRow<CoreSchema["bundles"]>;
|
|
17
|
-
|
|
18
|
-
const PAGE = 500;
|
|
19
|
-
|
|
20
|
-
/** Moves one bundle into or out of its platform's total and the overall total. */
|
|
21
|
-
const countBundle = (tx: CoreTransaction, platform: string, delta: number) => {
|
|
22
|
-
for (const key of [platform, "*"]) {
|
|
23
|
-
tx.aggregate("bundle_totals", { platform_key: key }, { bundles: delta });
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export const insertBundle = (tx: CoreTransaction, row: BundleRow): void => {
|
|
28
|
-
tx.create("bundles", row);
|
|
29
|
-
countBundle(tx, row.platform, 1);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export const updateBundle = (
|
|
33
|
-
tx: CoreTransaction,
|
|
34
|
-
current: StoredBundle,
|
|
35
|
-
set: BundleRowUpdate,
|
|
36
|
-
): void => {
|
|
37
|
-
tx.update("bundles", current, set);
|
|
38
|
-
if (set.platform !== undefined && set.platform !== current.platform) {
|
|
39
|
-
countBundle(tx, current.platform, -1);
|
|
40
|
-
countBundle(tx, set.platform, 1);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/** Deletes a bundle and, by cascade, every patch to or from it; a release on it refuses. */
|
|
45
|
-
export const deleteBundle = async (
|
|
46
|
-
tx: CoreTransaction,
|
|
47
|
-
current: StoredBundle,
|
|
48
|
-
): Promise<void> => {
|
|
49
|
-
await tx.delete("bundles", current);
|
|
50
|
-
countBundle(tx, current.platform, -1);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/** Deletes a bundle's own patches, exactly as many as its counter holds. */
|
|
54
|
-
export const deleteBundlePatches = async (
|
|
55
|
-
tx: CoreTransaction,
|
|
56
|
-
bundle: StoredBundle,
|
|
57
|
-
): Promise<void> => {
|
|
58
|
-
const count = bundle._refs_bundle_patches_bundle_id ?? 0;
|
|
59
|
-
let cursor: string | undefined;
|
|
60
|
-
for (let seen = 0; seen < count; ) {
|
|
61
|
-
const page = await tx.findMany("bundle_patches", {
|
|
62
|
-
index: "byBundle",
|
|
63
|
-
where: { bundle_id: bundle.id },
|
|
64
|
-
limit: Math.min(count - seen, PAGE),
|
|
65
|
-
...(cursor === undefined ? {} : { cursor }),
|
|
66
|
-
});
|
|
67
|
-
for (const row of page.rows) await tx.delete("bundle_patches", row);
|
|
68
|
-
seen += page.rows.length;
|
|
69
|
-
if (page.next === undefined) break;
|
|
70
|
-
cursor = page.next;
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Replaces a bundle's patches with `rows`: kept patches are updated where
|
|
76
|
-
* they changed, others deleted or created, so no key is written twice.
|
|
77
|
-
*/
|
|
78
|
-
export const replaceBundlePatches = async (
|
|
79
|
-
tx: CoreTransaction,
|
|
80
|
-
bundle: StoredBundle,
|
|
81
|
-
rows: readonly BundlePatchRow[],
|
|
82
|
-
): Promise<void> => {
|
|
83
|
-
const wanted = new Map(rows.map((row) => [row.id, row]));
|
|
84
|
-
const count = bundle._refs_bundle_patches_bundle_id ?? 0;
|
|
85
|
-
let cursor: string | undefined;
|
|
86
|
-
for (let seen = 0; seen < count; ) {
|
|
87
|
-
const page = await tx.findMany("bundle_patches", {
|
|
88
|
-
index: "byBundle",
|
|
89
|
-
where: { bundle_id: bundle.id },
|
|
90
|
-
limit: Math.min(count - seen, PAGE),
|
|
91
|
-
...(cursor === undefined ? {} : { cursor }),
|
|
92
|
-
});
|
|
93
|
-
for (const stored of page.rows) {
|
|
94
|
-
const next = wanted.get(stored.id);
|
|
95
|
-
wanted.delete(stored.id);
|
|
96
|
-
if (next === undefined) {
|
|
97
|
-
await tx.delete("bundle_patches", stored);
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
const set = Object.fromEntries(
|
|
101
|
-
Object.entries(next).filter(
|
|
102
|
-
([field, value]) =>
|
|
103
|
-
field !== "id" &&
|
|
104
|
-
(stored as Record<string, unknown>)[field] !== value,
|
|
105
|
-
),
|
|
106
|
-
);
|
|
107
|
-
if (Object.keys(set).length > 0) {
|
|
108
|
-
tx.update("bundle_patches", stored, set);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
seen += page.rows.length;
|
|
112
|
-
if (page.next === undefined) break;
|
|
113
|
-
cursor = page.next;
|
|
114
|
-
}
|
|
115
|
-
for (const row of wanted.values()) tx.create("bundle_patches", row);
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
/** A channel by name, created when missing; a concurrent creator's row is returned instead. */
|
|
119
|
-
export const insertChannel = async (
|
|
120
|
-
db: CoreDatabase,
|
|
121
|
-
row: ChannelRow,
|
|
122
|
-
): Promise<ChannelInsertResult> => {
|
|
123
|
-
for (let attempt = 1; ; attempt += 1) {
|
|
124
|
-
try {
|
|
125
|
-
return await db.transaction(async (tx) => {
|
|
126
|
-
const existing = await tx.findOne("channels", { name: row.name });
|
|
127
|
-
if (existing !== null) {
|
|
128
|
-
return { row: toChannelRow(existing), inserted: false };
|
|
129
|
-
}
|
|
130
|
-
tx.create("channels", row);
|
|
131
|
-
return { row, inserted: true };
|
|
132
|
-
});
|
|
133
|
-
} catch (error) {
|
|
134
|
-
// Another writer took the name, or the id, first: read again.
|
|
135
|
-
if (
|
|
136
|
-
attempt < 3 &&
|
|
137
|
-
error instanceof DatabaseConstraintError &&
|
|
138
|
-
(error.reason === "unique" || error.reason === "exists")
|
|
139
|
-
) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
throw error;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
/** Deletes a channel no release uses: 1 read + 1 write. */
|
|
148
|
-
export const deleteChannel = (
|
|
149
|
-
db: CoreDatabase,
|
|
150
|
-
id: string,
|
|
151
|
-
): Promise<ChannelDeleteResult> =>
|
|
152
|
-
db.transaction(async (tx) => {
|
|
153
|
-
const row = await tx.findOne("channels", { id });
|
|
154
|
-
if (row === null) return { deleted: false, reason: "not_found" };
|
|
155
|
-
if ((row._refs_releases_channel_id ?? 0) > 0) {
|
|
156
|
-
return { deleted: false, reason: "not_empty" };
|
|
157
|
-
}
|
|
158
|
-
await tx.delete("channels", row);
|
|
159
|
-
return { deleted: true };
|
|
160
|
-
});
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
assertStorageOperations,
|
|
3
|
-
type StoragePlugin,
|
|
4
|
-
} from "@hot-updater/plugin-core";
|
|
5
|
-
import type { DatabaseAdapter } from "@hot-updater/plugin-core/internal";
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
assemblePlugins,
|
|
9
|
-
HotUpdaterConfigError,
|
|
10
|
-
} from "./assembly/assemblePlugins";
|
|
11
|
-
import type { CoreApi } from "./core/api";
|
|
12
|
-
import { toolingTargetOf } from "./db/coreDatabase";
|
|
13
|
-
import type { ToolingDatabase, ToolingTarget } from "./db/types";
|
|
14
|
-
import {
|
|
15
|
-
type ClientRoutePolicy,
|
|
16
|
-
createHotUpdaterHandlers,
|
|
17
|
-
type HotUpdaterHandlers,
|
|
18
|
-
} from "./handler";
|
|
19
|
-
import type { AnyHotUpdaterPlugin, PluginApis } from "./plugins/definePlugin";
|
|
20
|
-
import { createStorageAccess } from "./storageAccess";
|
|
21
|
-
|
|
22
|
-
export type RuntimeHotUpdaterAPI<
|
|
23
|
-
TPlugins extends readonly AnyHotUpdaterPlugin[] =
|
|
24
|
-
readonly AnyHotUpdaterPlugin[],
|
|
25
|
-
> = {
|
|
26
|
-
readonly handlers: HotUpdaterHandlers;
|
|
27
|
-
/** Core's reads and typed writes: bundles, Releases, Catalogs, and channels. */
|
|
28
|
-
readonly core: CoreApi;
|
|
29
|
-
/** Each plugin's API by plugin id. */
|
|
30
|
-
readonly api: PluginApis<TPlugins>;
|
|
31
|
-
/** The database's name, which `hot-updater db` commands read. */
|
|
32
|
-
readonly adapterName: string;
|
|
33
|
-
/**
|
|
34
|
-
* Applies aggregate changes the database batches that are still pending:
|
|
35
|
-
* this process's buffer, and the log rows no compaction has merged yet.
|
|
36
|
-
* A long-lived server with `aggregateBatching: { mode: "memory" }` calls
|
|
37
|
-
* it before it exits.
|
|
38
|
-
*/
|
|
39
|
-
readonly flush: () => Promise<void>;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export type HotUpdaterAPI = RuntimeHotUpdaterAPI;
|
|
43
|
-
|
|
44
|
-
const REMOVED_CLIENT_ACCESS =
|
|
45
|
-
'clientAccess objects were removed in 1.0: set clientAccess: "public", or add a plugin that provides clientAuth';
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* A `clientAccess` object from before 1.0. Its `type` names the fix, so
|
|
49
|
-
* TypeScript reports it where the object is written.
|
|
50
|
-
*/
|
|
51
|
-
export interface RemovedClientAccess {
|
|
52
|
-
readonly type: typeof REMOVED_CLIENT_ACCESS;
|
|
53
|
-
readonly headerName?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export type ClientAccessPolicy =
|
|
57
|
-
/** Leaves client routes public; required when no plugin provides clientAuth. */
|
|
58
|
-
"public" | RemovedClientAccess;
|
|
59
|
-
|
|
60
|
-
type ProvidesClientAuth<TPlugin> = TPlugin extends {
|
|
61
|
-
readonly provides?: infer TProvides;
|
|
62
|
-
}
|
|
63
|
-
? TProvides extends { readonly clientAuth: true }
|
|
64
|
-
? true
|
|
65
|
-
: false
|
|
66
|
-
: false;
|
|
67
|
-
|
|
68
|
-
type ClientAuthIds<
|
|
69
|
-
TPlugins extends readonly unknown[],
|
|
70
|
-
TFound extends string[] = [],
|
|
71
|
-
> = TPlugins extends readonly [infer THead, ...infer TTail]
|
|
72
|
-
? ClientAuthIds<
|
|
73
|
-
TTail,
|
|
74
|
-
ProvidesClientAuth<THead> extends true
|
|
75
|
-
? [
|
|
76
|
-
...TFound,
|
|
77
|
-
THead extends { readonly id: infer TId extends string }
|
|
78
|
-
? TId
|
|
79
|
-
: string,
|
|
80
|
-
]
|
|
81
|
-
: TFound
|
|
82
|
-
>
|
|
83
|
-
: TFound;
|
|
84
|
-
|
|
85
|
-
type JoinIds<TIds extends string[]> = TIds extends [
|
|
86
|
-
infer TFirst extends string,
|
|
87
|
-
...infer TRest extends string[],
|
|
88
|
-
]
|
|
89
|
-
? TRest extends []
|
|
90
|
-
? `"${TFirst}"`
|
|
91
|
-
: `"${TFirst}", ${JoinIds<TRest>}`
|
|
92
|
-
: "";
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Client routes have one policy source: exactly one plugin that provides
|
|
96
|
-
* clientAuth, or an explicit `clientAccess`. Tuples are counted here; an
|
|
97
|
-
* untyped list that may hold a clientAuth plugin is left to startup.
|
|
98
|
-
*/
|
|
99
|
-
export type ClientAccessRule<TPlugins extends readonly AnyHotUpdaterPlugin[]> =
|
|
100
|
-
number extends TPlugins["length"]
|
|
101
|
-
? true extends ProvidesClientAuth<TPlugins[number]>
|
|
102
|
-
? {
|
|
103
|
-
readonly clientAccess?: "Remove clientAccess: a plugin in this list may provide clientAuth";
|
|
104
|
-
}
|
|
105
|
-
: { readonly clientAccess: ClientAccessPolicy }
|
|
106
|
-
: ClientAuthIds<TPlugins> extends []
|
|
107
|
-
? { readonly clientAccess: ClientAccessPolicy }
|
|
108
|
-
: ClientAuthIds<TPlugins> extends [infer TId extends string]
|
|
109
|
-
? {
|
|
110
|
-
readonly clientAccess?: `Remove clientAccess: plugin "${TId}" provides clientAuth`;
|
|
111
|
-
}
|
|
112
|
-
: {
|
|
113
|
-
readonly clientAuth: `Keep one clientAuth plugin: ${JoinIds<ClientAuthIds<TPlugins>>} all provide it`;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
export type CreateHotUpdaterOptions<
|
|
117
|
-
TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly [],
|
|
118
|
-
> = {
|
|
119
|
-
/** A provider's database on the storage engine, such as `kyselyAdapter(...)` or `postgres(...)`. */
|
|
120
|
-
readonly database: ToolingDatabase;
|
|
121
|
-
/** Storage implementations used to read provider-specific storage URIs. */
|
|
122
|
-
readonly storage?: readonly StoragePlugin[];
|
|
123
|
-
/** The plugins the server runs; at most one provides clientAuth. Defaults to none. */
|
|
124
|
-
readonly plugins?: TPlugins;
|
|
125
|
-
} & ClientAccessRule<TPlugins>;
|
|
126
|
-
|
|
127
|
-
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
128
|
-
typeof value === "object" && value !== null;
|
|
129
|
-
|
|
130
|
-
const isAdapter = (value: unknown): value is DatabaseAdapter =>
|
|
131
|
-
isRecord(value) &&
|
|
132
|
-
["fits", "get", "query", "write"].every(
|
|
133
|
-
(method) => typeof value[method] === "function",
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
/** The configured database, when it runs on the storage engine. */
|
|
137
|
-
const databaseOf = (value: unknown): ToolingDatabase => {
|
|
138
|
-
if (isRecord(value) && typeof value.name === "string") {
|
|
139
|
-
if (isAdapter(value.adapter)) return value as unknown as ToolingDatabase;
|
|
140
|
-
if ("core" in value && "fetchAdmin" in value) {
|
|
141
|
-
throw new HotUpdaterConfigError(
|
|
142
|
-
"standaloneRepository reaches a server's admin API from the CLI and console. createHotUpdater needs the server's own database, such as kyselyAdapter(...).",
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
throw new HotUpdaterConfigError(
|
|
147
|
-
"database must be a Hot Updater 1.0 database, such as kyselyAdapter(...) or postgres(...). Upgrade the provider package that created it.",
|
|
148
|
-
);
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
/** `"public"`, or nothing; a `clientAccess` object says what replaced it. */
|
|
152
|
-
const isPublic = (value: unknown): boolean => {
|
|
153
|
-
if (value === undefined) return false;
|
|
154
|
-
if (value === "public") return true;
|
|
155
|
-
throw new HotUpdaterConfigError(
|
|
156
|
-
isRecord(value)
|
|
157
|
-
? 'clientAccess objects were removed in 1.0. Set clientAccess: "public", or add a plugin that provides clientAuth to plugins.'
|
|
158
|
-
: 'clientAccess must be "public"; to protect client routes, add a plugin that provides clientAuth to plugins.',
|
|
159
|
-
);
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
export const hotUpdaterCoreMetadata = Symbol.for(
|
|
163
|
-
"@hot-updater/server/core-metadata",
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
export type HotUpdaterCoreMetadata = {
|
|
167
|
-
/** The configured database, with the tooling `hot-updater db` runs. */
|
|
168
|
-
readonly database: ToolingDatabase;
|
|
169
|
-
/** The tables and settings rows that tooling creates for this server's plugins. */
|
|
170
|
-
readonly target: ToolingTarget;
|
|
171
|
-
/** The plugins as configured, whose commands the CLI adds. */
|
|
172
|
-
readonly plugins: readonly AnyHotUpdaterPlugin[];
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
export function getHotUpdaterCoreMetadata(
|
|
176
|
-
hotUpdater: RuntimeHotUpdaterAPI,
|
|
177
|
-
): HotUpdaterCoreMetadata | undefined {
|
|
178
|
-
return (
|
|
179
|
-
hotUpdater as RuntimeHotUpdaterAPI & {
|
|
180
|
-
readonly [hotUpdaterCoreMetadata]?: HotUpdaterCoreMetadata;
|
|
181
|
-
}
|
|
182
|
-
)[hotUpdaterCoreMetadata];
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function createHotUpdater<
|
|
186
|
-
const TPlugins extends readonly AnyHotUpdaterPlugin[] = readonly [],
|
|
187
|
-
>(
|
|
188
|
-
options: CreateHotUpdaterOptions<TPlugins>,
|
|
189
|
-
): RuntimeHotUpdaterAPI<NoInfer<TPlugins>> {
|
|
190
|
-
for (const key of ["authorityId", "catalogId"]) {
|
|
191
|
-
if (Object.hasOwn(options, key)) {
|
|
192
|
-
throw new TypeError(
|
|
193
|
-
`Remove ${key} from createHotUpdater options. Catalog identity is managed internally.`,
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
const database = databaseOf(options.database);
|
|
198
|
-
const storagePlugins = (options.storage ?? []).map((storage) => {
|
|
199
|
-
assertStorageOperations(storage, ["get", "getDownloadUrl"]);
|
|
200
|
-
return storage;
|
|
201
|
-
});
|
|
202
|
-
const { downloadStorageObject, readStorageText, resolveFileUrl } =
|
|
203
|
-
createStorageAccess(storagePlugins);
|
|
204
|
-
const publicClients = isPublic(
|
|
205
|
-
(options as { readonly clientAccess?: unknown }).clientAccess,
|
|
206
|
-
);
|
|
207
|
-
const plugins = assemblePlugins(options.plugins ?? [], database.adapter, {
|
|
208
|
-
storage: { readStorageText, resolveFileUrl },
|
|
209
|
-
...(database.onCachedRoutesChange === undefined
|
|
210
|
-
? {}
|
|
211
|
-
: { onCachedRoutesChange: () => database.onCachedRoutesChange!() }),
|
|
212
|
-
...(database.aggregateBatching === undefined
|
|
213
|
-
? {}
|
|
214
|
-
: { batching: database.aggregateBatching }),
|
|
215
|
-
});
|
|
216
|
-
const clientAuth = plugins.clientAuth;
|
|
217
|
-
if (clientAuth !== undefined && publicClients) {
|
|
218
|
-
throw new HotUpdaterConfigError(
|
|
219
|
-
`Plugin "${clientAuth.plugin}" provides clientAuth, so remove clientAccess.`,
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
if (clientAuth === undefined && !publicClients) {
|
|
223
|
-
throw new HotUpdaterConfigError(
|
|
224
|
-
'Set clientAccess to "public", or add a plugin that provides clientAuth.',
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
const clientPolicy: ClientRoutePolicy | undefined =
|
|
228
|
-
clientAuth === undefined
|
|
229
|
-
? undefined
|
|
230
|
-
: {
|
|
231
|
-
varyHeaders: clientAuth.varyHeaders.map((header) =>
|
|
232
|
-
header.toLowerCase(),
|
|
233
|
-
),
|
|
234
|
-
authenticate: (request) => clientAuth.authenticate(request.headers),
|
|
235
|
-
};
|
|
236
|
-
const handlers = createHotUpdaterHandlers({
|
|
237
|
-
api: { core: plugins.core },
|
|
238
|
-
...(clientPolicy === undefined ? {} : { clientPolicy }),
|
|
239
|
-
downloadStorageObject,
|
|
240
|
-
endpoints: plugins.endpoints,
|
|
241
|
-
plugins: Object.keys(plugins.api),
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
const api = {
|
|
245
|
-
adapterName: database.name,
|
|
246
|
-
handlers,
|
|
247
|
-
core: plugins.core,
|
|
248
|
-
api: plugins.api as PluginApis<TPlugins>,
|
|
249
|
-
flush: plugins.flush,
|
|
250
|
-
};
|
|
251
|
-
Object.defineProperty(api, hotUpdaterCoreMetadata, {
|
|
252
|
-
enumerable: false,
|
|
253
|
-
value: {
|
|
254
|
-
database,
|
|
255
|
-
target: toolingTargetOf(options.plugins ?? []),
|
|
256
|
-
plugins: options.plugins ?? [],
|
|
257
|
-
} satisfies HotUpdaterCoreMetadata,
|
|
258
|
-
});
|
|
259
|
-
return api;
|
|
260
|
-
}
|