@fireproof/core-protocols-dashboard 0.24.8 → 0.24.9

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.
@@ -0,0 +1,5 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { JWKPublic, SuperThis } from "@fireproof/core-types-base";
3
+ export declare function getCloudPubkeyFromEnv(cloudToken?: string, sthis?: SuperThis): Promise<Result<{
4
+ keys: JWKPublic[];
5
+ }>>;
@@ -0,0 +1,36 @@
1
+ import { isArrayBuffer, isUint8Array, Result } from "@adviser/cement";
2
+ import { ensureSuperThis, sts } from "@fireproof/core-runtime";
3
+ import { JWKPublicSchema, toJwksAlg } from "@fireproof/core-types-base";
4
+ import { exportJWK } from "jose";
5
+ export async function getCloudPubkeyFromEnv(cloudToken, sthis = ensureSuperThis()) {
6
+ const cstPub = cloudToken ?? sthis.env.get("CLOUD_SESSION_TOKEN_PUBLIC");
7
+ if (!cstPub) {
8
+ return Result.Err("no public key: env:CLOUD_SESSION_TOKEN_PUBLIC");
9
+ }
10
+ const cryptoKeys = await sts.env2jwk(cstPub, undefined, sthis);
11
+ const keys = [];
12
+ for (const key of cryptoKeys) {
13
+ const jwKey = await exportJWK(key);
14
+ if (isUint8Array(jwKey) || isArrayBuffer(jwKey)) {
15
+ return Result.Err("invalid key: jwk is ArrayBuffer or Uint8Array");
16
+ }
17
+ const rAlg = toJwksAlg(jwKey);
18
+ if (rAlg.isErr()) {
19
+ return Result.Err(rAlg);
20
+ }
21
+ const rJwtPublicKey = JWKPublicSchema.safeParse({
22
+ use: "sig",
23
+ ...jwKey,
24
+ alg: rAlg.Ok(),
25
+ ext: undefined,
26
+ key_ops: undefined,
27
+ kid: undefined,
28
+ });
29
+ if (!rJwtPublicKey.success) {
30
+ return Result.Err(rJwtPublicKey.error);
31
+ }
32
+ keys.push(rJwtPublicKey.data);
33
+ }
34
+ return Result.Ok({ keys });
35
+ }
36
+ //# sourceMappingURL=get-cloud-pubkey-from-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cloud-pubkey-from-env.js","sourceRoot":"","sources":["../jsr/get-cloud-pubkey-from-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAa,eAAe,EAAa,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAmB,EACnB,KAAK,GAAc,eAAe,EAAE,EACI;IACxC,MAAM,MAAM,GAAG,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;YAC9C,GAAG,EAAE,KAAK;YAEV,GAAG,KAAK;YACR,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YACd,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,SAAS;SACf,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,CAC5B"}
package/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  export * from "./msg-api.js";
2
2
  export * from "./dashboard-api.js";
3
+ export * from "./token.js";
4
+ export * from "./get-cloud-pubkey-from-env.js";
package/index.js CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from "./msg-api.js";
2
2
  export * from "./dashboard-api.js";
3
+ export * from "./token.js";
4
+ export * from "./get-cloud-pubkey-from-env.js";
3
5
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,gCAAgC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fireproof/core-protocols-dashboard",
3
- "version": "0.24.8",
3
+ "version": "0.24.9",
4
4
  "description": "Live ledger for the web.",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -34,14 +34,16 @@
34
34
  "url": "https://github.com/fireproof-storage/fireproof/issues"
35
35
  },
