@hot-updater/cloudflare 1.0.0-rc.5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +90 -924
- package/dist/index.d.cts +16 -6
- package/dist/index.d.mts +16 -6
- package/dist/index.mjs +91 -926
- package/dist/init/index.cjs +11777 -0
- package/dist/init/index.d.cts +5 -1
- package/dist/init/index.d.mts +5 -1
- package/dist/init/index.mjs +11771 -1
- package/dist/worker/index.cjs +117 -916
- package/dist/worker/index.d.cts +45 -11
- package/dist/worker/index.d.mts +45 -11
- package/dist/worker/index.mjs +118 -917
- package/package.json +9 -14
- package/sql/bundles.sql +121 -212
- package/src/d1Database.ts +58 -43
- package/src/d1Executor.ts +84 -0
- package/src/d1Schema.ts +26 -0
- package/src/presignR2Url.ts +103 -0
- package/src/r2S3Storage.ts +20 -19
- package/src/r2Storage.ts +5 -3
- package/src/r2WorkerStorage.ts +55 -17
- package/src/worker/d1Database.ts +21 -39
- package/worker/dist/README.md +1 -1
- package/worker/dist/index.js +9859 -5696
- package/worker/dist/index.js.map +4 -4
- package/worker/migrations/0001_hot-updater_1.0.0.sql +121 -222
- package/worker/src/index.ts +15 -9
- package/worker/wrangler.json +1 -0
- package/dist/iac/index.cjs +0 -12687
- package/dist/iac/index.d.cts +0 -5
- package/dist/iac/index.d.mts +0 -5
- package/dist/iac/index.mjs +0 -12679
- package/src/d1Database.spec.ts +0 -277
- package/src/d1Implementation.spec.ts +0 -342
- package/src/d1Implementation.ts +0 -781
- package/src/d1Query.spec.ts +0 -46
- package/src/d1Query.ts +0 -92
- package/src/d1Rows.spec.ts +0 -143
- package/src/d1Rows.ts +0 -357
- package/src/d1Sql.spec.ts +0 -30
- package/src/d1Sql.ts +0 -175
- package/src/r2Storage.spec.ts +0 -346
- package/src/r2WorkerStorage.spec.ts +0 -184
- package/src/utils/createWrangler.spec.ts +0 -75
- package/src/worker/d1Database.spec.ts +0 -69
- package/worker/src/databaseMigration.integration.spec.ts +0 -191
- package/worker/src/databasePlugins.integration.spec.ts +0 -326
- package/worker/src/index.integration.spec.ts +0 -190
- package/worker/src/insightsMovement.integration.spec.ts +0 -73
- package/worker/src/storagePlugin.integration.spec.ts +0 -59
- package/worker/src/testWorker.ts +0 -5
|
@@ -1,222 +1,121 @@
|
|
|
1
|
-
-- HotUpdater
|
|
2
|
-
|
|
3
|
-
CREATE TABLE
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
);
|
|
86
|
-
|
|
87
|
-
CREATE
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
from_bundle_id TEXT,
|
|
123
|
-
to_release_id TEXT,
|
|
124
|
-
to_bundle_id TEXT NOT NULL,
|
|
125
|
-
platform TEXT NOT NULL,
|
|
126
|
-
app_version TEXT NOT NULL,
|
|
127
|
-
channel TEXT NOT NULL,
|
|
128
|
-
cohort TEXT NOT NULL,
|
|
129
|
-
update_strategy TEXT,
|
|
130
|
-
fingerprint_hash TEXT,
|
|
131
|
-
sdk_version TEXT,
|
|
132
|
-
received_at_ms REAL NOT NULL,
|
|
133
|
-
CONSTRAINT bundle_events_type_check CHECK (
|
|
134
|
-
type IN ('UPDATE_APPLIED', 'RECOVERED', 'UNCHANGED')
|
|
135
|
-
),
|
|
136
|
-
CONSTRAINT bundle_events_platform_check CHECK (
|
|
137
|
-
platform IN ('ios', 'android')
|
|
138
|
-
),
|
|
139
|
-
CONSTRAINT bundle_events_shape_check CHECK (
|
|
140
|
-
(
|
|
141
|
-
type IN ('UPDATE_APPLIED', 'RECOVERED')
|
|
142
|
-
AND from_bundle_id IS NOT NULL
|
|
143
|
-
AND update_strategy IS NOT NULL
|
|
144
|
-
AND update_strategy IN ('fingerprint', 'appVersion')
|
|
145
|
-
) OR (
|
|
146
|
-
type = 'UNCHANGED'
|
|
147
|
-
AND from_bundle_id IS NULL
|
|
148
|
-
AND update_strategy IS NULL
|
|
149
|
-
)
|
|
150
|
-
),
|
|
151
|
-
CONSTRAINT bundle_events_received_at_check CHECK (received_at_ms >= 0)
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
CREATE TABLE bundle_installations (
|
|
155
|
-
install_id TEXT PRIMARY KEY NOT NULL,
|
|
156
|
-
id TEXT NOT NULL,
|
|
157
|
-
user_id TEXT,
|
|
158
|
-
username TEXT,
|
|
159
|
-
to_bundle_id TEXT NOT NULL,
|
|
160
|
-
type TEXT NOT NULL,
|
|
161
|
-
platform TEXT NOT NULL,
|
|
162
|
-
app_version TEXT NOT NULL,
|
|
163
|
-
channel TEXT NOT NULL,
|
|
164
|
-
cohort TEXT NOT NULL,
|
|
165
|
-
received_at_ms REAL NOT NULL,
|
|
166
|
-
CONSTRAINT bundle_installations_type_check CHECK (
|
|
167
|
-
type IN ('UPDATE_APPLIED', 'RECOVERED', 'UNCHANGED')
|
|
168
|
-
),
|
|
169
|
-
CONSTRAINT bundle_installations_platform_check CHECK (
|
|
170
|
-
platform IN ('ios', 'android')
|
|
171
|
-
),
|
|
172
|
-
CONSTRAINT bundle_installations_received_at_check CHECK (received_at_ms >= 0)
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
CREATE TABLE api_keys (
|
|
176
|
-
id TEXT PRIMARY KEY NOT NULL,
|
|
177
|
-
hash TEXT NOT NULL,
|
|
178
|
-
name TEXT NOT NULL,
|
|
179
|
-
prefix TEXT NOT NULL,
|
|
180
|
-
role TEXT NOT NULL,
|
|
181
|
-
created_at_ms REAL NOT NULL,
|
|
182
|
-
revoked_at_ms REAL,
|
|
183
|
-
CONSTRAINT api_keys_role_check CHECK (role = 'client'),
|
|
184
|
-
CONSTRAINT api_keys_created_at_check CHECK (created_at_ms >= 0),
|
|
185
|
-
CONSTRAINT api_keys_revoked_at_check
|
|
186
|
-
CHECK (revoked_at_ms IS NULL OR revoked_at_ms >= 0)
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
CREATE TABLE private_hot_updater_settings (
|
|
190
|
-
key TEXT PRIMARY KEY NOT NULL,
|
|
191
|
-
value TEXT NOT NULL DEFAULT '1.0.0'
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
CREATE UNIQUE INDEX channels_name_key ON channels(name);
|
|
195
|
-
CREATE INDEX bundle_patches_bundle_id_idx ON bundle_patches(bundle_id);
|
|
196
|
-
CREATE INDEX bundle_patches_base_bundle_id_idx ON bundle_patches(base_bundle_id);
|
|
197
|
-
CREATE INDEX releases_scope_order_idx ON releases(scope_key, id);
|
|
198
|
-
CREATE INDEX releases_channel_platform_order_idx
|
|
199
|
-
ON releases(channel_id, platform, id);
|
|
200
|
-
CREATE INDEX releases_bundle_id_idx ON releases(bundle_id);
|
|
201
|
-
CREATE INDEX releases_fingerprint_hash_idx ON releases(fingerprint_hash);
|
|
202
|
-
CREATE INDEX releases_enabled_idx ON releases(enabled);
|
|
203
|
-
CREATE INDEX release_catalogs_channel_idx ON release_catalogs(channel_id);
|
|
204
|
-
CREATE INDEX bundle_events_received_at_idx
|
|
205
|
-
ON bundle_events(received_at_ms, id);
|
|
206
|
-
CREATE INDEX bundle_events_install_idx
|
|
207
|
-
ON bundle_events(install_id, type, received_at_ms, id);
|
|
208
|
-
CREATE INDEX bundle_installations_user_id_idx
|
|
209
|
-
ON bundle_installations(user_id, install_id);
|
|
210
|
-
CREATE INDEX bundle_installations_received_at_idx
|
|
211
|
-
ON bundle_installations(received_at_ms);
|
|
212
|
-
CREATE INDEX bundle_events_from_bundle_idx ON bundle_events(type, platform, channel, from_bundle_id, received_at_ms, id);
|
|
213
|
-
CREATE INDEX bundle_events_to_bundle_idx ON bundle_events(type, platform, channel, to_bundle_id, received_at_ms, id);
|
|
214
|
-
CREATE INDEX bundle_installations_scope_idx ON bundle_installations(platform, channel, received_at_ms);
|
|
215
|
-
CREATE INDEX bundle_installations_bundle_idx ON bundle_installations(platform, channel, to_bundle_id, received_at_ms);
|
|
216
|
-
CREATE UNIQUE INDEX api_keys_hash_key ON api_keys(hash);
|
|
217
|
-
CREATE INDEX api_keys_created_at_idx
|
|
218
|
-
ON api_keys(created_at_ms, id);
|
|
219
|
-
|
|
220
|
-
INSERT INTO private_hot_updater_settings (key, value)
|
|
221
|
-
VALUES ('schema.core', '1.0.0')
|
|
222
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value;
|
|
1
|
+
-- HotUpdater.schema
|
|
2
|
+
|
|
3
|
+
CREATE TABLE IF NOT EXISTS "_hu_write" ("id" TEXT NOT NULL, "failed_op" INTEGER, PRIMARY KEY ("id"));
|
|
4
|
+
|
|
5
|
+
CREATE TABLE IF NOT EXISTS "bundles" ("id" TEXT NOT NULL, "platform" TEXT NOT NULL, "git_commit_hash" TEXT, "metadata" TEXT NOT NULL, "manifest_storage_uri" TEXT NOT NULL, "manifest_file_hash" TEXT NOT NULL, "asset_base_storage_uri" TEXT NOT NULL, "_refs_bundle_patches_bundle_id" INTEGER NOT NULL DEFAULT 0, "_refs_bundle_patches_base_bundle_id" INTEGER NOT NULL DEFAULT 0, "_refs_releases_bundle_id" INTEGER NOT NULL DEFAULT 0, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
6
|
+
|
|
7
|
+
CREATE INDEX IF NOT EXISTS "bundles_byPlatform" ON "bundles" ("platform", "id");
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS "bundle_patches" ("id" TEXT NOT NULL, "bundle_id" TEXT NOT NULL, "base_bundle_id" TEXT NOT NULL, "base_file_hash" TEXT NOT NULL, "patch_file_hash" TEXT NOT NULL, "patch_storage_uri" TEXT NOT NULL, "byte_size" INTEGER NOT NULL, "order_index" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
10
|
+
|
|
11
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "bundle_patches_pair" ON "bundle_patches" ("bundle_id", "base_bundle_id");
|
|
12
|
+
|
|
13
|
+
CREATE INDEX IF NOT EXISTS "bundle_patches_byBundle" ON "bundle_patches" ("bundle_id", "order_index", "id");
|
|
14
|
+
|
|
15
|
+
CREATE INDEX IF NOT EXISTS "bundle_patches_byBase" ON "bundle_patches" ("base_bundle_id", "bundle_id", "id");
|
|
16
|
+
|
|
17
|
+
CREATE TABLE IF NOT EXISTS "releases" ("id" TEXT NOT NULL, "revision" INTEGER NOT NULL, "scope_key" TEXT NOT NULL, "channel_id" TEXT NOT NULL, "platform" TEXT NOT NULL, "kind" TEXT NOT NULL, "bundle_id" TEXT, "strategy" TEXT NOT NULL, "target_app_version" TEXT, "fingerprint_hash" TEXT, "enabled" INTEGER NOT NULL, "should_force_update" INTEGER NOT NULL, "message" TEXT, "rollout_cohort_count" INTEGER NOT NULL, "target_cohorts" TEXT NOT NULL, "operation" TEXT NOT NULL, "source_release_id" TEXT, "created_at_ms" INTEGER NOT NULL, "updated_at_ms" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
18
|
+
|
|
19
|
+
CREATE INDEX IF NOT EXISTS "releases_byScope" ON "releases" ("scope_key", "id");
|
|
20
|
+
|
|
21
|
+
CREATE INDEX IF NOT EXISTS "releases_byScopeEnabled" ON "releases" ("scope_key", "enabled", "id");
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS "releases_byChannelPlatform" ON "releases" ("channel_id", "platform", "id");
|
|
24
|
+
|
|
25
|
+
CREATE INDEX IF NOT EXISTS "releases_byChannelPlatformEnabled" ON "releases" ("channel_id", "platform", "enabled", "id");
|
|
26
|
+
|
|
27
|
+
CREATE INDEX IF NOT EXISTS "releases_byBundle" ON "releases" ("bundle_id", "id");
|
|
28
|
+
|
|
29
|
+
CREATE TABLE IF NOT EXISTS "release_catalogs" ("scope_key" TEXT NOT NULL, "catalog_id" TEXT NOT NULL, "strategy" TEXT NOT NULL, "channel_id" TEXT NOT NULL, "channel_key" TEXT NOT NULL, "platform" TEXT NOT NULL, "fingerprint_hash" TEXT, "generation" INTEGER NOT NULL, "payload" TEXT NOT NULL, "catalog_hash" TEXT NOT NULL, "byte_size" INTEGER NOT NULL, "is_tombstone" INTEGER NOT NULL, "updated_at_ms" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("scope_key"));
|
|
30
|
+
|
|
31
|
+
CREATE TABLE IF NOT EXISTS "channels" ("id" TEXT NOT NULL, "name" TEXT NOT NULL, "_refs_releases_channel_id" INTEGER NOT NULL DEFAULT 0, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
32
|
+
|
|
33
|
+
CREATE INDEX IF NOT EXISTS "channels_all" ON "channels" ("name", "id");
|
|
34
|
+
|
|
35
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "channels_name" ON "channels" ("name");
|
|
36
|
+
|
|
37
|
+
CREATE TABLE IF NOT EXISTS "bundle_totals" ("platform_key" TEXT NOT NULL, "_shard" INTEGER NOT NULL, "bundles" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("platform_key", "_shard"));
|
|
38
|
+
|
|
39
|
+
CREATE TABLE IF NOT EXISTS "bundle_events" ("id" TEXT NOT NULL, "type" TEXT NOT NULL, "install_id" TEXT NOT NULL, "user_id" TEXT, "from_release_id" TEXT, "from_bundle_id" TEXT, "to_release_id" TEXT, "to_bundle_id" TEXT NOT NULL, "platform" TEXT NOT NULL, "app_version" TEXT NOT NULL, "channel" TEXT NOT NULL, "metadata" TEXT NOT NULL, "received_at_ms" INTEGER NOT NULL, "day" INTEGER, "movement_install_id" TEXT, "bundle_ref" TEXT, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
40
|
+
|
|
41
|
+
CREATE INDEX IF NOT EXISTS "bundle_events_movementsByInstall" ON "bundle_events" ("movement_install_id", "received_at_ms", "id");
|
|
42
|
+
|
|
43
|
+
CREATE TABLE IF NOT EXISTS "bundle_events__byBundle" ("platform" TEXT NOT NULL, "channel" TEXT NOT NULL, "type" TEXT NOT NULL, "bundle_ref" TEXT NOT NULL, "day" INTEGER NOT NULL, "received_at_ms" INTEGER NOT NULL, "id" TEXT NOT NULL, PRIMARY KEY ("platform", "channel", "type", "bundle_ref", "day", "received_at_ms", "id"));
|
|
44
|
+
|
|
45
|
+
CREATE INDEX IF NOT EXISTS "bundle_events_byDay" ON "bundle_events" ("day", "received_at_ms", "id");
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS "bundle_event_heads" ("install_id" TEXT NOT NULL, "id" TEXT NOT NULL, "type" TEXT NOT NULL, "user_id" TEXT, "from_release_id" TEXT, "from_bundle_id" TEXT, "to_release_id" TEXT, "to_bundle_id" TEXT NOT NULL, "platform" TEXT NOT NULL, "app_version" TEXT NOT NULL, "channel" TEXT NOT NULL, "metadata" TEXT NOT NULL, "received_at_ms" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("install_id"));
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS "bundle_event_heads_byUser" ON "bundle_event_heads" ("user_id", "install_id");
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS "bundle_event_heads__retention" ON "bundle_event_heads" ("received_at_ms", "install_id");
|
|
52
|
+
|
|
53
|
+
CREATE TABLE IF NOT EXISTS "insights_overview" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "downloads" INTEGER NOT NULL, "failed_launches" INTEGER NOT NULL, "patch_downloads" INTEGER NOT NULL, "patch_fallbacks" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
54
|
+
|
|
55
|
+
CREATE INDEX IF NOT EXISTS "insights_overview__retention" ON "insights_overview" ("bucket_start_ms", "identity", "_shard");
|
|
56
|
+
|
|
57
|
+
CREATE TABLE IF NOT EXISTS "insights_sketches" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "activity_users" TEXT, "failed_users" TEXT, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
58
|
+
|
|
59
|
+
CREATE INDEX IF NOT EXISTS "insights_sketches__retention" ON "insights_sketches" ("bucket_start_ms", "identity", "_shard");
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS "insights_overview_daily" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "downloads" INTEGER NOT NULL, "failed_launches" INTEGER NOT NULL, "patch_downloads" INTEGER NOT NULL, "patch_fallbacks" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
62
|
+
|
|
63
|
+
CREATE INDEX IF NOT EXISTS "insights_overview_daily__retention" ON "insights_overview_daily" ("bucket_start_ms", "identity", "_shard");
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS "insights_sketches_daily" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "activity_users" TEXT, "failed_users" TEXT, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
66
|
+
|
|
67
|
+
CREATE INDEX IF NOT EXISTS "insights_sketches_daily__retention" ON "insights_sketches_daily" ("bucket_start_ms", "identity", "_shard");
|
|
68
|
+
|
|
69
|
+
CREATE TABLE IF NOT EXISTS "insights_overview_lifetime" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "downloads" INTEGER NOT NULL, "failed_launches" INTEGER NOT NULL, "patch_downloads" INTEGER NOT NULL, "patch_fallbacks" INTEGER NOT NULL, "applies" INTEGER NOT NULL, "failed_updates" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
70
|
+
|
|
71
|
+
CREATE TABLE IF NOT EXISTS "insights_sketches_lifetime" ("identity" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "failed_users" TEXT, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("identity", "bucket_start_ms", "_shard"));
|
|
72
|
+
|
|
73
|
+
CREATE TABLE IF NOT EXISTS "insights_distribution" ("channel" TEXT NOT NULL, "platform" TEXT NOT NULL, "app_version" TEXT NOT NULL, "release_id" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "latest_installations" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("channel", "platform", "app_version", "release_id", "bucket_start_ms", "_shard"));
|
|
74
|
+
|
|
75
|
+
CREATE INDEX IF NOT EXISTS "insights_distribution_byScope" ON "insights_distribution" ("channel", "platform", "bucket_start_ms", "app_version", "release_id", "_shard");
|
|
76
|
+
|
|
77
|
+
CREATE INDEX IF NOT EXISTS "insights_distribution_byVersion" ON "insights_distribution" ("channel", "platform", "app_version", "bucket_start_ms", "release_id", "_shard");
|
|
78
|
+
|
|
79
|
+
CREATE INDEX IF NOT EXISTS "insights_distribution__retention" ON "insights_distribution" ("bucket_start_ms", "channel", "platform", "app_version", "release_id", "_shard");
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS "insights_builtin_distribution" ("channel" TEXT NOT NULL, "platform" TEXT NOT NULL, "app_version" TEXT NOT NULL, "release_id" TEXT NOT NULL, "builtin_bundle_id" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "latest_installations" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("channel", "platform", "app_version", "release_id", "builtin_bundle_id", "bucket_start_ms", "_shard"));
|
|
82
|
+
|
|
83
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution_byScope" ON "insights_builtin_distribution" ("channel", "platform", "bucket_start_ms", "app_version", "release_id", "builtin_bundle_id", "_shard");
|
|
84
|
+
|
|
85
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution_byVersion" ON "insights_builtin_distribution" ("channel", "platform", "app_version", "bucket_start_ms", "release_id", "builtin_bundle_id", "_shard");
|
|
86
|
+
|
|
87
|
+
CREATE INDEX IF NOT EXISTS "insights_builtin_distribution__retention" ON "insights_builtin_distribution" ("bucket_start_ms", "channel", "platform", "app_version", "release_id", "builtin_bundle_id", "_shard");
|
|
88
|
+
|
|
89
|
+
CREATE TABLE IF NOT EXISTS "insights_latest_by_bundle" ("platform" TEXT NOT NULL, "channel" TEXT NOT NULL, "bundle_field" TEXT NOT NULL, "bundle_id" TEXT NOT NULL, "type" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "installations" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("platform", "channel", "bundle_field", "bundle_id", "type", "bucket_start_ms", "_shard"));
|
|
90
|
+
|
|
91
|
+
CREATE INDEX IF NOT EXISTS "insights_latest_by_bundle__retention" ON "insights_latest_by_bundle" ("bucket_start_ms", "platform", "channel", "bundle_field", "bundle_id", "type", "_shard");
|
|
92
|
+
|
|
93
|
+
CREATE TABLE IF NOT EXISTS "insights_outcomes" ("platform" TEXT NOT NULL, "channel" TEXT NOT NULL, "type" TEXT NOT NULL, "bundle_ref" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "_shard" INTEGER NOT NULL, "events" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("platform", "channel", "type", "bundle_ref", "bucket_start_ms", "_shard"));
|
|
94
|
+
|
|
95
|
+
CREATE INDEX IF NOT EXISTS "insights_outcomes__retention" ON "insights_outcomes" ("bucket_start_ms", "platform", "channel", "type", "bundle_ref", "_shard");
|
|
96
|
+
|
|
97
|
+
CREATE TABLE IF NOT EXISTS "insights_failures" ("platform" TEXT NOT NULL, "channel" TEXT NOT NULL, "bucket_start_ms" INTEGER NOT NULL, "release_id" TEXT NOT NULL, "stage" TEXT NOT NULL, "reason" TEXT NOT NULL, "detail" TEXT NOT NULL, "_shard" INTEGER NOT NULL, "events" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("platform", "channel", "bucket_start_ms", "release_id", "stage", "reason", "detail", "_shard"));
|
|
98
|
+
|
|
99
|
+
CREATE INDEX IF NOT EXISTS "insights_failures__retention" ON "insights_failures" ("bucket_start_ms", "platform", "channel", "release_id", "stage", "reason", "detail", "_shard");
|
|
100
|
+
|
|
101
|
+
CREATE TABLE IF NOT EXISTS "api_keys" ("id" TEXT NOT NULL, "hash" TEXT NOT NULL, "name" TEXT NOT NULL, "prefix" TEXT NOT NULL, "role" TEXT NOT NULL, "created_at_ms" INTEGER NOT NULL, "revoked_at_ms" INTEGER, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
102
|
+
|
|
103
|
+
CREATE INDEX IF NOT EXISTS "api_keys_byCreated" ON "api_keys" ("created_at_ms", "id");
|
|
104
|
+
|
|
105
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "api_keys_hash" ON "api_keys" ("hash");
|
|
106
|
+
|
|
107
|
+
CREATE TABLE IF NOT EXISTS "remote_config_active" ("id" TEXT NOT NULL, "version" INTEGER NOT NULL, "template" TEXT NOT NULL, "updated_at_ms" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id"));
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS "remote_config_versions" ("version" INTEGER NOT NULL, "template" TEXT NOT NULL, "description" TEXT, "update_type" TEXT NOT NULL, "rollback_source" INTEGER, "created_at_ms" INTEGER NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("version"));
|
|
110
|
+
|
|
111
|
+
CREATE TABLE IF NOT EXISTS "private_hot_updater_settings" ("key" TEXT NOT NULL, "value" TEXT NOT NULL, "_v" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("key"));
|
|
112
|
+
|
|
113
|
+
INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.engine', '1', 0) ON CONFLICT ("key") DO UPDATE SET "value" = excluded."value";
|
|
114
|
+
|
|
115
|
+
INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.core', '1.0.0', 0) ON CONFLICT ("key") DO UPDATE SET "value" = excluded."value";
|
|
116
|
+
|
|
117
|
+
INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.insights', '1.0.0', 0) ON CONFLICT ("key") DO UPDATE SET "value" = excluded."value";
|
|
118
|
+
|
|
119
|
+
INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.apiKeys', '1.0.0', 0) ON CONFLICT ("key") DO UPDATE SET "value" = excluded."value";
|
|
120
|
+
|
|
121
|
+
INSERT INTO "private_hot_updater_settings" ("key", "value", "_v") VALUES ('schema.remoteConfig', '1.0.0', 0) ON CONFLICT ("key") DO UPDATE SET "value" = excluded."value";
|
package/worker/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHotUpdater } from "@hot-updater/server";
|
|
2
|
+
import { apiKeys, insights, remoteConfig } from "@hot-updater/server/plugins";
|
|
2
3
|
import { env } from "cloudflare:workers";
|
|
3
4
|
import { Hono } from "hono";
|
|
4
5
|
|
|
@@ -11,21 +12,26 @@ export type CloudflareWorkerEnv = {
|
|
|
11
12
|
};
|
|
12
13
|
BUCKET: R2Bucket;
|
|
13
14
|
BUCKET_NAME: string;
|
|
14
|
-
|
|
15
|
+
ACCOUNT_ID: string;
|
|
16
|
+
R2_ACCESS_KEY_ID: string;
|
|
17
|
+
R2_SECRET_ACCESS_KEY: string;
|
|
15
18
|
};
|
|
16
19
|
|
|
17
20
|
export const HOT_UPDATER_BASE_PATH = "/";
|
|
18
21
|
|
|
19
22
|
const hotUpdater = createHotUpdater({
|
|
20
23
|
database: d1Database(env.DB),
|
|
21
|
-
|
|
22
|
-
storage:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
plugins: [insights(), apiKeys(), remoteConfig()],
|
|
25
|
+
storage: r2Storage({
|
|
26
|
+
bucket: env.BUCKET,
|
|
27
|
+
bucketName: env.BUCKET_NAME,
|
|
28
|
+
// Presign download URLs, so devices download from R2.
|
|
29
|
+
accountId: env.ACCOUNT_ID,
|
|
30
|
+
credentials: {
|
|
31
|
+
accessKeyId: env.R2_ACCESS_KEY_ID,
|
|
32
|
+
secretAccessKey: env.R2_SECRET_ACCESS_KEY,
|
|
33
|
+
},
|
|
34
|
+
}),
|
|
29
35
|
});
|
|
30
36
|
|
|
31
37
|
const app = new Hono<{ Bindings: CloudflareWorkerEnv }>();
|