stellarium-ts 0.18.0 → 0.19.1
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/client/runTokens.d.ts +3 -1
- package/dist/client/runTokens.d.ts.map +1 -1
- package/dist/client/runTokens.js +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +5 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +2 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/service.d.ts +2 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/tests/routes.test.js +20 -0
- package/dist/tests/server.test.js +8 -0
- package/package.json +2 -2
|
@@ -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/db/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE7C,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAc1D,wGAAwG;AACxG,wBAAsB,YAAY,CAAC,QAAQ,GAAE,MAA8B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO9F;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,QAAQ,iBA+I9C"}
|
package/dist/db/db.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
1
3
|
import sqlite3 from 'sqlite3';
|
|
2
4
|
import { open } from 'sqlite';
|
|
3
5
|
export const DEFAULT_DATABASE_PATH = './requestscript.db';
|
|
@@ -14,6 +16,9 @@ export const DEFAULT_DATABASE_PATH = './requestscript.db';
|
|
|
14
16
|
const SCHEMA_VERSION = 6;
|
|
15
17
|
/** Opens (or creates) the node database and brings its schema up to date. Pass ':memory:' for tests. */
|
|
16
18
|
export async function openDatabase(filename = DEFAULT_DATABASE_PATH) {
|
|
19
|
+
if (filename !== ':memory:') {
|
|
20
|
+
mkdirSync(dirname(filename), { recursive: true });
|
|
21
|
+
}
|
|
17
22
|
const db = await open({ filename, driver: sqlite3.Database });
|
|
18
23
|
await createTables(db);
|
|
19
24
|
return db;
|
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 } });
|
package/dist/server.d.ts
CHANGED
|
@@ -36,7 +36,7 @@ export interface StellariumNodeOptions {
|
|
|
36
36
|
* Defaults to `INFERENCE_COST_LIMIT_MICRO_USD`, then to the resolved `costLimitMicroUsd`.
|
|
37
37
|
*/
|
|
38
38
|
inferenceCostLimitMicroUsd?: number;
|
|
39
|
-
/** SQLite file. Defaults to `./requestscript.db`; use ':memory:' for tests. */
|
|
39
|
+
/** SQLite file. Defaults to `DATABASE_PATH`, then `./requestscript.db`; use ':memory:' for tests. */
|
|
40
40
|
databasePath?: string;
|
|
41
41
|
/**
|
|
42
42
|
* Grant chains addressed to this node, stored at start. Each is root first. A stored renewal
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAiB,KAAK,UAAU,EAAgB,MAAM,cAAc,CAAC;AAI5E,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,iCAAiC,QAAgB,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -39,6 +39,7 @@ export function resolveConfig(options, resources = []) {
|
|
|
39
39
|
: options.operatorUrl ?? process.env.OPERATOR_URL,
|
|
40
40
|
costLimitMicroUsd: costLimit,
|
|
41
41
|
inferenceCostLimitMicroUsd: inferenceCostLimit,
|
|
42
|
+
databasePath: options.databasePath ?? process.env.DATABASE_PATH ?? DEFAULT_DATABASE_PATH,
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
export class StellariumNode {
|
|
@@ -77,7 +78,7 @@ export class StellariumNode {
|
|
|
77
78
|
fastify.log.warn(`No session with the operator, so this node can't be listed: ${error instanceof Error ? error.message : String(error)}`);
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
|
-
const db = await openDatabase(
|
|
81
|
+
const db = await openDatabase(config.databasePath);
|
|
81
82
|
fastify.addHook('onClose', async () => db.close());
|
|
82
83
|
const service = createService(db, this.resources, config, { approveGrant: options.approveGrant });
|
|
83
84
|
// A configured chain may be older than its stored renewal, or long expired; neither should stop the node.
|
package/dist/service.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface NodeConfig {
|
|
|
28
28
|
costLimitMicroUsd: number;
|
|
29
29
|
/** Most this node will sign for in one remote inference call. */
|
|
30
30
|
inferenceCostLimitMicroUsd: number;
|
|
31
|
+
/** SQLite file the node opens. */
|
|
32
|
+
databasePath?: string;
|
|
31
33
|
}
|
|
32
34
|
export interface Service {
|
|
33
35
|
config: NodeConfig;
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,4GAA4G;AAC5G,MAAM,WAAW,UAAU;IACvB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,iJAAiJ;IACjJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,0BAA0B,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,4GAA4G;AAC5G,MAAM,WAAW,UAAU;IACvB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,iJAAiJ;IACjJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iHAAiH;IACjH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,0BAA0B,EAAE,MAAM,CAAC;IACnC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,0BAA0B,CAAC;IAC5C,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC3B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iFAAiF;IACjF,YAAY,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAwBtI"}
|
|
@@ -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);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
2
2
|
import { DEFAULT_COST_LIMIT_MICRO_USD, resolveConfig } from "../server.js";
|
|
3
|
+
import { DEFAULT_DATABASE_PATH } from "../db/db.js";
|
|
3
4
|
import { modelResource, weatherResource } from "./helpers.js";
|
|
4
5
|
describe("resolveConfig", () => {
|
|
5
6
|
const keys = { baseUrl: "http://node.example", publicKey: "public", privateKey: "private" };
|
|
@@ -25,6 +26,13 @@ describe("resolveConfig", () => {
|
|
|
25
26
|
test.each([-1, 1.5, Number.NaN])("rejects a cost limit of %s", (costLimitMicroUsd) => {
|
|
26
27
|
expect(() => resolveConfig({ ...keys, costLimitMicroUsd })).toThrow("costLimitMicroUsd");
|
|
27
28
|
});
|
|
29
|
+
test("reads the database path from its option, then DATABASE_PATH, then the default", () => {
|
|
30
|
+
vi.stubEnv("DATABASE_PATH", undefined);
|
|
31
|
+
expect(resolveConfig(keys).databasePath).toBe(DEFAULT_DATABASE_PATH);
|
|
32
|
+
vi.stubEnv("DATABASE_PATH", "/data/requestscript.db");
|
|
33
|
+
expect(resolveConfig(keys).databasePath).toBe("/data/requestscript.db");
|
|
34
|
+
expect(resolveConfig({ ...keys, databasePath: ":memory:" }).databasePath).toBe(":memory:");
|
|
35
|
+
});
|
|
28
36
|
test("requires the signing keys and base URL", () => {
|
|
29
37
|
vi.stubEnv("SIGNING_PRIVATE_KEY", undefined);
|
|
30
38
|
expect(() => resolveConfig({ baseUrl: keys.baseUrl, publicKey: keys.publicKey })).toThrow("SIGNING_PRIVATE_KEY is required");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stellarium-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.1",
|
|
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
|
},
|