@noambz/app-utils 1.2.0 → 1.3.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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +12 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +49 -0
- package/dist/session.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -13,5 +13,6 @@ export { createSqliteKVStore, createJsonFileKVStore } from "./kv";
|
|
|
13
13
|
export type { KVStore } from "./kv";
|
|
14
14
|
export { initSqlitePragmas, backupSqliteDb, pruneOldBackups } from "./sqlite";
|
|
15
15
|
export type { SqlitePragmaDb, SqliteBackupDb, InitSqliteOptions, BackupSqliteOptions, } from "./sqlite";
|
|
16
|
+
export { createSessionToken, verifySessionToken } from "./session";
|
|
16
17
|
export type { HealthStatus, CheckResult, HealthCheckFn, HealthCheckResult, } from "./health";
|
|
17
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAC;AAClE,YAAY,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9E,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,MAAM,CAAC;AAClE,YAAY,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9E,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pruneOldBackups = exports.backupSqliteDb = exports.initSqlitePragmas = exports.createJsonFileKVStore = exports.createSqliteKVStore = exports.validateEnv = exports.healthStatusCode = exports.runHealthChecks = exports.checkRateLimit = exports.sleep = exports.createDateHelpers = exports.getZonedDateAndHour = exports.timeHHMM = exports.todayISO = exports.formatDate = exports.fetchWithRetry = exports.createLogger = void 0;
|
|
3
|
+
exports.verifySessionToken = exports.createSessionToken = exports.pruneOldBackups = exports.backupSqliteDb = exports.initSqlitePragmas = exports.createJsonFileKVStore = exports.createSqliteKVStore = exports.validateEnv = exports.healthStatusCode = exports.runHealthChecks = exports.checkRateLimit = exports.sleep = exports.createDateHelpers = exports.getZonedDateAndHour = exports.timeHHMM = exports.todayISO = exports.formatDate = exports.fetchWithRetry = exports.createLogger = void 0;
|
|
4
4
|
var logger_1 = require("./logger");
|
|
5
5
|
Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
|
|
6
6
|
var fetch_retry_1 = require("./fetch-retry");
|
|
@@ -27,4 +27,7 @@ var sqlite_1 = require("./sqlite");
|
|
|
27
27
|
Object.defineProperty(exports, "initSqlitePragmas", { enumerable: true, get: function () { return sqlite_1.initSqlitePragmas; } });
|
|
28
28
|
Object.defineProperty(exports, "backupSqliteDb", { enumerable: true, get: function () { return sqlite_1.backupSqliteDb; } });
|
|
29
29
|
Object.defineProperty(exports, "pruneOldBackups", { enumerable: true, get: function () { return sqlite_1.pruneOldBackups; } });
|
|
30
|
+
var session_1 = require("./session");
|
|
31
|
+
Object.defineProperty(exports, "createSessionToken", { enumerable: true, get: function () { return session_1.createSessionToken; } });
|
|
32
|
+
Object.defineProperty(exports, "verifySessionToken", { enumerable: true, get: function () { return session_1.verifySessionToken; } });
|
|
30
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAGrB,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAGvB,iCAAiG;AAAxF,mGAAA,UAAU,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAG/E,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAEd,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAGvB,mCAA6D;AAApD,yGAAA,eAAe,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAE1C,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AAEpB,2BAAkE;AAAzD,yGAAA,mBAAmB,OAAA;AAAE,2GAAA,qBAAqB,OAAA;AAGnD,mCAA8E;AAArE,2GAAA,iBAAiB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,yGAAA,eAAe,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AAGrB,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAGvB,iCAAiG;AAAxF,mGAAA,UAAU,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAG/E,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AAEd,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAGvB,mCAA6D;AAApD,yGAAA,eAAe,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAE1C,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AAEpB,2BAAkE;AAAzD,yGAAA,mBAAmB,OAAA;AAAE,2GAAA,qBAAqB,OAAA;AAGnD,mCAA8E;AAArE,2GAAA,iBAAiB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,yGAAA,eAAe,OAAA;AAQ3D,qCAAmE;AAA1D,6GAAA,kBAAkB,OAAA;AAAE,6GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a signed session token from an arbitrary JSON payload.
|
|
3
|
+
* Format: base64url(JSON) + "." + base64url(HMAC-SHA256).
|
|
4
|
+
* An `exp` field (seconds since epoch) is added automatically.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createSessionToken<T extends Record<string, unknown>>(payload: T, secret: string, maxAgeSec?: number): string;
|
|
7
|
+
/**
|
|
8
|
+
* Verify a signed session token and return the payload (without `exp`),
|
|
9
|
+
* or `null` if the signature is invalid or the token has expired.
|
|
10
|
+
*/
|
|
11
|
+
export declare function verifySessionToken<T extends Record<string, unknown>>(token: string, secret: string): T | null;
|
|
12
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,MAAM,EACd,SAAS,SAAkB,GAC1B,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,GAAG,IAAI,CAoBV"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSessionToken = createSessionToken;
|
|
4
|
+
exports.verifySessionToken = verifySessionToken;
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const DEFAULT_MAX_AGE = 30 * 24 * 60 * 60; // 30 days in seconds
|
|
7
|
+
/**
|
|
8
|
+
* Create a signed session token from an arbitrary JSON payload.
|
|
9
|
+
* Format: base64url(JSON) + "." + base64url(HMAC-SHA256).
|
|
10
|
+
* An `exp` field (seconds since epoch) is added automatically.
|
|
11
|
+
*/
|
|
12
|
+
function createSessionToken(payload, secret, maxAgeSec = DEFAULT_MAX_AGE) {
|
|
13
|
+
const tokenPayload = {
|
|
14
|
+
...payload,
|
|
15
|
+
exp: Math.floor(Date.now() / 1000) + maxAgeSec,
|
|
16
|
+
};
|
|
17
|
+
const data = Buffer.from(JSON.stringify(tokenPayload)).toString("base64url");
|
|
18
|
+
const sig = (0, crypto_1.createHmac)("sha256", secret).update(data).digest("base64url");
|
|
19
|
+
return `${data}.${sig}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Verify a signed session token and return the payload (without `exp`),
|
|
23
|
+
* or `null` if the signature is invalid or the token has expired.
|
|
24
|
+
*/
|
|
25
|
+
function verifySessionToken(token, secret) {
|
|
26
|
+
const dotIdx = token.indexOf(".");
|
|
27
|
+
if (dotIdx < 1)
|
|
28
|
+
return null;
|
|
29
|
+
const data = token.slice(0, dotIdx);
|
|
30
|
+
const sig = token.slice(dotIdx + 1);
|
|
31
|
+
if (!sig)
|
|
32
|
+
return null;
|
|
33
|
+
const expectedSig = (0, crypto_1.createHmac)("sha256", secret).update(data).digest("base64url");
|
|
34
|
+
const sigBuf = Buffer.from(sig, "base64url");
|
|
35
|
+
const expectedBuf = Buffer.from(expectedSig, "base64url");
|
|
36
|
+
if (sigBuf.length !== expectedBuf.length || !(0, crypto_1.timingSafeEqual)(sigBuf, expectedBuf))
|
|
37
|
+
return null;
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(Buffer.from(data, "base64url").toString());
|
|
40
|
+
if (typeof parsed.exp !== "number" || parsed.exp < Math.floor(Date.now() / 1000))
|
|
41
|
+
return null;
|
|
42
|
+
const { exp: _, ...rest } = parsed;
|
|
43
|
+
return rest;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":";;AASA,gDAYC;AAMD,gDAuBC;AAlDD,mCAAqD;AAErD,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,qBAAqB;AAEhE;;;;GAIG;AACH,SAAgB,kBAAkB,CAChC,OAAU,EACV,MAAc,EACd,SAAS,GAAG,eAAe;IAE3B,MAAM,YAAY,GAAG;QACnB,GAAG,OAAO;QACV,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS;KAC/C,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1E,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,KAAa,EACb,MAAc;IAEd,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,WAAW,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,IAAI,CAAC,IAAA,wBAAe,EAAC,MAAM,EAAE,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAwB,CAAC;QAC5F,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9F,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QACnC,OAAO,IAAoB,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noambz/app-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Shared utilities: logger, fetchWithRetry, timezone helpers, sleep, rate limiter, health checks, SQLite, KV store, env validation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|