stellarium-ts 0.18.0 → 0.19.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.
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { type JWTVerifyGetKey } from "jose";
|
|
1
|
+
import { type JWTPayload, type JWTVerifyGetKey } from "jose";
|
|
2
2
|
/** The `iss` of every run token. Copied from RUN_TOKEN_ISSUER in apps/operator/src/runs/tokens.ts. */
|
|
3
3
|
export declare const RUN_TOKEN_ISSUER = "stellarium";
|
|
4
4
|
/** Who a run token lets run scripts on this node, and which organization pays. */
|
|
5
5
|
export interface RunTokenClaims {
|
|
6
6
|
clientId: string;
|
|
7
7
|
organizationId: string;
|
|
8
|
+
/** Every claim of the verified token, which scripts read as the built-in `jwt`. */
|
|
9
|
+
payload: JWTPayload;
|
|
8
10
|
}
|
|
9
11
|
/** Whether `token` has the three base64url segments of a JWT, as opposed to an API key. */
|
|
10
12
|
export declare function looksLikeJwt(token: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runTokens.d.ts","sourceRoot":"","sources":["../../src/client/runTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAa,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"runTokens.d.ts","sourceRoot":"","sources":["../../src/client/runTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,KAAK,eAAe,EAAa,MAAM,MAAM,CAAC;AAE5F,sGAAsG;AACtG,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAE7C,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,OAAO,EAAE,UAAU,CAAC;CACvB;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAIQ,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IAEvC,gFAAgF;IAChF,YAAY,WAAW,EAAE,MAAM,EAAmB,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,EAG9F;IAED,kHAAkH;IAC5G,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAU/D;CACJ"}
|
package/dist/client/runTokens.js
CHANGED
|
@@ -25,7 +25,7 @@ export class RunTokenVerifier {
|
|
|
25
25
|
if (typeof payload.sub !== 'string' || typeof payload.org !== 'string') {
|
|
26
26
|
return undefined;
|
|
27
27
|
}
|
|
28
|
-
return { clientId: payload.sub, organizationId: payload.org };
|
|
28
|
+
return { clientId: payload.sub, organizationId: payload.org, payload };
|
|
29
29
|
}
|
|
30
30
|
catch {
|
|
31
31
|
return undefined;
|
package/dist/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AAEhF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,UAAU,YAAY;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAoCD;;;GAGG;AACH,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAAC,CAAC;AAE3F,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,SAAS,CAAC,EAAE,SAAS,CAAC;KACzB;CACJ;AAkBD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,aAAa,MAAM,CAAC;AAwKjC;;;;GAIG;AACH,QAAA,MAAM,MAAM,EAAE,kBAAkB,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AAEhF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,UAAU,YAAY;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAoCD;;;GAGG;AACH,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAAC,CAAC;AAE3F,OAAO,QAAQ,SAAS,CAAC;IACrB,UAAU,cAAc;QACpB,SAAS,CAAC,EAAE,SAAS,CAAC;KACzB;CACJ;AAkBD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,aAAa,MAAM,CAAC;AAwKjC;;;;GAIG;AACH,QAAA,MAAM,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAqa5C,CAAC;eAGa,MAAM"}
|
package/dist/routes.js
CHANGED
|
@@ -345,6 +345,8 @@ const routes = async (fastify, options) => {
|
|
|
345
345
|
resourceResolver: options.service.resourceResolver,
|
|
346
346
|
resourceInvoker,
|
|
347
347
|
meter,
|
|
348
|
+
// The run token's claims, or null for an API-key run, so the name is always reserved.
|
|
349
|
+
builtins: { jwt: caller.kind === 'client' ? caller.payload : null },
|
|
348
350
|
});
|
|
349
351
|
settle('capture', meter.tokens);
|
|
350
352
|
return reply.status(200).send({ returnValue: result.returnValue ?? null, usage: { tokens: meter.tokens } });
|
|
@@ -305,6 +305,26 @@ describe("routes", () => {
|
|
|
305
305
|
expect(response.json()).toEqual({ error: "Invalid run token" });
|
|
306
306
|
expect(authorizeRun).not.toHaveBeenCalled();
|
|
307
307
|
});
|
|
308
|
+
test("gives the script the run token's claims as the built-in jwt", async () => {
|
|
309
|
+
const response = await runWith(await runToken("org_caller"), "request R {\n return jwt\n}");
|
|
310
|
+
expect(response.statusCode).toBe(200);
|
|
311
|
+
expect(response.json().returnValue).toEqual({
|
|
312
|
+
iss: "stellarium", sub: "cli_test", aud: config.publicKey, org: "org_caller", iat: expect.any(Number), exp: expect.any(Number),
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
test.each([
|
|
316
|
+
["redeclares", "var jwt = 1", /'jwt' is a built-in variable/],
|
|
317
|
+
["changes", 'jwt.sub = "cli_other"', /read-only/],
|
|
318
|
+
])("fails a script that %s jwt", async (_, statement, details) => {
|
|
319
|
+
const response = await runWith(await runToken(ORGANIZATION), `request R {\n ${statement}\n}`);
|
|
320
|
+
expect(response.statusCode).toBe(422);
|
|
321
|
+
expect(response.json()).toMatchObject({ error: "Script failed", details: expect.stringMatching(details) });
|
|
322
|
+
});
|
|
323
|
+
test("gives an API-key run a null jwt", async () => {
|
|
324
|
+
const response = await tokenApp.inject({ method: "POST", url: "/v1/run", headers: { authorization: "Bearer secret" }, payload: { source: "request R {\n return jwt\n}" } });
|
|
325
|
+
expect(response.statusCode).toBe(200);
|
|
326
|
+
expect(response.json().returnValue).toBeNull();
|
|
327
|
+
});
|
|
308
328
|
test("still accepts the API key", async () => {
|
|
309
329
|
const response = await tokenApp.inject({ method: "POST", url: "/v1/run", headers: { authorization: "Bearer secret" }, payload: { source: temperatureSource } });
|
|
310
330
|
expect(response.statusCode).toBe(200);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stellarium-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "A Stellarium Node in TypeScript.",
|
|
5
5
|
"homepage": "https://github.com/qualletio/stellarium-ts#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"dotenv": "^18.0.5",
|
|
47
47
|
"fastify": "^5.12.5",
|
|
48
48
|
"jose": "6.1.0",
|
|
49
|
-
"requestscript": "1.
|
|
49
|
+
"requestscript": "1.3.0",
|
|
50
50
|
"sqlite": "^5.1.1",
|
|
51
51
|
"sqlite3": "^6.0.1"
|
|
52
52
|
},
|