@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
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DatabasePluginInputError,
|
|
3
|
-
type DatabaseJsonObject,
|
|
4
|
-
type Platform,
|
|
5
|
-
} from "@hot-updater/plugin-core";
|
|
6
|
-
import { isDatabaseJsonObject } from "@hot-updater/plugin-core/internal";
|
|
7
|
-
|
|
8
|
-
/** Where an update failed, and what failed; open sets, `unknown` for any other value. */
|
|
9
|
-
export type BundleEventFailureStage =
|
|
10
|
-
| "check"
|
|
11
|
-
| "download"
|
|
12
|
-
| "install"
|
|
13
|
-
| "unknown";
|
|
14
|
-
export type BundleEventFailureReason =
|
|
15
|
-
| "network"
|
|
16
|
-
| "http"
|
|
17
|
-
| "invalid_response"
|
|
18
|
-
| "hash_mismatch"
|
|
19
|
-
| "signature"
|
|
20
|
-
| "patch"
|
|
21
|
-
| "extract"
|
|
22
|
-
| "storage"
|
|
23
|
-
| "unknown";
|
|
24
|
-
|
|
25
|
-
/** An `UPDATE_FAILED` report's failure, as stored. */
|
|
26
|
-
export type BundleEventFailure = DatabaseJsonObject & {
|
|
27
|
-
readonly stage: BundleEventFailureStage;
|
|
28
|
-
readonly reason: BundleEventFailureReason;
|
|
29
|
-
/** What the client was fetching or writing. */
|
|
30
|
-
readonly resource?:
|
|
31
|
-
| "catalog"
|
|
32
|
-
| "artifact"
|
|
33
|
-
| "manifest"
|
|
34
|
-
| "file"
|
|
35
|
-
| "patch"
|
|
36
|
-
| "archive"
|
|
37
|
-
| "unknown";
|
|
38
|
-
readonly http_status?: number;
|
|
39
|
-
/** How the connection failed, when it did. */
|
|
40
|
-
readonly transport?:
|
|
41
|
-
| "timeout"
|
|
42
|
-
| "dns"
|
|
43
|
-
| "tls"
|
|
44
|
-
| "connection"
|
|
45
|
-
| "offline"
|
|
46
|
-
| "cancelled"
|
|
47
|
-
| "unknown";
|
|
48
|
-
/** The storage origin's error code, such as `ExpiredToken`. */
|
|
49
|
-
readonly origin_code?: string;
|
|
50
|
-
/** Android's `ApplicationExitInfo` reason for the process before this one. */
|
|
51
|
-
readonly previous_process_exit?: string;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
/** Ancillary report data; queryable identity and lifecycle fields stay on the row. */
|
|
55
|
-
export type DatabaseBundleEventMetadata = DatabaseJsonObject & {
|
|
56
|
-
readonly cohort: string;
|
|
57
|
-
readonly update_strategy: "fingerprint" | "appVersion" | null;
|
|
58
|
-
readonly fingerprint_hash: string | null;
|
|
59
|
-
readonly sdk_version: string | null;
|
|
60
|
-
/** `UPDATE_FAILED`: what failed. */
|
|
61
|
-
readonly failure?: BundleEventFailure;
|
|
62
|
-
/** `UPDATE_DOWNLOADED`: how the bundle arrived. */
|
|
63
|
-
readonly delivery?: "patch" | "manifest" | "archive" | "unknown";
|
|
64
|
-
/** `UPDATE_DOWNLOADED`: a patch failed and the full files came instead. */
|
|
65
|
-
readonly patch_fallback?: boolean;
|
|
66
|
-
/** `RECOVERED`: Android's `ApplicationExitInfo` reason for the crashed process. */
|
|
67
|
-
readonly previous_process_exit?: string;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export type BundleEventRowBase = {
|
|
71
|
-
readonly id: string;
|
|
72
|
-
readonly install_id: string;
|
|
73
|
-
readonly user_id: string | null;
|
|
74
|
-
readonly from_release_id: string | null;
|
|
75
|
-
readonly to_release_id: string | null;
|
|
76
|
-
readonly to_bundle_id: string;
|
|
77
|
-
readonly platform: Platform;
|
|
78
|
-
readonly app_version: string;
|
|
79
|
-
readonly channel: string;
|
|
80
|
-
readonly metadata: DatabaseBundleEventMetadata;
|
|
81
|
-
readonly received_at_ms: number;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export type BundleEventRow = BundleEventRowBase &
|
|
85
|
-
(
|
|
86
|
-
| { readonly type: "UPDATE_DOWNLOADED"; readonly from_bundle_id: string }
|
|
87
|
-
| {
|
|
88
|
-
readonly type: "UPDATE_APPLIED" | "RECOVERED";
|
|
89
|
-
readonly from_bundle_id: string;
|
|
90
|
-
}
|
|
91
|
-
/** An update that failed: `from` is the running bundle, `to` the target (for a check, the running bundle). */
|
|
92
|
-
| { readonly type: "UPDATE_FAILED"; readonly from_bundle_id: string }
|
|
93
|
-
| { readonly type: "UNCHANGED"; readonly from_bundle_id: null }
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
const isOptional = (
|
|
97
|
-
value: Readonly<Record<string, unknown>>,
|
|
98
|
-
key: string,
|
|
99
|
-
valid: (field: unknown) => boolean,
|
|
100
|
-
) => !Object.hasOwn(value, key) || valid(value[key]);
|
|
101
|
-
|
|
102
|
-
const isString = (value: unknown) => typeof value === "string";
|
|
103
|
-
|
|
104
|
-
/** An `UPDATE_FAILED` report's stored failure: a stage and a reason, and what else the client knew. */
|
|
105
|
-
const isDatabaseBundleEventFailure = (value: unknown): boolean =>
|
|
106
|
-
isDatabaseJsonObject(value) &&
|
|
107
|
-
isString(value.stage) &&
|
|
108
|
-
isString(value.reason) &&
|
|
109
|
-
isOptional(value, "resource", isString) &&
|
|
110
|
-
isOptional(value, "http_status", (status) => Number.isSafeInteger(status)) &&
|
|
111
|
-
isOptional(value, "transport", isString) &&
|
|
112
|
-
isOptional(value, "origin_code", isString) &&
|
|
113
|
-
isOptional(value, "previous_process_exit", isString);
|
|
114
|
-
|
|
115
|
-
export const isDatabaseBundleEventMetadata = (
|
|
116
|
-
value: unknown,
|
|
117
|
-
): value is DatabaseBundleEventMetadata =>
|
|
118
|
-
isDatabaseJsonObject(value) &&
|
|
119
|
-
typeof value.cohort === "string" &&
|
|
120
|
-
(value.update_strategy === null ||
|
|
121
|
-
value.update_strategy === "fingerprint" ||
|
|
122
|
-
value.update_strategy === "appVersion") &&
|
|
123
|
-
(value.fingerprint_hash === null ||
|
|
124
|
-
typeof value.fingerprint_hash === "string") &&
|
|
125
|
-
(value.sdk_version === null || typeof value.sdk_version === "string") &&
|
|
126
|
-
isOptional(value, "failure", isDatabaseBundleEventFailure) &&
|
|
127
|
-
isOptional(value, "delivery", isString) &&
|
|
128
|
-
isOptional(value, "patch_fallback", (flag) => typeof flag === "boolean") &&
|
|
129
|
-
isOptional(value, "previous_process_exit", isString);
|
|
130
|
-
|
|
131
|
-
export const isRecord = (
|
|
132
|
-
value: unknown,
|
|
133
|
-
): value is Readonly<Record<string, unknown>> =>
|
|
134
|
-
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
135
|
-
|
|
136
|
-
const isIdentity = (value: unknown): value is string =>
|
|
137
|
-
typeof value === "string" && value.length > 0 && value.length <= 255;
|
|
138
|
-
|
|
139
|
-
const isTextOrNull = (value: unknown) =>
|
|
140
|
-
value === null || typeof value === "string";
|
|
141
|
-
|
|
142
|
-
/** Each bundle event field and what it holds. */
|
|
143
|
-
const BUNDLE_EVENT_FIELDS: Readonly<
|
|
144
|
-
Record<string, (value: unknown) => boolean>
|
|
145
|
-
> = {
|
|
146
|
-
id: (value) => typeof value === "string",
|
|
147
|
-
type: (value) =>
|
|
148
|
-
value === "UPDATE_DOWNLOADED" ||
|
|
149
|
-
value === "UPDATE_APPLIED" ||
|
|
150
|
-
value === "RECOVERED" ||
|
|
151
|
-
value === "UPDATE_FAILED" ||
|
|
152
|
-
value === "UNCHANGED",
|
|
153
|
-
install_id: isIdentity,
|
|
154
|
-
user_id: (value) => value === null || isIdentity(value),
|
|
155
|
-
from_bundle_id: isTextOrNull,
|
|
156
|
-
from_release_id: isTextOrNull,
|
|
157
|
-
to_release_id: isTextOrNull,
|
|
158
|
-
to_bundle_id: (value) => typeof value === "string",
|
|
159
|
-
platform: (value) => value === "ios" || value === "android",
|
|
160
|
-
app_version: (value) => typeof value === "string",
|
|
161
|
-
channel: (value) => typeof value === "string",
|
|
162
|
-
metadata: isDatabaseBundleEventMetadata,
|
|
163
|
-
received_at_ms: (value) =>
|
|
164
|
-
typeof value === "number" && Number.isSafeInteger(value) && value >= 0,
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const updateStrategyOf = (row: Readonly<Record<string, unknown>>) =>
|
|
168
|
-
isRecord(row.metadata) ? row.metadata.update_strategy : undefined;
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* A movement, or a failed update, names the bundle it left and how the
|
|
172
|
-
* device updates, and a failed update says what failed; an unchanged report
|
|
173
|
-
* names neither.
|
|
174
|
-
*/
|
|
175
|
-
const hasEventInvariants = (row: Readonly<Record<string, unknown>>) =>
|
|
176
|
-
((row.type === "UPDATE_DOWNLOADED" ||
|
|
177
|
-
row.type === "UPDATE_APPLIED" ||
|
|
178
|
-
row.type === "RECOVERED" ||
|
|
179
|
-
row.type === "UPDATE_FAILED") &&
|
|
180
|
-
typeof row.from_bundle_id === "string" &&
|
|
181
|
-
(updateStrategyOf(row) === "fingerprint" ||
|
|
182
|
-
updateStrategyOf(row) === "appVersion") &&
|
|
183
|
-
(row.type !== "UPDATE_FAILED" ||
|
|
184
|
-
(isRecord(row.metadata) && isRecord(row.metadata.failure)))) ||
|
|
185
|
-
(row.type === "UNCHANGED" &&
|
|
186
|
-
row.from_bundle_id === null &&
|
|
187
|
-
updateStrategyOf(row) === null);
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Throws unless `row` has exactly the bundle event fields, each of its type,
|
|
191
|
-
* and the invariants of its event type: `invalid-field` for an unknown field,
|
|
192
|
-
* `invalid-data` for anything else.
|
|
193
|
-
*/
|
|
194
|
-
export const validateBundleEventFields = (row: unknown): void => {
|
|
195
|
-
if (!isRecord(row)) throw new DatabasePluginInputError("invalid-data");
|
|
196
|
-
for (const field of Object.keys(row)) {
|
|
197
|
-
if (!Object.hasOwn(BUNDLE_EVENT_FIELDS, field)) {
|
|
198
|
-
throw new DatabasePluginInputError("invalid-field");
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
for (const [field, valid] of Object.entries(BUNDLE_EVENT_FIELDS)) {
|
|
202
|
-
if (!Object.hasOwn(row, field) || !valid(row[field])) {
|
|
203
|
-
throw new DatabasePluginInputError("invalid-data");
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
if (!hasEventInvariants(row)) {
|
|
207
|
-
throw new DatabasePluginInputError("invalid-data");
|
|
208
|
-
}
|
|
209
|
-
};
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { DatabasePluginInputError } from "@hot-updater/plugin-core";
|
|
2
|
-
|
|
3
|
-
import { HotUpdaterConfigError } from "../../assembly/configError";
|
|
4
|
-
import { isDatabaseBusyError } from "../../database/busy";
|
|
5
|
-
import type { HotUpdaterDatabase } from "../../database/database";
|
|
6
|
-
import { definePlugin, type PluginEndpoint } from "../definePlugin";
|
|
7
|
-
import type { BundleEventRow } from "./eventRow";
|
|
8
|
-
import { createInsightsModel } from "./model";
|
|
9
|
-
import type {
|
|
10
|
-
InsightsCountEventsInput,
|
|
11
|
-
InsightsCountLatestEventsInput,
|
|
12
|
-
InsightsFindLatestEventsInput,
|
|
13
|
-
InsightsGetAppUsageInput,
|
|
14
|
-
InsightsGetReleaseActivityInput,
|
|
15
|
-
InsightsListEventsInput,
|
|
16
|
-
} from "./modelTypes";
|
|
17
|
-
import { createInsightsProvider } from "./provider";
|
|
18
|
-
import {
|
|
19
|
-
countEvents,
|
|
20
|
-
countLatestEvents,
|
|
21
|
-
findLatestEvents,
|
|
22
|
-
getAppUsage,
|
|
23
|
-
getReleaseActivity,
|
|
24
|
-
getUpdateFailures,
|
|
25
|
-
type InsightsUpdateFailuresInput,
|
|
26
|
-
listEvents,
|
|
27
|
-
} from "./reads";
|
|
28
|
-
import { recordEvent } from "./recordEvent";
|
|
29
|
-
import { createInsightsRouteHandlers, INSIGHTS_ROUTES } from "./routes";
|
|
30
|
-
import {
|
|
31
|
-
createInsightsSchema,
|
|
32
|
-
DAILY_RETENTION_DAYS,
|
|
33
|
-
type InsightsRetention,
|
|
34
|
-
type InsightsSchema,
|
|
35
|
-
RAW_RETENTION_DAYS,
|
|
36
|
-
} from "./schema";
|
|
37
|
-
|
|
38
|
-
export type * from "./domain";
|
|
39
|
-
export type {
|
|
40
|
-
BundleEventFailure,
|
|
41
|
-
BundleEventFailureReason,
|
|
42
|
-
BundleEventFailureStage,
|
|
43
|
-
BundleEventRow,
|
|
44
|
-
BundleEventRowBase,
|
|
45
|
-
DatabaseBundleEventMetadata,
|
|
46
|
-
} from "./eventRow";
|
|
47
|
-
export type {
|
|
48
|
-
InsightsFailureBreakdown,
|
|
49
|
-
InsightsUpdateFailures,
|
|
50
|
-
InsightsUpdateFailuresInput,
|
|
51
|
-
} from "./reads";
|
|
52
|
-
export { createInsightsModel } from "./model";
|
|
53
|
-
export type * from "./modelTypes";
|
|
54
|
-
export { createInsightsProvider } from "./provider";
|
|
55
|
-
export { insightsIdentity, type InsightsIdentityParts } from "./recordEvent";
|
|
56
|
-
export {
|
|
57
|
-
createInsightsSchema,
|
|
58
|
-
DEFAULT_INSIGHTS_RETENTION,
|
|
59
|
-
insightsSchema,
|
|
60
|
-
type InsightsRetention,
|
|
61
|
-
type InsightsSchema,
|
|
62
|
-
} from "./schema";
|
|
63
|
-
export type * from "./types";
|
|
64
|
-
|
|
65
|
-
const createInsightsApi = (
|
|
66
|
-
db: HotUpdaterDatabase<InsightsSchema>,
|
|
67
|
-
now: () => number,
|
|
68
|
-
retention: InsightsRetention,
|
|
69
|
-
) => ({
|
|
70
|
-
/** How long this plugin keeps its rows. */
|
|
71
|
-
retention,
|
|
72
|
-
/** Records one validated event row; a repeated id changes nothing. */
|
|
73
|
-
recordEvent: (event: BundleEventRow) => recordEvent(db, event),
|
|
74
|
-
listEvents: (input: InsightsListEventsInput) => listEvents(db, input),
|
|
75
|
-
findLatestEvents: (input: InsightsFindLatestEventsInput) =>
|
|
76
|
-
findLatestEvents(db, input),
|
|
77
|
-
countLatestEvents: (input: InsightsCountLatestEventsInput) =>
|
|
78
|
-
countLatestEvents(db, input),
|
|
79
|
-
countEvents: (input: InsightsCountEventsInput) => countEvents(db, input),
|
|
80
|
-
getReleaseActivity: (input: InsightsGetReleaseActivityInput) =>
|
|
81
|
-
getReleaseActivity(db, input, now, retention),
|
|
82
|
-
getAppUsage: (input: InsightsGetAppUsageInput) =>
|
|
83
|
-
getAppUsage(db, input, now, retention),
|
|
84
|
-
/** A release's or a channel's update failures, and their breakdown over a time range. */
|
|
85
|
-
getUpdateFailures: (input: InsightsUpdateFailuresInput) =>
|
|
86
|
-
getUpdateFailures(db, input, now, retention),
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
export type InsightsApi = ReturnType<typeof createInsightsApi>;
|
|
90
|
-
|
|
91
|
-
/** `GET /failures`'s query: a scope, an optional release, and a time range or none. */
|
|
92
|
-
const readFailuresQuery = (url: URL): InsightsUpdateFailuresInput => {
|
|
93
|
-
const query = url.searchParams;
|
|
94
|
-
const time = (name: string) => {
|
|
95
|
-
const value = query.get(name);
|
|
96
|
-
return value === null ? undefined : Number(value);
|
|
97
|
-
};
|
|
98
|
-
const [start, end] = [time("start"), time("end")];
|
|
99
|
-
const platform = query.get("platform");
|
|
100
|
-
const releaseId = query.get("releaseId");
|
|
101
|
-
if (
|
|
102
|
-
(platform !== "ios" && platform !== "android") ||
|
|
103
|
-
(start === undefined) !== (end === undefined)
|
|
104
|
-
) {
|
|
105
|
-
throw new DatabasePluginInputError("invalid-query");
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
platform,
|
|
109
|
-
channel: query.get("channel") ?? "",
|
|
110
|
-
...(releaseId === null ? {} : { releaseId }),
|
|
111
|
-
...(start === undefined ? {} : { timeRange: { start, end: end! } }),
|
|
112
|
-
};
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* The admin route of the update failures read: a release's (`releaseId`)
|
|
117
|
-
* since its first report, or over `start`–`end`, or a channel's over a range,
|
|
118
|
-
* which covers at most 30 days.
|
|
119
|
-
*/
|
|
120
|
-
const failuresEndpoint = (api: InsightsApi): PluginEndpoint => ({
|
|
121
|
-
access: "admin",
|
|
122
|
-
method: "GET",
|
|
123
|
-
path: "/failures",
|
|
124
|
-
handler: async (request) => {
|
|
125
|
-
try {
|
|
126
|
-
return Response.json(
|
|
127
|
-
await api.getUpdateFailures(readFailuresQuery(new URL(request.url))),
|
|
128
|
-
{ headers: { "cache-control": "private, no-store" } },
|
|
129
|
-
);
|
|
130
|
-
} catch (error) {
|
|
131
|
-
if (error instanceof DatabasePluginInputError) {
|
|
132
|
-
return Response.json(
|
|
133
|
-
{
|
|
134
|
-
error:
|
|
135
|
-
"Send platform and channel, and releaseId or start and end in epoch milliseconds, at most 30 days apart.",
|
|
136
|
-
},
|
|
137
|
-
{ status: 400 },
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
if (!isDatabaseBusyError(error)) throw error;
|
|
141
|
-
return Response.json(
|
|
142
|
-
{ error: "Service unavailable" },
|
|
143
|
-
{ status: 503, headers: { "retry-after": "5" } },
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
export interface InsightsOptions {
|
|
150
|
-
/**
|
|
151
|
-
* How long to keep rows, in whole days: `rawDays` (90 by default) for raw
|
|
152
|
-
* events and hourly rollups, `dailyDays` (400 by default) for daily
|
|
153
|
-
* rollups and each installation's latest event. Each is at least 1, and
|
|
154
|
-
* `dailyDays` at least `rawDays`.
|
|
155
|
-
*/
|
|
156
|
-
readonly retention?: Partial<InsightsRetention>;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const retentionOf = ({ retention }: InsightsOptions): InsightsRetention => {
|
|
160
|
-
const rawDays = retention?.rawDays ?? RAW_RETENTION_DAYS;
|
|
161
|
-
const dailyDays = retention?.dailyDays ?? DAILY_RETENTION_DAYS;
|
|
162
|
-
const whole = (days: number) => Number.isSafeInteger(days) && days >= 1;
|
|
163
|
-
if (!whole(rawDays) || !whole(dailyDays) || dailyDays < rawDays) {
|
|
164
|
-
throw new HotUpdaterConfigError(
|
|
165
|
-
`insights({ retention }) takes whole days of at least 1, with dailyDays at least rawDays; got rawDays ${rawDays} and dailyDays ${dailyDays}.`,
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
return { rawDays, dailyDays };
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Insights: bundle lifecycle events and update failures, each
|
|
173
|
-
* installation's latest event, and the counters, gauges, and sketches its
|
|
174
|
-
* reads come from, each kept for its retention. It serves `POST /events` to
|
|
175
|
-
* clients, and the Insights reads, update failures, and retention to admins.
|
|
176
|
-
*/
|
|
177
|
-
export const insights = (options: InsightsOptions = {}) => {
|
|
178
|
-
const retention = retentionOf(options);
|
|
179
|
-
return definePlugin({
|
|
180
|
-
id: "insights",
|
|
181
|
-
// Keeps its tables' names: bundle_events, bundle_event_heads, insights_*.
|
|
182
|
-
namespace: false,
|
|
183
|
-
// 1.2.0 adds update failures (their counters, sketches, and
|
|
184
|
-
// breakdown) and drops heads' hour-row compatibility, so a database
|
|
185
|
-
// migrates before a server serves it.
|
|
186
|
-
schemaVersion: "1.2.0",
|
|
187
|
-
schema: createInsightsSchema(retention),
|
|
188
|
-
init: ({ db, now }) => {
|
|
189
|
-
const api = createInsightsApi(db, now, retention);
|
|
190
|
-
const routes = createInsightsRouteHandlers(
|
|
191
|
-
createInsightsProvider(createInsightsModel(api)),
|
|
192
|
-
);
|
|
193
|
-
// Declared, so the plugin's type names no runtime's Response.
|
|
194
|
-
const endpoints: PluginEndpoint[] = [
|
|
195
|
-
...INSIGHTS_ROUTES.map(({ access, method, path, handler }) => ({
|
|
196
|
-
access,
|
|
197
|
-
method,
|
|
198
|
-
path,
|
|
199
|
-
handler: (
|
|
200
|
-
request: Request,
|
|
201
|
-
params: Readonly<Record<string, string>>,
|
|
202
|
-
) => routes[handler](params, request),
|
|
203
|
-
})),
|
|
204
|
-
failuresEndpoint(api),
|
|
205
|
-
{
|
|
206
|
-
access: "admin",
|
|
207
|
-
method: "GET",
|
|
208
|
-
path: "/retention",
|
|
209
|
-
handler: async () => Response.json(retention),
|
|
210
|
-
},
|
|
211
|
-
];
|
|
212
|
-
return { api, endpoints };
|
|
213
|
-
},
|
|
214
|
-
// Apps report their events through the SDK's Insights client plugin.
|
|
215
|
-
cli: {
|
|
216
|
-
clientPlugin: {
|
|
217
|
-
module: "@hot-updater/react-native/plugins/insights",
|
|
218
|
-
name: "insights",
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
};
|