36
36
  "dependencies": {
37
- "@adviser/cement": "~0.5.15",
37
+ "@adviser/cement": "~0.5.17",
38
38
  "@clerk/shared": "~3.43.0",
39
- "@fireproof/core-device-id": "0.24.8",
40
- "@fireproof/core-runtime": "0.24.8",
41
- "@fireproof/core-types-base": "0.24.8",
42
- "@fireproof/core-types-protocols-cloud": "0.24.8",
43
- "@fireproof/core-types-protocols-dashboard": "0.24.8",
44
- "@fireproof/vendor": "0.24.8",
39
+ "@fireproof/core-device-id": "0.24.9",
40
+ "@fireproof/core-runtime": "0.24.9",
41
+ "@fireproof/core-types-base": "0.24.9",
42
+ "@fireproof/core-types-device-id": "0.24.9",
43
+ "@fireproof/core-types-protocols-cloud": "0.24.9",
44
+ "@fireproof/core-types-protocols-dashboard": "0.24.9",
45
+ "@fireproof/vendor": "0.24.9",
46
+ "jose": "~6.1.3",
45
47
  "zod": "~4.3.5"
46
48
  }
47
49
  }
package/token.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { DeviceIdCA } from "@fireproof/core-device-id";
3
+ import { SuperThis } from "@fireproof/core-types-base";
4
+ import { FPApiToken, VerifiedClaimsResult } from "@fireproof/core-types-protocols-dashboard";
5
+ import { VerifyWithCertificateOptions } from "@fireproof/core-types-device-id";
6
+ export declare class ClerkApiToken implements FPApiToken {
7
+ readonly sthis: SuperThis;
8
+ constructor(sthis: SuperThis);
9
+ readonly keysAndUrls: () => Result<{
10
+ keys: string[];
11
+ urls: string[];
12
+ }, Error>;
13
+ verify(token: string): Promise<Result<VerifiedClaimsResult>>;
14
+ }
15
+ export declare class DeviceIdApiToken implements FPApiToken {
16
+ readonly sthis: SuperThis;
17
+ readonly opts: VerifyWithCertificateOptions;
18
+ constructor(sthis: SuperThis, opts: VerifyWithCertificateOptions);
19
+ verify(token: string): Promise<Result<VerifiedClaimsResult>>;
20
+ }
21
+ export declare const deviceIdCAFromEnv: (sthis: SuperThis) => Promise<Result<DeviceIdCA, Error>>;
22
+ export declare const tokenApi: (sthis: SuperThis, opts: VerifyWithCertificateOptions) => Promise<{
23
+ "device-id": DeviceIdApiToken;
24
+ clerk: ClerkApiToken;
25
+ }>;
package/token.js ADDED
@@ -0,0 +1,139 @@
1
+ import { Lazy, Result, param, exception2Result } from "@adviser/cement";
2
+ import { DeviceIdCA, DeviceIdVerifyMsg } from "@fireproof/core-device-id";
3
+ import { sts } from "@fireproof/core-runtime";
4
+ import { FPClerkClaimSchema, FPDeviceIDSessionSchema } from "@fireproof/core-types-base";
5
+ import { jwtVerify } from "jose";
6
+ export class ClerkApiToken {
7
+ sthis;
8
+ constructor(sthis) {
9
+ this.sthis = sthis;
10
+ }
11
+ keysAndUrls = Lazy(() => {
12
+ const keys = [];
13
+ const urls = [];
14
+ for (let idx = 0; true; idx++) {
15
+ const suffix = !idx ? "" : `_${idx}`;
16
+ const key = `CLERK_PUB_JWT_KEY${suffix}`;
17
+ const url = `CLERK_PUB_JWT_URL${suffix}`;
18
+ const rEnvVal = this.sthis.env.gets({
19
+ [key]: param.OPTIONAL,
20
+ [url]: param.OPTIONAL,
21
+ });
22
+ if (rEnvVal.isErr()) {
23
+ return Result.Err(rEnvVal.Err());
24
+ }
25
+ const { [key]: keyVal, [url]: urlVal } = rEnvVal.Ok();
26
+ if (!keyVal && !urlVal) {
27
+ break;
28
+ }
29
+ if (keyVal) {
30
+ keys.push(keyVal);
31
+ }
32
+ if (urlVal) {
33
+ urls.push(...urlVal
34
+ .split(",")
35
+ .map((u) => u.trim())
36
+ .filter((u) => u));
37
+ }
38
+ }
39
+ return Result.Ok({ keys, urls });
40
+ });
41
+ async verify(token) {
42
+ const rKaUs = this.keysAndUrls();
43
+ if (rKaUs.isErr()) {
44
+ return Result.Err(rKaUs);
45
+ }
46
+ const { keys, urls } = rKaUs.Ok();
47
+ const rt = await sts.verifyToken(token, keys, urls, {
48
+ parseSchema: (payload) => {
49
+ const r = FPClerkClaimSchema.safeParse(payload);
50
+ if (r.success) {
51
+ return Result.Ok(r.data);
52
+ }
53
+ else {
54
+ console.log("FPClerkClaimSchema parse error", payload, r.error);
55
+ return Result.Err(r.error);
56
+ }
57
+ },
58
+ verifyToken: async (token, key) => {
59
+ const rPublicKey = await sts.importJWK(key, "RS256");
60
+ if (rPublicKey.isErr()) {
61
+ return Result.Err(rPublicKey);
62
+ }
63
+ const r = await exception2Result(() => jwtVerify(token, rPublicKey.Ok().key));
64
+ if (r.isErr()) {
65
+ return Result.Err(r);
66
+ }
67
+ if (!r.Ok()) {
68
+ return Result.Err("ClerkVerifyToken: failed");
69
+ }
70
+ return Result.Ok({
71
+ payload: r.Ok(),
72
+ });
73
+ },
74
+ });
75
+ if (rt.isErr()) {
76
+ return Result.Err(rt.Err());
77
+ }
78
+ const t = rt.Ok();
79
+ return Result.Ok({
80
+ type: "clerk",
81
+ token,
82
+ claims: t.payload,
83
+ });
84
+ }
85
+ }
86
+ export class DeviceIdApiToken {
87
+ sthis;
88
+ opts;
89
+ constructor(sthis, opts) {
90
+ this.sthis = sthis;
91
+ this.opts = opts;
92
+ }
93
+ async verify(token) {
94
+ const rCa = await this.opts.deviceIdCA.caCertificate();
95
+ if (rCa.isErr()) {
96
+ return Result.Err(rCa);
97
+ }
98
+ const verify = new DeviceIdVerifyMsg(this.sthis.txt.base64, [rCa.Ok()], {
99
+ maxAge: 3600,
100
+ ...this.opts,
101
+ });
102
+ const res = await verify.verifyWithCertificate(token, FPDeviceIDSessionSchema);
103
+ if (res.valid) {
104
+ const creatingUser = res.certificate.certificate.asCert().creatingUser;
105
+ if (!creatingUser || creatingUser.type !== "clerk") {
106
+ return Result.Err(`DeviceIdApiToken-verify: unsupported creatingUser type: ${creatingUser}`);
107
+ }
108
+ return Result.Ok({
109
+ type: "device-id",
110
+ token,
111
+ claims: creatingUser.claims,
112
+ });
113
+ }
114
+ return Result.Err(res.error);
115
+ }
116
+ }
117
+ export const deviceIdCAFromEnv = Lazy((sthis) => {
118
+ const rEnv = sthis.env.gets({
119
+ DEVICE_ID_CA_PRIV_KEY: param.REQUIRED,
120
+ DEVICE_ID_CA_CERT: param.REQUIRED,
121
+ });
122
+ if (rEnv.isErr()) {
123
+ throw rEnv.Err();
124
+ }
125
+ const envVals = rEnv.Ok();
126
+ return DeviceIdCA.from(sthis, {
127
+ privateKey: envVals.DEVICE_ID_CA_PRIV_KEY,
128
+ signedCert: envVals.DEVICE_ID_CA_CERT,
129
+ }, {
130
+ generateSerialNumber: async () => sthis.nextId(32).str,
131
+ });
132
+ });
133
+ export const tokenApi = Lazy(async (sthis, opts) => {
134
+ return {
135
+ "device-id": new DeviceIdApiToken(sthis, opts),
136
+ clerk: new ClerkApiToken(sthis),
137
+ };
138
+ });
139
+ //# sourceMappingURL=token.js.map
package/token.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../jsr/token.ts"],"names":[],"mappings":"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"}