@hot-updater/cloudflare 0.36.6 → 1.0.0-rc.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/iac/index.cjs +989 -11
- package/dist/iac/index.mjs +992 -15
- package/dist/index.cjs +919 -6989
- package/dist/index.d.cts +11 -47
- package/dist/index.d.mts +11 -47
- package/dist/index.mjs +917 -7006
- package/dist/worker/index.cjs +898 -336
- package/dist/worker/index.d.cts +18 -33
- package/dist/worker/index.d.mts +18 -33
- package/dist/worker/index.mjs +899 -331
- package/package.json +7 -10
- package/sql/bundles.sql +183 -35
- package/src/d1Database.spec.ts +143 -392
- package/src/d1Database.ts +55 -650
- package/src/d1Implementation.spec.ts +252 -0
- package/src/d1Implementation.ts +742 -0
- package/src/d1Query.spec.ts +46 -0
- package/src/d1Query.ts +89 -0
- package/src/d1Rows.spec.ts +111 -0
- package/src/d1Rows.ts +326 -0
- package/src/d1Sql.spec.ts +30 -0
- package/src/d1Sql.ts +175 -0
- package/src/r2S3Storage.ts +93 -137
- package/src/r2Storage.spec.ts +120 -218
- package/src/r2Storage.ts +13 -61
- package/src/r2WorkerStorage.spec.ts +161 -50
- package/src/r2WorkerStorage.ts +85 -118
- package/src/worker/d1Database.spec.ts +33 -0
- package/src/worker/d1Database.ts +52 -0
- package/src/worker/index.ts +3 -31
- package/worker/dist/README.md +1 -1
- package/worker/dist/index.js +5968 -4701
- package/worker/dist/index.js.map +4 -4
- package/worker/migrations/0001_hot-updater_1.0.0.sql +197 -0
- package/worker/migrations/0002_hot-updater_artifact_byte_sizes.sql +11 -0
- package/worker/src/databaseMigration.integration.spec.ts +114 -0
- package/worker/src/databasePlugins.integration.spec.ts +292 -0
- package/worker/src/index.integration.spec.ts +102 -294
- package/worker/src/index.ts +14 -66
- package/worker/src/storagePlugin.integration.spec.ts +59 -0
- package/worker/wrangler.json +5 -2
- package/src/cloudflareWorkerDatabase.spec.ts +0 -260
- package/src/cloudflareWorkerDatabase.ts +0 -651
- package/src/r2WranglerStorage.ts +0 -193
- package/worker/migrations/0001_hot-updater_init.sql +0 -16
- package/worker/migrations/0002_hot-updater_0.13.0.sql +0 -8
- package/worker/migrations/0003_hot-updater_0.18.0.sql +0 -38
- package/worker/migrations/0004_hot-updater_0.29.0.sql +0 -11
- package/worker/migrations/0005_hot-updater_0.31.0.sql +0 -24
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/cloudflare",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0-rc.0",
|
|
5
5
|
"description": "React Native OTA solution for self-hosted",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
7
7
|
"module": "dist/index.mjs",
|
|
@@ -57,15 +57,13 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@aws-sdk/client-s3": "3.1066.0",
|
|
59
59
|
"@aws-sdk/lib-storage": "3.1008.0",
|
|
60
|
-
"@aws-sdk/s3-request-presigner": "3.1008.0",
|
|
61
60
|
"cloudflare": "4.2.0",
|
|
62
61
|
"hono": "4.12.34",
|
|
63
62
|
"uuidv7": "^1.0.2",
|
|
64
|
-
"@hot-updater/
|
|
65
|
-
"@hot-updater/plugin-core": "0.
|
|
66
|
-
"@hot-updater/server": "0.
|
|
67
|
-
"@hot-updater/
|
|
68
|
-
"@hot-updater/core": "0.36.6"
|
|
63
|
+
"@hot-updater/core": "1.0.0-rc.0",
|
|
64
|
+
"@hot-updater/plugin-core": "1.0.0-rc.0",
|
|
65
|
+
"@hot-updater/server": "1.0.0-rc.0",
|
|
66
|
+
"@hot-updater/cli-tools": "1.0.0-rc.0"
|
|
69
67
|
},
|
|
70
68
|
"devDependencies": {
|
|
71
69
|
"@cloudflare/vitest-pool-workers": "0.13.0",
|
|
@@ -74,15 +72,14 @@
|
|
|
74
72
|
"dayjs": "^1.11.13",
|
|
75
73
|
"execa": "9.5.2",
|
|
76
74
|
"mime": "^4.0.4",
|
|
77
|
-
"pg-minify": "^1.6.5",
|
|
78
75
|
"toml": "^3.0.0",
|
|
79
76
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
80
77
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
81
78
|
"verkit": "0.3.2",
|
|
82
79
|
"vitest": "4.1.4",
|
|
83
|
-
"wrangler": "^4.
|
|
80
|
+
"wrangler": "^4.69.0",
|
|
84
81
|
"xdg-app-paths": "^8.3.0",
|
|
85
|
-
"@hot-updater/test-utils": "0.
|
|
82
|
+
"@hot-updater/test-utils": "1.0.0-rc.0"
|
|
86
83
|
},
|
|
87
84
|
"scripts": {
|
|
88
85
|
"build": "tsdown && pnpm build:worker",
|
package/sql/bundles.sql
CHANGED
|
@@ -1,42 +1,190 @@
|
|
|
1
|
-
|
|
1
|
+
CREATE TABLE channels (
|
|
2
|
+
id TEXT COLLATE BINARY PRIMARY KEY NOT NULL,
|
|
3
|
+
name TEXT COLLATE BINARY NOT NULL,
|
|
4
|
+
CONSTRAINT channels_id_length_check CHECK (length(id) BETWEEN 1 AND 255),
|
|
5
|
+
CONSTRAINT channels_name_length_check CHECK (length(name) BETWEEN 1 AND 255)
|
|
6
|
+
);
|
|
2
7
|
|
|
3
8
|
CREATE TABLE bundles (
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
manifest_file_hash TEXT,
|
|
18
|
-
asset_base_storage_uri TEXT,
|
|
19
|
-
rollout_cohort_count INTEGER DEFAULT 1000
|
|
20
|
-
CHECK (rollout_cohort_count >= 0 AND rollout_cohort_count <= 1000),
|
|
21
|
-
target_cohorts TEXT,
|
|
22
|
-
CHECK ((target_app_version IS NOT NULL) OR (fingerprint_hash IS NOT NULL))
|
|
9
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
10
|
+
platform TEXT NOT NULL,
|
|
11
|
+
file_hash TEXT NOT NULL,
|
|
12
|
+
git_commit_hash TEXT,
|
|
13
|
+
storage_uri TEXT NOT NULL,
|
|
14
|
+
archive_byte_size REAL NOT NULL,
|
|
15
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
16
|
+
manifest_storage_uri TEXT,
|
|
17
|
+
manifest_file_hash TEXT,
|
|
18
|
+
asset_base_storage_uri TEXT,
|
|
19
|
+
CONSTRAINT bundles_archive_byte_size_check CHECK (
|
|
20
|
+
archive_byte_size >= 0 AND archive_byte_size <= 9007199254740991
|
|
21
|
+
)
|
|
23
22
|
);
|
|
24
23
|
|
|
25
24
|
CREATE TABLE bundle_patches (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
26
|
+
bundle_id TEXT NOT NULL,
|
|
27
|
+
base_bundle_id TEXT NOT NULL,
|
|
28
|
+
base_file_hash TEXT NOT NULL,
|
|
29
|
+
patch_file_hash TEXT NOT NULL,
|
|
30
|
+
patch_storage_uri TEXT NOT NULL,
|
|
31
|
+
byte_size REAL NOT NULL,
|
|
32
|
+
order_index INTEGER NOT NULL DEFAULT 0,
|
|
33
|
+
CONSTRAINT bundle_patches_byte_size_check CHECK (
|
|
34
|
+
byte_size >= 0 AND byte_size <= 9007199254740991
|
|
35
|
+
),
|
|
36
|
+
CONSTRAINT bundle_patches_bundle_id_fk FOREIGN KEY (bundle_id)
|
|
37
|
+
REFERENCES bundles(id) ON UPDATE RESTRICT ON DELETE CASCADE,
|
|
38
|
+
CONSTRAINT bundle_patches_base_bundle_id_fk FOREIGN KEY (base_bundle_id)
|
|
39
|
+
REFERENCES bundles(id) ON UPDATE RESTRICT ON DELETE CASCADE
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE TABLE releases (
|
|
43
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
44
|
+
revision INTEGER NOT NULL,
|
|
45
|
+
scope_key TEXT COLLATE BINARY NOT NULL,
|
|
46
|
+
channel_id TEXT COLLATE BINARY NOT NULL,
|
|
47
|
+
platform TEXT NOT NULL,
|
|
48
|
+
kind TEXT NOT NULL,
|
|
49
|
+
bundle_id TEXT,
|
|
50
|
+
strategy TEXT NOT NULL,
|
|
51
|
+
target_app_version TEXT,
|
|
52
|
+
fingerprint_hash TEXT,
|
|
53
|
+
enabled INTEGER NOT NULL,
|
|
54
|
+
should_force_update INTEGER NOT NULL,
|
|
55
|
+
message TEXT,
|
|
56
|
+
rollout_cohort_count INTEGER NOT NULL DEFAULT 1000,
|
|
57
|
+
target_cohorts TEXT NOT NULL DEFAULT '[]',
|
|
58
|
+
operation TEXT NOT NULL,
|
|
59
|
+
source_release_id TEXT,
|
|
60
|
+
created_at_ms REAL NOT NULL,
|
|
61
|
+
updated_at_ms REAL NOT NULL,
|
|
62
|
+
CONSTRAINT releases_revision_check CHECK (revision >= 1),
|
|
63
|
+
CONSTRAINT releases_kind_bundle_check CHECK (
|
|
64
|
+
(kind = 'BUNDLE' AND bundle_id IS NOT NULL)
|
|
65
|
+
OR (kind = 'EMBEDDED' AND bundle_id IS NULL)
|
|
66
|
+
),
|
|
67
|
+
CONSTRAINT releases_strategy_target_check CHECK (
|
|
68
|
+
(strategy = 'APP_VERSION' AND target_app_version IS NOT NULL AND fingerprint_hash IS NULL)
|
|
69
|
+
OR (strategy = 'FINGERPRINT' AND target_app_version IS NULL AND fingerprint_hash IS NOT NULL)
|
|
70
|
+
),
|
|
71
|
+
CONSTRAINT releases_rollout_cohort_count_check CHECK (
|
|
72
|
+
rollout_cohort_count >= 0 AND rollout_cohort_count <= 1000
|
|
73
|
+
),
|
|
74
|
+
CONSTRAINT releases_operation_check CHECK (
|
|
75
|
+
operation IN ('DEPLOY', 'PROMOTE', 'ROLLBACK')
|
|
76
|
+
),
|
|
77
|
+
CONSTRAINT releases_channel_id_fk FOREIGN KEY (channel_id)
|
|
78
|
+
REFERENCES channels(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
|
|
79
|
+
CONSTRAINT releases_bundle_id_fk FOREIGN KEY (bundle_id)
|
|
80
|
+
REFERENCES bundles(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
|
|
81
|
+
CONSTRAINT releases_source_release_id_fk FOREIGN KEY (source_release_id)
|
|
82
|
+
REFERENCES releases(id) ON UPDATE RESTRICT ON DELETE SET NULL
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
CREATE TABLE release_catalogs (
|
|
86
|
+
scope_key TEXT COLLATE BINARY PRIMARY KEY NOT NULL,
|
|
87
|
+
catalog_id TEXT NOT NULL,
|
|
88
|
+
strategy TEXT NOT NULL,
|
|
89
|
+
channel_id TEXT COLLATE BINARY NOT NULL,
|
|
90
|
+
channel_key TEXT COLLATE BINARY NOT NULL,
|
|
91
|
+
platform TEXT NOT NULL,
|
|
92
|
+
fingerprint_hash TEXT,
|
|
93
|
+
generation REAL NOT NULL,
|
|
94
|
+
payload TEXT NOT NULL,
|
|
95
|
+
catalog_hash TEXT NOT NULL,
|
|
96
|
+
byte_size INTEGER NOT NULL,
|
|
97
|
+
is_tombstone INTEGER NOT NULL,
|
|
98
|
+
updated_at_ms REAL NOT NULL,
|
|
99
|
+
CONSTRAINT release_catalogs_strategy_target_check CHECK (
|
|
100
|
+
(strategy = 'APP_VERSION' AND fingerprint_hash IS NULL)
|
|
101
|
+
OR (strategy = 'FINGERPRINT' AND fingerprint_hash IS NOT NULL)
|
|
102
|
+
),
|
|
103
|
+
CONSTRAINT release_catalogs_generation_check CHECK (
|
|
104
|
+
generation >= 1 AND generation <= 9007199254740991
|
|
105
|
+
),
|
|
106
|
+
CONSTRAINT release_catalogs_byte_size_check CHECK (
|
|
107
|
+
byte_size >= 0 AND byte_size <= 262144
|
|
108
|
+
),
|
|
109
|
+
CONSTRAINT release_catalogs_channel_id_fk FOREIGN KEY (channel_id)
|
|
110
|
+
REFERENCES channels(id) ON UPDATE RESTRICT ON DELETE RESTRICT
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE bundle_events (
|
|
114
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
115
|
+
type TEXT NOT NULL,
|
|
116
|
+
install_id TEXT NOT NULL,
|
|
117
|
+
user_id TEXT,
|
|
118
|
+
username TEXT,
|
|
119
|
+
from_release_id TEXT,
|
|
120
|
+
from_bundle_id TEXT,
|
|
121
|
+
to_release_id TEXT,
|
|
122
|
+
to_bundle_id TEXT NOT NULL,
|
|
123
|
+
platform TEXT NOT NULL,
|
|
124
|
+
app_version TEXT NOT NULL,
|
|
125
|
+
channel TEXT NOT NULL,
|
|
126
|
+
cohort TEXT NOT NULL,
|
|
127
|
+
update_strategy TEXT,
|
|
128
|
+
fingerprint_hash TEXT,
|
|
129
|
+
sdk_version TEXT,
|
|
130
|
+
received_at_ms REAL NOT NULL,
|
|
131
|
+
CONSTRAINT bundle_events_type_check CHECK (
|
|
132
|
+
type IN ('UPDATE_APPLIED', 'RECOVERED', 'RELEASE_ADOPTED', 'UNCHANGED')
|
|
133
|
+
),
|
|
134
|
+
CONSTRAINT bundle_events_platform_check CHECK (
|
|
135
|
+
platform IN ('ios', 'android')
|
|
136
|
+
),
|
|
137
|
+
CONSTRAINT bundle_events_shape_check CHECK (
|
|
138
|
+
(
|
|
139
|
+
type IN ('UPDATE_APPLIED', 'RECOVERED', 'RELEASE_ADOPTED')
|
|
140
|
+
AND from_bundle_id IS NOT NULL
|
|
141
|
+
AND update_strategy IS NOT NULL
|
|
142
|
+
AND update_strategy IN ('fingerprint', 'appVersion')
|
|
143
|
+
) OR (
|
|
144
|
+
type = 'UNCHANGED'
|
|
145
|
+
AND from_bundle_id IS NULL
|
|
146
|
+
AND update_strategy IS NULL
|
|
147
|
+
)
|
|
148
|
+
),
|
|
149
|
+
CONSTRAINT bundle_events_received_at_check CHECK (received_at_ms >= 0)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
CREATE TABLE api_keys (
|
|
153
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
154
|
+
hash TEXT NOT NULL,
|
|
155
|
+
name TEXT NOT NULL,
|
|
156
|
+
prefix TEXT NOT NULL,
|
|
157
|
+
role TEXT NOT NULL,
|
|
158
|
+
created_at_ms REAL NOT NULL,
|
|
159
|
+
revoked_at_ms REAL,
|
|
160
|
+
CONSTRAINT api_keys_role_check CHECK (role = 'client'),
|
|
161
|
+
CONSTRAINT api_keys_created_at_check CHECK (created_at_ms >= 0),
|
|
162
|
+
CONSTRAINT api_keys_revoked_at_check CHECK (
|
|
163
|
+
revoked_at_ms IS NULL OR revoked_at_ms >= 0
|
|
164
|
+
)
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
CREATE TABLE private_hot_updater_settings (
|
|
168
|
+
key TEXT PRIMARY KEY NOT NULL,
|
|
169
|
+
value TEXT NOT NULL DEFAULT '1.0.0'
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
CREATE UNIQUE INDEX channels_name_key ON channels(name);
|
|
41
173
|
CREATE INDEX bundle_patches_bundle_id_idx ON bundle_patches(bundle_id);
|
|
42
174
|
CREATE INDEX bundle_patches_base_bundle_id_idx ON bundle_patches(base_bundle_id);
|
|
175
|
+
CREATE INDEX releases_scope_order_idx ON releases(scope_key, id);
|
|
176
|
+
CREATE INDEX releases_channel_platform_order_idx ON releases(channel_id, platform, id);
|
|
177
|
+
CREATE INDEX releases_bundle_id_idx ON releases(bundle_id);
|
|
178
|
+
CREATE INDEX releases_fingerprint_hash_idx ON releases(fingerprint_hash);
|
|
179
|
+
CREATE INDEX releases_enabled_idx ON releases(enabled);
|
|
180
|
+
CREATE INDEX release_catalogs_channel_idx ON release_catalogs(channel_id);
|
|
181
|
+
CREATE INDEX bundle_events_received_at_idx ON bundle_events(received_at_ms, id);
|
|
182
|
+
CREATE INDEX bundle_events_install_idx ON bundle_events(install_id, received_at_ms, id);
|
|
183
|
+
CREATE INDEX bundle_events_user_id_idx ON bundle_events(user_id, received_at_ms, id);
|
|
184
|
+
CREATE INDEX bundle_events_username_idx ON bundle_events(username, received_at_ms, id);
|
|
185
|
+
CREATE INDEX bundle_events_to_bundle_idx ON bundle_events(type, to_bundle_id, received_at_ms, id);
|
|
186
|
+
CREATE INDEX bundle_events_from_bundle_idx ON bundle_events(type, from_bundle_id, received_at_ms, id);
|
|
187
|
+
CREATE INDEX bundle_events_to_release_idx ON bundle_events(type, to_release_id, received_at_ms, id);
|
|
188
|
+
CREATE INDEX bundle_events_from_release_idx ON bundle_events(type, from_release_id, received_at_ms, id);
|
|
189
|
+
CREATE UNIQUE INDEX api_keys_hash_key ON api_keys(hash);
|
|
190
|
+
CREATE INDEX api_keys_created_at_idx ON api_keys(created_at_ms, id);
|