run402 1.46.0 → 1.48.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/cli.mjs +0 -10
- package/package.json +1 -1
- package/sdk/dist/namespaces/functions.d.ts +6 -4
- package/sdk/dist/namespaces/functions.d.ts.map +1 -1
- package/sdk/dist/namespaces/functions.js +6 -4
- package/sdk/dist/namespaces/functions.js.map +1 -1
- package/sdk/dist/namespaces/functions.types.d.ts +41 -1
- package/sdk/dist/namespaces/functions.types.d.ts.map +1 -1
- package/core-dist/wallet-auth.js +0 -62
- package/core-dist/wallet.js +0 -25
- package/lib/storage.mjs +0 -125
- package/sdk/core-dist/wallet-auth.js +0 -62
- package/sdk/core-dist/wallet.js +0 -25
package/cli.mjs
CHANGED
|
@@ -29,7 +29,6 @@ Commands:
|
|
|
29
29
|
functions Manage serverless functions (deploy, invoke, logs, list, delete)
|
|
30
30
|
secrets Manage project secrets (set, list, delete)
|
|
31
31
|
blob Direct-to-S3 blob storage (put, get, ls, rm, sign, diagnose) — up to 5 TiB
|
|
32
|
-
storage Legacy file storage (deprecated — sunset 2026-06-01, use 'blob')
|
|
33
32
|
sites Deploy static sites
|
|
34
33
|
cdn CloudFront CDN diagnostics (wait-fresh) for public blob URLs
|
|
35
34
|
subdomains Manage custom subdomains (claim, list, delete)
|
|
@@ -116,15 +115,6 @@ switch (cmd) {
|
|
|
116
115
|
await run(sub, rest);
|
|
117
116
|
break;
|
|
118
117
|
}
|
|
119
|
-
case "storage": {
|
|
120
|
-
process.stderr.write(
|
|
121
|
-
"run402 storage is deprecated — sunset 2026-06-01. Use `run402 blob` instead.\n" +
|
|
122
|
-
"See https://run402.com/docs/blob#migration\n\n",
|
|
123
|
-
);
|
|
124
|
-
const { run } = await import("./lib/storage.mjs");
|
|
125
|
-
await run(sub, rest);
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
118
|
case "blob": {
|
|
129
119
|
const { run } = await import("./lib/blob.mjs");
|
|
130
120
|
await run(sub, rest);
|
package/package.json
CHANGED
|
@@ -10,10 +10,12 @@ export declare class Functions {
|
|
|
10
10
|
private readonly client;
|
|
11
11
|
constructor(client: Client);
|
|
12
12
|
/**
|
|
13
|
-
* Deploy a serverless function.
|
|
14
|
-
* `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Deploy a serverless function. Deployed functions can
|
|
14
|
+
* `import { db, adminDb, getUser, email, ai } from "@run402/functions"` —
|
|
15
|
+
* the in-function helper library is provided by the platform.
|
|
16
|
+
*
|
|
17
|
+
* `opts.deps` is reserved for a follow-up release that will install
|
|
18
|
+
* user-supplied packages at deploy time; until then it has no effect.
|
|
17
19
|
*
|
|
18
20
|
* @throws {PaymentRequired} when the project lease has expired.
|
|
19
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C
|
|
1
|
+
{"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;;OASG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuB3F;;;;OAIG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,oBAAoB,CAAC;IAgChC;;;OAGG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC;IAiB9B,6CAA6C;IACvC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAa1D,kCAAkC;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D;;;;OAIG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,CAAC;CAuBjC"}
|
|
@@ -11,10 +11,12 @@ export class Functions {
|
|
|
11
11
|
this.client = client;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Deploy a serverless function.
|
|
15
|
-
* `
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Deploy a serverless function. Deployed functions can
|
|
15
|
+
* `import { db, adminDb, getUser, email, ai } from "@run402/functions"` —
|
|
16
|
+
* the in-function helper library is provided by the platform.
|
|
17
|
+
*
|
|
18
|
+
* `opts.deps` is reserved for a follow-up release that will install
|
|
19
|
+
* user-supplied packages at deploy time; until then it has no effect.
|
|
18
20
|
*
|
|
19
21
|
* @throws {PaymentRequired} when the project lease has expired.
|
|
20
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAa/C,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C
|
|
1
|
+
{"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/namespaces/functions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAa/C,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAA2B;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAEzE,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/D,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,YAAY,EAC3C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,IAAI;YACJ,OAAO,EAAE,oBAAoB;SAC9B,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAY,EACZ,OAA8B,EAAE;QAEhC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,OAAO,CAAC,WAAW;YAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,MAAM,WAAW,GAAqC;YACpD,MAAM;YACN,OAAO;YACP,OAAO,EAAE,mBAAmB;SAC7B,CAAC;QACF,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACrE,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAU,iBAAiB,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;QACtF,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAChC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CACR,SAAiB,EACjB,IAAY,EACZ,OAA4B,EAAE;QAE9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QACrG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,IAAI,IAAI,UAAU,OAAO,EAAE,CAAC;QAC1D,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB,IAAI,EAAE;YACnD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,YAAY,EAC3C;YACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAAY;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACvE;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAY,EACZ,IAA2B;QAE3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAExE,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,cAAc,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACvE;YACE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,IAAI;YACJ,OAAO,EAAE,mBAAmB;SAC7B,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -14,7 +14,12 @@ export interface FunctionDeployOptions {
|
|
|
14
14
|
/** Source code. TypeScript or JavaScript. Must `export default async (req: Request) => Response`. */
|
|
15
15
|
code: string;
|
|
16
16
|
config?: FunctionConfig;
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Additional npm packages to bundle with the function. Reserved for a
|
|
19
|
+
* follow-up release that will install user-supplied packages at deploy
|
|
20
|
+
* time. Until then, only `@run402/functions` is available inside
|
|
21
|
+
* deployed functions; this field has no effect.
|
|
22
|
+
*/
|
|
18
23
|
deps?: string[];
|
|
19
24
|
/** Cron schedule (5-field). Omit to deploy without a schedule. */
|
|
20
25
|
schedule?: string | null;
|
|
@@ -28,6 +33,24 @@ export interface FunctionDeployResult {
|
|
|
28
33
|
memory: number;
|
|
29
34
|
schedule?: string | null;
|
|
30
35
|
created_at: string;
|
|
36
|
+
/**
|
|
37
|
+
* The version of `@run402/functions` bundled into the function at deploy
|
|
38
|
+
* time. Set when the function is deployed under the bundling-at-deploy
|
|
39
|
+
* regime (see the companion `drop-functions-layer-and-fix-deps` change).
|
|
40
|
+
* `null` (or omitted) for functions deployed before that change shipped.
|
|
41
|
+
*/
|
|
42
|
+
runtime_version?: string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Resolved direct user dependency versions from `--deps`. Map of dep
|
|
45
|
+
* name → actually-installed concrete version (NOT the user's spec
|
|
46
|
+
* string). `{}` when the function was deployed with empty `--deps` under
|
|
47
|
+
* the new regime; `null` (or omitted) for legacy functions.
|
|
48
|
+
*
|
|
49
|
+
* Direct dependencies only — transitive deps, integrity hashes, and
|
|
50
|
+
* peer-dep relationships are NOT included. This is "resolved direct
|
|
51
|
+
* dependency versions," not a lockfile.
|
|
52
|
+
*/
|
|
53
|
+
deps_resolved?: Record<string, string> | null;
|
|
31
54
|
}
|
|
32
55
|
export interface FunctionInvokeOptions {
|
|
33
56
|
/** HTTP method. Default `POST`. */
|
|
@@ -74,6 +97,19 @@ export interface FunctionSummary {
|
|
|
74
97
|
schedule_meta?: FunctionScheduleMeta | null;
|
|
75
98
|
created_at: string;
|
|
76
99
|
updated_at: string;
|
|
100
|
+
/**
|
|
101
|
+
* The version of `@run402/functions` bundled into the function at deploy
|
|
102
|
+
* time. `null` for functions deployed before the bundling-at-deploy
|
|
103
|
+
* regime (see the companion `drop-functions-layer-and-fix-deps` change).
|
|
104
|
+
*/
|
|
105
|
+
runtime_version?: string | null;
|
|
106
|
+
/**
|
|
107
|
+
* Resolved direct user dependency versions from `--deps`. Map of dep
|
|
108
|
+
* name → actually-installed concrete version. `{}` for empty-deps
|
|
109
|
+
* deploys under the new regime; `null` for legacy functions.
|
|
110
|
+
* Direct deps only, not a full lockfile.
|
|
111
|
+
*/
|
|
112
|
+
deps_resolved?: Record<string, string> | null;
|
|
77
113
|
}
|
|
78
114
|
export interface FunctionListResult {
|
|
79
115
|
functions: FunctionSummary[];
|
|
@@ -92,5 +128,9 @@ export interface FunctionUpdateResult {
|
|
|
92
128
|
schedule: string | null;
|
|
93
129
|
schedule_meta: Record<string, unknown> | null;
|
|
94
130
|
updated_at: string;
|
|
131
|
+
/** See `FunctionSummary.runtime_version`. */
|
|
132
|
+
runtime_version?: string | null;
|
|
133
|
+
/** See `FunctionSummary.deps_resolved`. */
|
|
134
|
+
deps_resolved?: Record<string, string> | null;
|
|
95
135
|
}
|
|
96
136
|
//# sourceMappingURL=functions.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.types.d.ts","sourceRoot":"","sources":["../../src/namespaces/functions.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB
|
|
1
|
+
{"version":3,"file":"functions.types.d.ts","sourceRoot":"","sources":["../../src/namespaces/functions.types.ts"],"names":[],"mappings":"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"}
|
package/core-dist/wallet-auth.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wallet auth helper — generates EIP-191 signature headers for Run402 API.
|
|
3
|
-
* Uses @noble/curves (lighter than viem) for signing.
|
|
4
|
-
*/
|
|
5
|
-
import { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
6
|
-
import { keccak_256 } from "@noble/hashes/sha3.js";
|
|
7
|
-
import { bytesToHex } from "@noble/hashes/utils.js";
|
|
8
|
-
import { readWallet } from "./wallet.js";
|
|
9
|
-
/**
|
|
10
|
-
* EIP-191 personal_sign: sign a message with the wallet's private key.
|
|
11
|
-
*/
|
|
12
|
-
function personalSign(privateKeyHex, address, message) {
|
|
13
|
-
const msgBytes = new TextEncoder().encode(message);
|
|
14
|
-
const prefix = new TextEncoder().encode(`\x19Ethereum Signed Message:\n${msgBytes.length}`);
|
|
15
|
-
const prefixed = new Uint8Array(prefix.length + msgBytes.length);
|
|
16
|
-
prefixed.set(prefix);
|
|
17
|
-
prefixed.set(msgBytes, prefix.length);
|
|
18
|
-
const hash = keccak_256(prefixed);
|
|
19
|
-
const pkHex = privateKeyHex.startsWith("0x")
|
|
20
|
-
? privateKeyHex.slice(2)
|
|
21
|
-
: privateKeyHex;
|
|
22
|
-
const pkBytes = Uint8Array.from(Buffer.from(pkHex, "hex"));
|
|
23
|
-
const rawSig = secp256k1.sign(hash, pkBytes);
|
|
24
|
-
const sig = secp256k1.Signature.fromBytes(rawSig);
|
|
25
|
-
// Determine recovery bit by trying both and matching the address
|
|
26
|
-
let recovery = 0;
|
|
27
|
-
for (const v of [0, 1]) {
|
|
28
|
-
try {
|
|
29
|
-
const recovered = sig.addRecoveryBit(v).recoverPublicKey(hash);
|
|
30
|
-
const pubBytes = recovered.toBytes(false).slice(1); // uncompressed, drop 04 prefix
|
|
31
|
-
const addrBytes = keccak_256(pubBytes).slice(-20);
|
|
32
|
-
if ("0x" + bytesToHex(addrBytes) === address.toLowerCase()) {
|
|
33
|
-
recovery = v;
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
const r = sig.r.toString(16).padStart(64, "0");
|
|
42
|
-
const s = sig.s.toString(16).padStart(64, "0");
|
|
43
|
-
const vHex = (recovery + 27).toString(16).padStart(2, "0");
|
|
44
|
-
return "0x" + r + s + vHex;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Get wallet auth headers for the Run402 API.
|
|
48
|
-
* Returns null if no wallet is configured.
|
|
49
|
-
*/
|
|
50
|
-
export function getWalletAuthHeaders(walletPath) {
|
|
51
|
-
const wallet = readWallet(walletPath);
|
|
52
|
-
if (!wallet || !wallet.address || !wallet.privateKey)
|
|
53
|
-
return null;
|
|
54
|
-
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
55
|
-
const signature = personalSign(wallet.privateKey, wallet.address, `run402:${timestamp}`);
|
|
56
|
-
return {
|
|
57
|
-
"X-Run402-Wallet": wallet.address,
|
|
58
|
-
"X-Run402-Signature": signature,
|
|
59
|
-
"X-Run402-Timestamp": timestamp,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=wallet-auth.js.map
|
package/core-dist/wallet.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, renameSync } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { randomBytes } from "node:crypto";
|
|
4
|
-
import { getWalletPath } from "./config.js";
|
|
5
|
-
export function readWallet(path) {
|
|
6
|
-
const p = path ?? getWalletPath();
|
|
7
|
-
if (!existsSync(p))
|
|
8
|
-
return null;
|
|
9
|
-
try {
|
|
10
|
-
return JSON.parse(readFileSync(p, "utf-8"));
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export function saveWallet(data, path) {
|
|
17
|
-
const p = path ?? getWalletPath();
|
|
18
|
-
const dir = dirname(p);
|
|
19
|
-
mkdirSync(dir, { recursive: true });
|
|
20
|
-
const tmp = join(dir, `.wallet.${randomBytes(4).toString("hex")}.tmp`);
|
|
21
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
22
|
-
renameSync(tmp, p);
|
|
23
|
-
chmodSync(p, 0o600);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=wallet.js.map
|
package/lib/storage.mjs
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "fs";
|
|
2
|
-
import { findProject, API } from "./config.mjs";
|
|
3
|
-
|
|
4
|
-
const HELP = `run402 storage — Manage project file storage
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
run402 storage <subcommand> [args...]
|
|
8
|
-
|
|
9
|
-
Subcommands:
|
|
10
|
-
upload <id> <bucket> <path> [--file <local>] [--content-type <mime>]
|
|
11
|
-
Upload a file to storage
|
|
12
|
-
download <id> <bucket> <path> Download a file from storage
|
|
13
|
-
delete <id> <bucket> <path> Delete a file from storage
|
|
14
|
-
list <id> <bucket> List files in a bucket
|
|
15
|
-
|
|
16
|
-
Examples:
|
|
17
|
-
run402 storage upload abc123 assets logo.png --file ./logo.png --content-type image/png
|
|
18
|
-
echo "hello" | run402 storage upload abc123 data notes.txt
|
|
19
|
-
run402 storage download abc123 assets logo.png
|
|
20
|
-
run402 storage list abc123 assets
|
|
21
|
-
run402 storage delete abc123 assets logo.png
|
|
22
|
-
|
|
23
|
-
Notes:
|
|
24
|
-
- <id> is the project_id from 'run402 projects list'
|
|
25
|
-
- Upload reads from --file or stdin if no --file is given
|
|
26
|
-
`;
|
|
27
|
-
|
|
28
|
-
const SUB_HELP = {
|
|
29
|
-
upload: `run402 storage upload — Upload a file to a project's storage bucket
|
|
30
|
-
|
|
31
|
-
Usage:
|
|
32
|
-
run402 storage upload <id> <bucket> <path> [--file <local>] [--content-type <mime>]
|
|
33
|
-
echo "..." | run402 storage upload <id> <bucket> <path> [--content-type <mime>]
|
|
34
|
-
|
|
35
|
-
Arguments:
|
|
36
|
-
<id> Project ID (from 'run402 projects list')
|
|
37
|
-
<bucket> Target bucket name
|
|
38
|
-
<path> Destination path within the bucket
|
|
39
|
-
|
|
40
|
-
Options:
|
|
41
|
-
--file <local> Local file to upload; if omitted, content is read from stdin
|
|
42
|
-
--content-type <mime> MIME type of the upload (default: text/plain)
|
|
43
|
-
|
|
44
|
-
Examples:
|
|
45
|
-
run402 storage upload abc123 assets logo.png --file ./logo.png \\
|
|
46
|
-
--content-type image/png
|
|
47
|
-
echo "hello" | run402 storage upload abc123 data notes.txt
|
|
48
|
-
`,
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
async function readStdin() {
|
|
52
|
-
const chunks = [];
|
|
53
|
-
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
54
|
-
return Buffer.concat(chunks).toString("utf-8");
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async function upload(projectId, bucket, path, args) {
|
|
58
|
-
const p = findProject(projectId);
|
|
59
|
-
const opts = { file: null, contentType: "text/plain" };
|
|
60
|
-
for (let i = 0; i < args.length; i++) {
|
|
61
|
-
if (args[i] === "--file" && args[i + 1]) opts.file = args[++i];
|
|
62
|
-
if (args[i] === "--content-type" && args[i + 1]) opts.contentType = args[++i];
|
|
63
|
-
}
|
|
64
|
-
const content = opts.file ? readFileSync(opts.file, "utf-8") : await readStdin();
|
|
65
|
-
const res = await fetch(`${API}/storage/v1/object/${bucket}/${path}`, {
|
|
66
|
-
method: "POST",
|
|
67
|
-
headers: { "Content-Type": opts.contentType, "apikey": p.anon_key, "Authorization": `Bearer ${p.anon_key}` },
|
|
68
|
-
body: content,
|
|
69
|
-
});
|
|
70
|
-
const data = await res.json();
|
|
71
|
-
if (!res.ok) { console.error(JSON.stringify({ status: "error", http: res.status, ...data })); process.exit(1); }
|
|
72
|
-
console.log(JSON.stringify(data, null, 2));
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
async function download(projectId, bucket, path) {
|
|
76
|
-
const p = findProject(projectId);
|
|
77
|
-
const res = await fetch(`${API}/storage/v1/object/${bucket}/${path}`, {
|
|
78
|
-
headers: { "apikey": p.anon_key, "Authorization": `Bearer ${p.anon_key}` },
|
|
79
|
-
});
|
|
80
|
-
if (!res.ok) {
|
|
81
|
-
const data = await res.json().catch(() => ({}));
|
|
82
|
-
console.error(JSON.stringify({ status: "error", http: res.status, ...data })); process.exit(1);
|
|
83
|
-
}
|
|
84
|
-
const text = await res.text();
|
|
85
|
-
process.stdout.write(text);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function deleteFile(projectId, bucket, path) {
|
|
89
|
-
const p = findProject(projectId);
|
|
90
|
-
const res = await fetch(`${API}/storage/v1/object/${bucket}/${path}`, {
|
|
91
|
-
method: "DELETE",
|
|
92
|
-
headers: { "apikey": p.anon_key, "Authorization": `Bearer ${p.anon_key}` },
|
|
93
|
-
});
|
|
94
|
-
if (res.status === 204 || res.ok) {
|
|
95
|
-
console.log(JSON.stringify({ status: "ok", message: `File '${bucket}/${path}' deleted.` }));
|
|
96
|
-
} else {
|
|
97
|
-
const data = await res.json().catch(() => ({}));
|
|
98
|
-
console.error(JSON.stringify({ status: "error", http: res.status, ...data })); process.exit(1);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async function list(projectId, bucket) {
|
|
103
|
-
const p = findProject(projectId);
|
|
104
|
-
const res = await fetch(`${API}/storage/v1/object/list/${bucket}`, {
|
|
105
|
-
headers: { "apikey": p.anon_key, "Authorization": `Bearer ${p.anon_key}` },
|
|
106
|
-
});
|
|
107
|
-
const data = await res.json();
|
|
108
|
-
if (!res.ok) { console.error(JSON.stringify({ status: "error", http: res.status, ...data })); process.exit(1); }
|
|
109
|
-
console.log(JSON.stringify(data, null, 2));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export async function run(sub, args) {
|
|
113
|
-
if (!sub || sub === '--help' || sub === '-h') { console.log(HELP); process.exit(0); }
|
|
114
|
-
if (Array.isArray(args) && (args.includes("--help") || args.includes("-h"))) { console.log(SUB_HELP[sub] || HELP); process.exit(0); }
|
|
115
|
-
switch (sub) {
|
|
116
|
-
case "upload": await upload(args[0], args[1], args[2], args.slice(3)); break;
|
|
117
|
-
case "download": await download(args[0], args[1], args[2]); break;
|
|
118
|
-
case "delete": await deleteFile(args[0], args[1], args[2]); break;
|
|
119
|
-
case "list": await list(args[0], args[1]); break;
|
|
120
|
-
default:
|
|
121
|
-
console.error(`Unknown subcommand: ${sub}\n`);
|
|
122
|
-
console.log(HELP);
|
|
123
|
-
process.exit(1);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wallet auth helper — generates EIP-191 signature headers for Run402 API.
|
|
3
|
-
* Uses @noble/curves (lighter than viem) for signing.
|
|
4
|
-
*/
|
|
5
|
-
import { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
6
|
-
import { keccak_256 } from "@noble/hashes/sha3.js";
|
|
7
|
-
import { bytesToHex } from "@noble/hashes/utils.js";
|
|
8
|
-
import { readWallet } from "./wallet.js";
|
|
9
|
-
/**
|
|
10
|
-
* EIP-191 personal_sign: sign a message with the wallet's private key.
|
|
11
|
-
*/
|
|
12
|
-
function personalSign(privateKeyHex, address, message) {
|
|
13
|
-
const msgBytes = new TextEncoder().encode(message);
|
|
14
|
-
const prefix = new TextEncoder().encode(`\x19Ethereum Signed Message:\n${msgBytes.length}`);
|
|
15
|
-
const prefixed = new Uint8Array(prefix.length + msgBytes.length);
|
|
16
|
-
prefixed.set(prefix);
|
|
17
|
-
prefixed.set(msgBytes, prefix.length);
|
|
18
|
-
const hash = keccak_256(prefixed);
|
|
19
|
-
const pkHex = privateKeyHex.startsWith("0x")
|
|
20
|
-
? privateKeyHex.slice(2)
|
|
21
|
-
: privateKeyHex;
|
|
22
|
-
const pkBytes = Uint8Array.from(Buffer.from(pkHex, "hex"));
|
|
23
|
-
const rawSig = secp256k1.sign(hash, pkBytes);
|
|
24
|
-
const sig = secp256k1.Signature.fromBytes(rawSig);
|
|
25
|
-
// Determine recovery bit by trying both and matching the address
|
|
26
|
-
let recovery = 0;
|
|
27
|
-
for (const v of [0, 1]) {
|
|
28
|
-
try {
|
|
29
|
-
const recovered = sig.addRecoveryBit(v).recoverPublicKey(hash);
|
|
30
|
-
const pubBytes = recovered.toBytes(false).slice(1); // uncompressed, drop 04 prefix
|
|
31
|
-
const addrBytes = keccak_256(pubBytes).slice(-20);
|
|
32
|
-
if ("0x" + bytesToHex(addrBytes) === address.toLowerCase()) {
|
|
33
|
-
recovery = v;
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
const r = sig.r.toString(16).padStart(64, "0");
|
|
42
|
-
const s = sig.s.toString(16).padStart(64, "0");
|
|
43
|
-
const vHex = (recovery + 27).toString(16).padStart(2, "0");
|
|
44
|
-
return "0x" + r + s + vHex;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Get wallet auth headers for the Run402 API.
|
|
48
|
-
* Returns null if no wallet is configured.
|
|
49
|
-
*/
|
|
50
|
-
export function getWalletAuthHeaders(walletPath) {
|
|
51
|
-
const wallet = readWallet(walletPath);
|
|
52
|
-
if (!wallet || !wallet.address || !wallet.privateKey)
|
|
53
|
-
return null;
|
|
54
|
-
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
55
|
-
const signature = personalSign(wallet.privateKey, wallet.address, `run402:${timestamp}`);
|
|
56
|
-
return {
|
|
57
|
-
"X-Run402-Wallet": wallet.address,
|
|
58
|
-
"X-Run402-Signature": signature,
|
|
59
|
-
"X-Run402-Timestamp": timestamp,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=wallet-auth.js.map
|
package/sdk/core-dist/wallet.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, renameSync } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { randomBytes } from "node:crypto";
|
|
4
|
-
import { getWalletPath } from "./config.js";
|
|
5
|
-
export function readWallet(path) {
|
|
6
|
-
const p = path ?? getWalletPath();
|
|
7
|
-
if (!existsSync(p))
|
|
8
|
-
return null;
|
|
9
|
-
try {
|
|
10
|
-
return JSON.parse(readFileSync(p, "utf-8"));
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export function saveWallet(data, path) {
|
|
17
|
-
const p = path ?? getWalletPath();
|
|
18
|
-
const dir = dirname(p);
|
|
19
|
-
mkdirSync(dir, { recursive: true });
|
|
20
|
-
const tmp = join(dir, `.wallet.${randomBytes(4).toString("hex")}.tmp`);
|
|
21
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
|
|
22
|
-
renameSync(tmp, p);
|
|
23
|
-
chmodSync(p, 0o600);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=wallet.js.map
|