@grantex/sdk 0.5.1 → 0.7.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/LICENSE +185 -0
- package/NOTICE +16 -0
- package/README.md +34 -2
- package/dist/authorization-details.d.ts +86 -0
- package/dist/authorization-details.d.ts.map +1 -0
- package/dist/authorization-details.js +209 -0
- package/dist/authorization-details.js.map +1 -0
- package/dist/canonical.d.ts +47 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +163 -0
- package/dist/canonical.js.map +1 -0
- package/dist/caps/index.d.ts +19 -0
- package/dist/caps/index.d.ts.map +1 -0
- package/dist/caps/index.js +19 -0
- package/dist/caps/index.js.map +1 -0
- package/dist/caps/limits.d.ts +40 -0
- package/dist/caps/limits.d.ts.map +1 -0
- package/dist/caps/limits.js +109 -0
- package/dist/caps/limits.js.map +1 -0
- package/dist/caps/memory.d.ts +15 -0
- package/dist/caps/memory.d.ts.map +1 -0
- package/dist/caps/memory.js +57 -0
- package/dist/caps/memory.js.map +1 -0
- package/dist/caps/meter.d.ts +107 -0
- package/dist/caps/meter.d.ts.map +1 -0
- package/dist/caps/meter.js +200 -0
- package/dist/caps/meter.js.map +1 -0
- package/dist/caps/postgres.d.ts +64 -0
- package/dist/caps/postgres.d.ts.map +1 -0
- package/dist/caps/postgres.js +221 -0
- package/dist/caps/postgres.js.map +1 -0
- package/dist/caps/redis.d.ts +45 -0
- package/dist/caps/redis.d.ts.map +1 -0
- package/dist/caps/redis.js +173 -0
- package/dist/caps/redis.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +517 -57
- package/dist/client.js.map +1 -1
- package/dist/decisions/action.d.ts +51 -0
- package/dist/decisions/action.d.ts.map +1 -0
- package/dist/decisions/action.js +237 -0
- package/dist/decisions/action.js.map +1 -0
- package/dist/decisions/index.d.ts +11 -0
- package/dist/decisions/index.d.ts.map +1 -0
- package/dist/decisions/index.js +8 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/decisions/verify.d.ts +103 -0
- package/dist/decisions/verify.d.ts.map +1 -0
- package/dist/decisions/verify.js +277 -0
- package/dist/decisions/verify.js.map +1 -0
- package/dist/denials.d.ts +132 -0
- package/dist/denials.d.ts.map +1 -0
- package/dist/denials.js +129 -0
- package/dist/denials.js.map +1 -0
- package/dist/evidence/build.d.ts +63 -0
- package/dist/evidence/build.d.ts.map +1 -0
- package/dist/evidence/build.js +201 -0
- package/dist/evidence/build.js.map +1 -0
- package/dist/evidence/canonical.d.ts +3 -0
- package/dist/evidence/canonical.d.ts.map +1 -0
- package/dist/evidence/canonical.js +3 -0
- package/dist/evidence/canonical.js.map +1 -0
- package/dist/evidence/checks.d.ts +13 -0
- package/dist/evidence/checks.d.ts.map +1 -0
- package/dist/evidence/checks.js +406 -0
- package/dist/evidence/checks.js.map +1 -0
- package/dist/evidence/document.d.ts +8 -0
- package/dist/evidence/document.d.ts.map +1 -0
- package/dist/evidence/document.js +298 -0
- package/dist/evidence/document.js.map +1 -0
- package/dist/evidence/hashing.d.ts +37 -0
- package/dist/evidence/hashing.d.ts.map +1 -0
- package/dist/evidence/hashing.js +106 -0
- package/dist/evidence/hashing.js.map +1 -0
- package/dist/evidence/index.d.ts +24 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +24 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/result.d.ts +88 -0
- package/dist/evidence/result.d.ts.map +1 -0
- package/dist/evidence/result.js +88 -0
- package/dist/evidence/result.js.map +1 -0
- package/dist/evidence/schema-1.0.d.ts +2 -0
- package/dist/evidence/schema-1.0.d.ts.map +1 -0
- package/dist/evidence/schema-1.0.js +1398 -0
- package/dist/evidence/schema-1.0.js.map +1 -0
- package/dist/evidence/schema.d.ts +13 -0
- package/dist/evidence/schema.d.ts.map +1 -0
- package/dist/evidence/schema.js +264 -0
- package/dist/evidence/schema.js.map +1 -0
- package/dist/evidence/signature.d.ts +23 -0
- package/dist/evidence/signature.d.ts.map +1 -0
- package/dist/evidence/signature.js +136 -0
- package/dist/evidence/signature.js.map +1 -0
- package/dist/evidence/trace.d.ts +23 -0
- package/dist/evidence/trace.d.ts.map +1 -0
- package/dist/evidence/trace.js +69 -0
- package/dist/evidence/trace.js.map +1 -0
- package/dist/evidence/verify.d.ts +29 -0
- package/dist/evidence/verify.d.ts.map +1 -0
- package/dist/evidence/verify.js +163 -0
- package/dist/evidence/verify.js.map +1 -0
- package/dist/http.d.ts +12 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +11 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +178 -9
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +379 -16
- package/dist/manifest.js.map +1 -1
- package/dist/prepaid-wallets.d.ts +21 -0
- package/dist/prepaid-wallets.d.ts.map +1 -1
- package/dist/prepaid-wallets.js +6 -0
- package/dist/prepaid-wallets.js.map +1 -1
- package/dist/purpose.d.ts +29 -0
- package/dist/purpose.d.ts.map +1 -0
- package/dist/purpose.js +60 -0
- package/dist/purpose.js.map +1 -0
- package/dist/resources/agents.js +3 -3
- package/dist/resources/agents.js.map +1 -1
- package/dist/resources/anomalies.d.ts +3 -1
- package/dist/resources/anomalies.d.ts.map +1 -1
- package/dist/resources/anomalies.js +7 -1
- package/dist/resources/anomalies.js.map +1 -1
- package/dist/resources/audit.js +1 -1
- package/dist/resources/audit.js.map +1 -1
- package/dist/resources/budgets.js +2 -2
- package/dist/resources/budgets.js.map +1 -1
- package/dist/resources/credentials.js +1 -1
- package/dist/resources/credentials.js.map +1 -1
- package/dist/resources/decisions.d.ts +69 -0
- package/dist/resources/decisions.d.ts.map +1 -0
- package/dist/resources/decisions.js +115 -0
- package/dist/resources/decisions.js.map +1 -0
- package/dist/resources/domains.js +2 -2
- package/dist/resources/domains.js.map +1 -1
- package/dist/resources/dpdp.js +4 -4
- package/dist/resources/dpdp.js.map +1 -1
- package/dist/resources/grants.js +2 -2
- package/dist/resources/grants.js.map +1 -1
- package/dist/resources/policies.js +3 -3
- package/dist/resources/policies.js.map +1 -1
- package/dist/resources/scim.js +5 -5
- package/dist/resources/scim.js.map +1 -1
- package/dist/resources/tokens.d.ts.map +1 -1
- package/dist/resources/tokens.js +5 -1
- package/dist/resources/tokens.js.map +1 -1
- package/dist/resources/vault.js +2 -2
- package/dist/resources/vault.js.map +1 -1
- package/dist/resources/webauthn.d.ts +6 -1
- package/dist/resources/webauthn.d.ts.map +1 -1
- package/dist/resources/webauthn.js +5 -1
- package/dist/resources/webauthn.js.map +1 -1
- package/dist/resources/webhooks.js +1 -1
- package/dist/resources/webhooks.js.map +1 -1
- package/dist/revocations/feed.d.ts +61 -0
- package/dist/revocations/feed.d.ts.map +1 -0
- package/dist/revocations/feed.js +282 -0
- package/dist/revocations/feed.js.map +1 -0
- package/dist/revocations/index.d.ts +20 -0
- package/dist/revocations/index.d.ts.map +1 -0
- package/dist/revocations/index.js +19 -0
- package/dist/revocations/index.js.map +1 -0
- package/dist/revocations/set.d.ts +59 -0
- package/dist/revocations/set.d.ts.map +1 -0
- package/dist/revocations/set.js +87 -0
- package/dist/revocations/set.js.map +1 -0
- package/dist/scopes.d.ts +26 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +37 -0
- package/dist/scopes.js.map +1 -0
- package/dist/types.d.ts +121 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/verify.d.ts +31 -2
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +236 -29
- package/dist/verify.js.map +1 -1
- package/package.json +13 -4
package/dist/resources/scim.js
CHANGED
|
@@ -14,7 +14,7 @@ export class ScimClient {
|
|
|
14
14
|
}
|
|
15
15
|
/** Revoke a SCIM token by ID. */
|
|
16
16
|
revokeToken(tokenId) {
|
|
17
|
-
return this.#http.delete(`/v1/scim/tokens/${tokenId}`);
|
|
17
|
+
return this.#http.delete(`/v1/scim/tokens/${encodeURIComponent(tokenId)}`);
|
|
18
18
|
}
|
|
19
19
|
// ── SCIM 2.0 Users ────────────────────────────────────────────────────
|
|
20
20
|
/** List provisioned users (SCIM 2.0 ListResponse). */
|
|
@@ -29,7 +29,7 @@ export class ScimClient {
|
|
|
29
29
|
}
|
|
30
30
|
/** Get a single provisioned user by ID. */
|
|
31
31
|
getUser(userId) {
|
|
32
|
-
return this.#http.get(`/scim/v2/Users/${userId}`);
|
|
32
|
+
return this.#http.get(`/scim/v2/Users/${encodeURIComponent(userId)}`);
|
|
33
33
|
}
|
|
34
34
|
/** Provision a new user. */
|
|
35
35
|
createUser(params) {
|
|
@@ -37,15 +37,15 @@ export class ScimClient {
|
|
|
37
37
|
}
|
|
38
38
|
/** Full replace of a user (PUT). */
|
|
39
39
|
replaceUser(userId, params) {
|
|
40
|
-
return this.#http.put(`/scim/v2/Users/${userId}`, params);
|
|
40
|
+
return this.#http.put(`/scim/v2/Users/${encodeURIComponent(userId)}`, params);
|
|
41
41
|
}
|
|
42
42
|
/** Partial update via SCIM Operations (PATCH). */
|
|
43
43
|
updateUser(userId, operations) {
|
|
44
|
-
return this.#http.patch(`/scim/v2/Users/${userId}`, { Operations: operations });
|
|
44
|
+
return this.#http.patch(`/scim/v2/Users/${encodeURIComponent(userId)}`, { Operations: operations });
|
|
45
45
|
}
|
|
46
46
|
/** Deprovision a user (DELETE). */
|
|
47
47
|
deleteUser(userId) {
|
|
48
|
-
return this.#http.delete(`/scim/v2/Users/${userId}`);
|
|
48
|
+
return this.#http.delete(`/scim/v2/Users/${encodeURIComponent(userId)}`);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
//# sourceMappingURL=scim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scim.js","sourceRoot":"","sources":["../../src/resources/scim.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,UAAU;IACZ,KAAK,CAAa;IAE3B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,yEAAyE;IAEzE,2EAA2E;IAC3E,WAAW,CAAC,MAA6B;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,yEAAyE;IACzE,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,iCAAiC;IACjC,WAAW,CAAC,OAAe;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,mBAAmB,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"scim.js","sourceRoot":"","sources":["../../src/resources/scim.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,UAAU;IACZ,KAAK,CAAa;IAE3B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,yEAAyE;IAEzE,2EAA2E;IAC3E,WAAW,CAAC,MAA6B;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,yEAAyE;IACzE,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,iCAAiC;IACjC,WAAW,CAAC,OAAe;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,yEAAyE;IAEzE,sDAAsD;IACtD,SAAS,CAAC,MAAgD;QACxD,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS;YAAE,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACtF,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS;YAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,KAAK,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAChG,CAAC;IAED,2CAA2C;IAC3C,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,4BAA4B;IAC5B,UAAU,CAAC,MAA4B;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAW,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,oCAAoC;IACpC,WAAW,CAAC,MAAc,EAAE,MAA4B;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED,kDAAkD;IAClD,UAAU,CACR,MAAc,EACd,UAAgE;QAEhE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAW,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,mCAAmC;IACnC,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/resources/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvH,qBAAa,YAAY;;IAIvB,YAAY,IAAI,EAAE,UAAU,EAE3B;IAED,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/resources/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvH,qBAAa,YAAY;;IAIvB,YAAY,IAAI,EAAE,UAAU,EAE3B;IAED,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAMpE;IAEK,OAAO,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAexE;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAIlD;IAED,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErC;CACF"}
|
package/dist/resources/tokens.js
CHANGED
|
@@ -6,7 +6,11 @@ export class TokensClient {
|
|
|
6
6
|
this.#http = http;
|
|
7
7
|
}
|
|
8
8
|
exchange(params) {
|
|
9
|
-
|
|
9
|
+
// Authorization codes are single-use and the server has no idempotent
|
|
10
|
+
// replay for the exchange (unlike refresh): a retried request whose first
|
|
11
|
+
// attempt committed would fail with "code already used" and lose the
|
|
12
|
+
// tokens. Never retry; let the caller surface the error.
|
|
13
|
+
return this.#http.post('/v1/token', params, { retry: false });
|
|
10
14
|
}
|
|
11
15
|
async refresh(params) {
|
|
12
16
|
const now = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/resources/tokens.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,YAAY;IACd,KAAK,CAAa;IAClB,iBAAiB,GAAG,IAAI,GAAG,EAA8C,CAAC;IAEnF,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,MAA2B;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,WAAW,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/resources/tokens.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,YAAY;IACd,KAAK,CAAa;IAClB,iBAAiB,GAAG,IAAI,GAAG,EAA8C,CAAC;IAEnF,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,MAA2B;QAClC,sEAAsE;QACtE,0EAA0E;QAC1E,qEAAqE;QACrE,yDAAyD;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAA0B;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpD,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG;gBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc;eACvC,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,mBAAmB,EAAE,IAAI,EAAE;YACvF,OAAO,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,mBAAmB,EAAE;YAC/D,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAO,mBAAmB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;CACF"}
|
package/dist/resources/vault.js
CHANGED
|
@@ -21,11 +21,11 @@ export class VaultClient {
|
|
|
21
21
|
}
|
|
22
22
|
/** Get credential metadata by ID (no raw token). */
|
|
23
23
|
get(credentialId) {
|
|
24
|
-
return this.#http.get(`/v1/vault/credentials/${credentialId}`);
|
|
24
|
+
return this.#http.get(`/v1/vault/credentials/${encodeURIComponent(credentialId)}`);
|
|
25
25
|
}
|
|
26
26
|
/** Delete a credential from the vault. */
|
|
27
27
|
delete(credentialId) {
|
|
28
|
-
return this.#http.delete(`/v1/vault/credentials/${credentialId}`);
|
|
28
|
+
return this.#http.delete(`/v1/vault/credentials/${encodeURIComponent(credentialId)}`);
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Exchange a grant token for an upstream credential.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/resources/vault.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACb,KAAK,CAAa;IAClB,QAAQ,CAAS;IAE1B,YAAY,IAAgB,EAAE,OAAe;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,MAA6B;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,MAAM,GAA+B,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,WAAW;YAAE,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CACnB,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,GAAG,CAAC,YAAoB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,yBAAyB,YAAY,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/resources/vault.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACb,KAAK,CAAa;IAClB,QAAQ,CAAS;IAE1B,YAAY,IAAgB,EAAE,OAAe;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,MAA6B;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACnF,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,MAAM,GAA+B,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,WAAW;YAAE,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CACnB,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,GAAG,CAAC,YAAoB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,yBAAyB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,YAAoB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CACZ,UAAkB,EAClB,MAAgC;QAEhC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,gCAAgC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,UAAU,EAAE;gBACrC,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,GACX,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,IAAI;gBACnD,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,SAAS,CAAC,CAAC;gBACtD,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAyC,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { HttpClient } from '../http.js';
|
|
2
|
-
import type { WebAuthnRegistrationOptions, WebAuthnRegistrationVerifyParams, WebAuthnCredential, ListWebAuthnCredentialsResponse } from '../types.js';
|
|
2
|
+
import type { WebAuthnRegistrationOptions, WebAuthnRegistrationVerifyParams, WebAuthnCredential, ListWebAuthnCredentialsResponse, WebAuthnEnrollmentSession } from '../types.js';
|
|
3
3
|
export declare class WebAuthnClient {
|
|
4
4
|
#private;
|
|
5
5
|
constructor(http: HttpClient);
|
|
6
|
+
/** Issue a one-use hosted enrollment link after authenticating the principal in your application. */
|
|
7
|
+
createEnrollmentSession(params: {
|
|
8
|
+
principalId: string;
|
|
9
|
+
authRequestId?: string;
|
|
10
|
+
}): Promise<WebAuthnEnrollmentSession>;
|
|
6
11
|
registerOptions(params: {
|
|
7
12
|
principalId: string;
|
|
8
13
|
}): Promise<WebAuthnRegistrationOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/resources/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,kBAAkB,EAClB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/resources/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,kBAAkB,EAClB,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAErB,qBAAa,cAAc;;IAGzB,YAAY,IAAI,EAAE,UAAU,EAE3B;IAED,qGAAqG;IACrG,uBAAuB,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAEnH;IAED,eAAe,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAErF;IAED,cAAc,CAAC,MAAM,EAAE,gCAAgC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAEpF;IAED,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAI7E;IAED,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;CACF"}
|
|
@@ -3,6 +3,10 @@ export class WebAuthnClient {
|
|
|
3
3
|
constructor(http) {
|
|
4
4
|
this.#http = http;
|
|
5
5
|
}
|
|
6
|
+
/** Issue a one-use hosted enrollment link after authenticating the principal in your application. */
|
|
7
|
+
createEnrollmentSession(params) {
|
|
8
|
+
return this.#http.post('/v1/webauthn/enrollment-sessions', params);
|
|
9
|
+
}
|
|
6
10
|
registerOptions(params) {
|
|
7
11
|
return this.#http.post('/v1/webauthn/register/options', params);
|
|
8
12
|
}
|
|
@@ -13,7 +17,7 @@ export class WebAuthnClient {
|
|
|
13
17
|
return this.#http.get(`/v1/webauthn/credentials?principalId=${encodeURIComponent(principalId)}`);
|
|
14
18
|
}
|
|
15
19
|
deleteCredential(credentialId) {
|
|
16
|
-
return this.#http.delete(`/v1/webauthn/credentials/${credentialId}`);
|
|
20
|
+
return this.#http.delete(`/v1/webauthn/credentials/${encodeURIComponent(credentialId)}`);
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=webauthn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../../src/resources/webauthn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../../src/resources/webauthn.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IAChB,KAAK,CAAa;IAE3B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,qGAAqG;IACrG,uBAAuB,CAAC,MAAuD;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,kCAAkC,EAAE,MAAM,CAAC,CAAC;IAChG,CAAC;IAED,eAAe,CAAC,MAA+B;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA8B,+BAA+B,EAAE,MAAM,CAAC,CAAC;IAC/F,CAAC;IAED,cAAc,CAAC,MAAwC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,8BAA8B,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CACnB,wCAAwC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,YAAoB;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,4BAA4B,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;CACF"}
|
|
@@ -10,7 +10,7 @@ export class WebhooksClient {
|
|
|
10
10
|
return this.#http.get('/v1/webhooks');
|
|
11
11
|
}
|
|
12
12
|
delete(webhookId) {
|
|
13
|
-
return this.#http.delete(`/v1/webhooks/${webhookId}`);
|
|
13
|
+
return this.#http.delete(`/v1/webhooks/${encodeURIComponent(webhookId)}`);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=webhooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IAChB,KAAK,CAAa;IAE3B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,MAA2B;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IAChB,KAAK,CAAa;IAE3B,YAAY,IAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,MAA2B;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The revocation feed client (PRD G-6).
|
|
3
|
+
*
|
|
4
|
+
* It takes a snapshot of everything currently revoked, then follows the live
|
|
5
|
+
* stream, so `enforce()` can deny a call on a grant that was revoked seconds
|
|
6
|
+
* ago without a network round trip per call.
|
|
7
|
+
*
|
|
8
|
+
* The important part is what happens when it cannot keep up. The feed records
|
|
9
|
+
* when it last heard from the auth service; if that is longer ago than
|
|
10
|
+
* `staleAfterMs`, it reports itself stale and `enforce()` denies rather than
|
|
11
|
+
* allowing calls on information it knows may be out of date.
|
|
12
|
+
*/
|
|
13
|
+
import type { HttpClient } from '../http.js';
|
|
14
|
+
import { type CredentialRef, type RevocationMatch } from './set.js';
|
|
15
|
+
export interface RevocationFeedOptions {
|
|
16
|
+
/**
|
|
17
|
+
* How long the feed may go without hearing from the auth service before it
|
|
18
|
+
* is stale and calls fail closed. Default 5000 ms.
|
|
19
|
+
*/
|
|
20
|
+
staleAfterMs?: number;
|
|
21
|
+
/** Delay before reconnecting a dropped stream. Default 500 ms. */
|
|
22
|
+
reconnectDelayMs?: number;
|
|
23
|
+
/** `stream` (Server-Sent Events) or `poll` (long polling). Default `stream`, falling back to `poll`. */
|
|
24
|
+
transport?: 'stream' | 'poll';
|
|
25
|
+
}
|
|
26
|
+
export type FeedUnavailableReason = 'disabled' | 'not_ready' | 'unauthorized' | 'network';
|
|
27
|
+
export interface RevocationFeedState {
|
|
28
|
+
/** A snapshot has been read at least once. */
|
|
29
|
+
synced: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* When the feed last heard from the auth service, on a monotonic clock
|
|
32
|
+
* (0 if never). Comparable with `performance.now()`, not with `Date.now()`.
|
|
33
|
+
*/
|
|
34
|
+
freshAt: number;
|
|
35
|
+
/** Feed position of the last entry applied. */
|
|
36
|
+
cursor: number;
|
|
37
|
+
/** Identifiers currently known to be revoked or suspended. */
|
|
38
|
+
known: number;
|
|
39
|
+
/** Why the feed is not usable, if it is not. */
|
|
40
|
+
unavailable: FeedUnavailableReason | null;
|
|
41
|
+
}
|
|
42
|
+
export declare class RevocationFeed {
|
|
43
|
+
#private;
|
|
44
|
+
constructor(http: HttpClient, options?: RevocationFeedOptions);
|
|
45
|
+
get staleAfterMs(): number;
|
|
46
|
+
state(): RevocationFeedState;
|
|
47
|
+
/** Synced recently enough to be trusted. */
|
|
48
|
+
isFresh(now?: number): boolean;
|
|
49
|
+
/** Why this credential must not be used, according to what the feed knows. */
|
|
50
|
+
match(ref: CredentialRef, now?: number): RevocationMatch | null;
|
|
51
|
+
/** Start following the feed. Idempotent. */
|
|
52
|
+
start(): void;
|
|
53
|
+
/** Stop following, and forget what was known (a restarted feed re-reads the snapshot). */
|
|
54
|
+
stop(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Wait until the feed is fresh, or the timeout passes. Returns whether it is
|
|
57
|
+
* fresh: `false` means callers must fail closed.
|
|
58
|
+
*/
|
|
59
|
+
ready(timeoutMs?: number): Promise<boolean>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/revocations/feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAc,KAAK,aAAa,EAAwB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEtG,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wGAAwG;IACxG,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,CAAC;AAE1F,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,WAAW,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC3C;AAqBD,qBAAa,cAAc;;IAkBzB,YAAY,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,qBAA0B,EAKhE;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,KAAK,IAAI,mBAAmB,CAQ3B;IAED,4CAA4C;IAC5C,OAAO,CAAC,GAAG,GAAE,MAAuB,GAAG,OAAO,CAE7C;IAED,8EAA8E;IAC9E,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,GAAE,MAAmB,GAAG,eAAe,GAAG,IAAI,CAE1E;IAED,4CAA4C;IAC5C,KAAK,IAAI,IAAI,CAKZ;IAED,0FAA0F;IACpF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAa1B;IAED;;;OAGG;IACG,KAAK,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAepE;CAqJF"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { RevokedSet } from './set.js';
|
|
2
|
+
/**
|
|
3
|
+
* Freshness is measured on a monotonic clock: a wall-clock jump backwards
|
|
4
|
+
* must not make a stale feed look current.
|
|
5
|
+
*/
|
|
6
|
+
const monotonicNow = () => (typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now());
|
|
7
|
+
const DEFAULT_STALE_AFTER_MS = 5_000;
|
|
8
|
+
const DEFAULT_RECONNECT_DELAY_MS = 500;
|
|
9
|
+
const MAX_RECONNECT_DELAY_MS = 30_000;
|
|
10
|
+
const PRUNE_INTERVAL_MS = 60_000;
|
|
11
|
+
export class RevocationFeed {
|
|
12
|
+
#http;
|
|
13
|
+
#set = new RevokedSet();
|
|
14
|
+
#staleAfterMs;
|
|
15
|
+
#reconnectDelayMs;
|
|
16
|
+
#transport;
|
|
17
|
+
#running = false;
|
|
18
|
+
#synced = false;
|
|
19
|
+
#freshAt = 0;
|
|
20
|
+
#cursor = 0;
|
|
21
|
+
#unavailable = null;
|
|
22
|
+
#controller = null;
|
|
23
|
+
#loop = null;
|
|
24
|
+
#reader = null;
|
|
25
|
+
#prunedAt = 0;
|
|
26
|
+
#waiters = [];
|
|
27
|
+
constructor(http, options = {}) {
|
|
28
|
+
this.#http = http;
|
|
29
|
+
this.#staleAfterMs = options.staleAfterMs ?? DEFAULT_STALE_AFTER_MS;
|
|
30
|
+
this.#reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;
|
|
31
|
+
this.#transport = options.transport ?? 'stream';
|
|
32
|
+
}
|
|
33
|
+
get staleAfterMs() {
|
|
34
|
+
return this.#staleAfterMs;
|
|
35
|
+
}
|
|
36
|
+
state() {
|
|
37
|
+
return {
|
|
38
|
+
synced: this.#synced,
|
|
39
|
+
freshAt: this.#freshAt,
|
|
40
|
+
cursor: this.#cursor,
|
|
41
|
+
known: this.#set.size,
|
|
42
|
+
unavailable: this.#unavailable,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Synced recently enough to be trusted. */
|
|
46
|
+
isFresh(now = monotonicNow()) {
|
|
47
|
+
return this.#synced && this.#unavailable === null && now - this.#freshAt <= this.#staleAfterMs;
|
|
48
|
+
}
|
|
49
|
+
/** Why this credential must not be used, according to what the feed knows. */
|
|
50
|
+
match(ref, now = Date.now()) {
|
|
51
|
+
return this.#set.match(ref, now);
|
|
52
|
+
}
|
|
53
|
+
/** Start following the feed. Idempotent. */
|
|
54
|
+
start() {
|
|
55
|
+
if (this.#running)
|
|
56
|
+
return;
|
|
57
|
+
this.#running = true;
|
|
58
|
+
this.#controller = new AbortController();
|
|
59
|
+
this.#loop = this.#run().catch(() => { });
|
|
60
|
+
}
|
|
61
|
+
/** Stop following, and forget what was known (a restarted feed re-reads the snapshot). */
|
|
62
|
+
async stop() {
|
|
63
|
+
this.#running = false;
|
|
64
|
+
this.#controller?.abort();
|
|
65
|
+
// An open stream is not interrupted by aborting a fetch that already
|
|
66
|
+
// resolved, so release the reader too.
|
|
67
|
+
await this.#reader?.cancel().catch(() => { });
|
|
68
|
+
const loop = this.#loop;
|
|
69
|
+
this.#loop = null;
|
|
70
|
+
this.#synced = false;
|
|
71
|
+
this.#freshAt = 0;
|
|
72
|
+
this.#set.clear();
|
|
73
|
+
this.#wake();
|
|
74
|
+
if (loop)
|
|
75
|
+
await loop;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Wait until the feed is fresh, or the timeout passes. Returns whether it is
|
|
79
|
+
* fresh: `false` means callers must fail closed.
|
|
80
|
+
*/
|
|
81
|
+
async ready(timeoutMs = this.#staleAfterMs) {
|
|
82
|
+
this.start();
|
|
83
|
+
const deadline = monotonicNow() + timeoutMs;
|
|
84
|
+
for (;;) {
|
|
85
|
+
if (this.isFresh())
|
|
86
|
+
return true;
|
|
87
|
+
if (this.#unavailable !== null || monotonicNow() >= deadline)
|
|
88
|
+
return this.isFresh();
|
|
89
|
+
await new Promise((resolve) => {
|
|
90
|
+
const timer = setTimeout(resolve, Math.min(50, Math.max(1, deadline - monotonicNow())));
|
|
91
|
+
timer.unref?.();
|
|
92
|
+
this.#waiters.push(() => {
|
|
93
|
+
clearTimeout(timer);
|
|
94
|
+
resolve();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
#wake() {
|
|
100
|
+
const waiters = this.#waiters;
|
|
101
|
+
this.#waiters = [];
|
|
102
|
+
for (const waiter of waiters)
|
|
103
|
+
waiter();
|
|
104
|
+
}
|
|
105
|
+
#touch() {
|
|
106
|
+
this.#freshAt = monotonicNow();
|
|
107
|
+
// Entries whose credential has expired can no longer be used; dropping
|
|
108
|
+
// them here bounds the set without a timer of its own.
|
|
109
|
+
if (this.#freshAt - this.#prunedAt > PRUNE_INTERVAL_MS) {
|
|
110
|
+
this.#set.prune();
|
|
111
|
+
this.#prunedAt = this.#freshAt;
|
|
112
|
+
}
|
|
113
|
+
this.#unavailable = null;
|
|
114
|
+
this.#wake();
|
|
115
|
+
}
|
|
116
|
+
async #run() {
|
|
117
|
+
let delay = this.#reconnectDelayMs;
|
|
118
|
+
while (this.#running) {
|
|
119
|
+
try {
|
|
120
|
+
await this.#snapshot();
|
|
121
|
+
delay = this.#reconnectDelayMs;
|
|
122
|
+
if (this.#transport === 'stream') {
|
|
123
|
+
const streamed = await this.#stream();
|
|
124
|
+
if (!streamed)
|
|
125
|
+
await this.#poll();
|
|
126
|
+
// A stream that ended cleanly (a server restart, a proxy timeout)
|
|
127
|
+
// must not be reconnected in a tight loop.
|
|
128
|
+
else if (this.#running)
|
|
129
|
+
await sleep(this.#reconnectDelayMs, this.#controller?.signal);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
await this.#poll();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
this.#unavailable = classify(err);
|
|
137
|
+
this.#synced = false;
|
|
138
|
+
this.#wake();
|
|
139
|
+
await sleep(delay, this.#controller?.signal);
|
|
140
|
+
delay = Math.min(delay * 2, MAX_RECONNECT_DELAY_MS);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async #snapshot() {
|
|
145
|
+
let pageToken;
|
|
146
|
+
let cursor = 0;
|
|
147
|
+
// Collected first and swapped in once every page has arrived. A snapshot
|
|
148
|
+
// is the whole truth about what is revoked *now*, so applying it on top
|
|
149
|
+
// of what the set already held kept anything resumed while this client
|
|
150
|
+
// was disconnected — denied until it expired. Swapping only after the
|
|
151
|
+
// last page means a failure part way through leaves the previous set
|
|
152
|
+
// intact rather than a half-built one.
|
|
153
|
+
const entries = [];
|
|
154
|
+
do {
|
|
155
|
+
// `pageToken` is empty only on the first pass; the loop condition ends
|
|
156
|
+
// it otherwise. The previous null/undefined pair was half redundant,
|
|
157
|
+
// which is what the static analysis was pointing at.
|
|
158
|
+
const query = pageToken ? `?pageToken=${encodeURIComponent(pageToken)}` : '';
|
|
159
|
+
const page = await this.#http.get(`/v1/revocations${query}`);
|
|
160
|
+
entries.push(...page.entries);
|
|
161
|
+
cursor = page.cursor;
|
|
162
|
+
pageToken = page.nextPageToken;
|
|
163
|
+
} while (pageToken);
|
|
164
|
+
this.#set.replaceAll(entries);
|
|
165
|
+
this.#set.prune();
|
|
166
|
+
this.#cursor = cursor;
|
|
167
|
+
this.#synced = true;
|
|
168
|
+
this.#touch();
|
|
169
|
+
}
|
|
170
|
+
/** Follow the Server-Sent Events stream. Returns false if streaming is not usable here. */
|
|
171
|
+
async #stream() {
|
|
172
|
+
const response = await this.#http.rawGet(`/v1/revocations/stream?since=${this.#cursor}`, this.#controller?.signal);
|
|
173
|
+
if (!response.ok)
|
|
174
|
+
throw httpError(response.status);
|
|
175
|
+
if (!response.body)
|
|
176
|
+
return false;
|
|
177
|
+
const reader = response.body.getReader();
|
|
178
|
+
this.#reader = reader;
|
|
179
|
+
const decoder = new TextDecoder();
|
|
180
|
+
let buffer = '';
|
|
181
|
+
// A half-open socket delivers nothing and never ends. Heartbeats are due
|
|
182
|
+
// every second, so silence for twice the staleness bound means the
|
|
183
|
+
// connection is gone: drop it and let the loop reconnect.
|
|
184
|
+
const silenceLimit = Math.max(2 * this.#staleAfterMs, 1_000);
|
|
185
|
+
let watchdog = setTimeout(() => void reader.cancel().catch(() => { }), silenceLimit);
|
|
186
|
+
watchdog.unref?.();
|
|
187
|
+
try {
|
|
188
|
+
while (this.#running) {
|
|
189
|
+
const { done, value } = await reader.read();
|
|
190
|
+
if (done)
|
|
191
|
+
break;
|
|
192
|
+
clearTimeout(watchdog);
|
|
193
|
+
watchdog = setTimeout(() => void reader.cancel().catch(() => { }), silenceLimit);
|
|
194
|
+
watchdog.unref?.();
|
|
195
|
+
buffer += decoder.decode(value, { stream: true });
|
|
196
|
+
let index = buffer.indexOf('\n\n');
|
|
197
|
+
while (index !== -1) {
|
|
198
|
+
this.#handleEvent(buffer.slice(0, index));
|
|
199
|
+
buffer = buffer.slice(index + 2);
|
|
200
|
+
index = buffer.indexOf('\n\n');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
clearTimeout(watchdog);
|
|
206
|
+
this.#reader = null;
|
|
207
|
+
reader.releaseLock();
|
|
208
|
+
await response.body.cancel().catch(() => { });
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
#handleEvent(block) {
|
|
213
|
+
let event = 'message';
|
|
214
|
+
let data = '';
|
|
215
|
+
for (const line of block.split('\n')) {
|
|
216
|
+
if (line.startsWith('event:'))
|
|
217
|
+
event = line.slice(6).trim();
|
|
218
|
+
else if (line.startsWith('data:'))
|
|
219
|
+
data += line.slice(5).trim();
|
|
220
|
+
}
|
|
221
|
+
if (event === 'heartbeat' || event === 'ready') {
|
|
222
|
+
this.#touch();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (event !== 'revocation' || data.length === 0)
|
|
226
|
+
return;
|
|
227
|
+
try {
|
|
228
|
+
const entry = JSON.parse(data);
|
|
229
|
+
this.#set.apply(entry);
|
|
230
|
+
if (entry.seq > this.#cursor)
|
|
231
|
+
this.#cursor = entry.seq;
|
|
232
|
+
this.#touch();
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// A line we cannot read is not evidence that nothing is revoked; the
|
|
236
|
+
// next heartbeat decides freshness.
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/** Long-poll fallback for runtimes without streaming response bodies. */
|
|
240
|
+
async #poll() {
|
|
241
|
+
const wait = Math.max(1, Math.floor(this.#staleAfterMs / 2 / 1000));
|
|
242
|
+
while (this.#running) {
|
|
243
|
+
const page = await this.#http.get(`/v1/revocations?since=${this.#cursor}&wait=${wait}`);
|
|
244
|
+
this.#set.applyAll(page.entries);
|
|
245
|
+
if (page.cursor > this.#cursor)
|
|
246
|
+
this.#cursor = page.cursor;
|
|
247
|
+
for (const entry of page.entries)
|
|
248
|
+
if (entry.seq > this.#cursor)
|
|
249
|
+
this.#cursor = entry.seq;
|
|
250
|
+
this.#touch();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function httpError(status) {
|
|
255
|
+
const error = new Error(`revocation feed responded ${status}`);
|
|
256
|
+
error.status = status;
|
|
257
|
+
return error;
|
|
258
|
+
}
|
|
259
|
+
function classify(err) {
|
|
260
|
+
const status = err?.statusCode
|
|
261
|
+
?? err?.status;
|
|
262
|
+
if (status === 404)
|
|
263
|
+
return 'disabled';
|
|
264
|
+
if (status === 503)
|
|
265
|
+
return 'not_ready';
|
|
266
|
+
if (status === 401 || status === 403)
|
|
267
|
+
return 'unauthorized';
|
|
268
|
+
return 'network';
|
|
269
|
+
}
|
|
270
|
+
async function sleep(ms, signal) {
|
|
271
|
+
if (signal?.aborted)
|
|
272
|
+
return;
|
|
273
|
+
await new Promise((resolve) => {
|
|
274
|
+
const timer = setTimeout(resolve, ms);
|
|
275
|
+
timer.unref?.();
|
|
276
|
+
signal?.addEventListener('abort', () => {
|
|
277
|
+
clearTimeout(timer);
|
|
278
|
+
resolve();
|
|
279
|
+
}, { once: true });
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/revocations/feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Revocation checking for `enforce()` (PRD G-6).
|
|
3
|
+
*
|
|
4
|
+
* - `offline` (default): no check. A revoked grant's token stays
|
|
5
|
+
* cryptographically valid until it expires, which is why the other two modes
|
|
6
|
+
* exist.
|
|
7
|
+
* - `feed`: follow the revocation feed and keep an in-memory set of revoked
|
|
8
|
+
* grants and tokens. Denies within seconds of a revocation, with no network
|
|
9
|
+
* call on the hot path, and fails closed when the feed goes stale.
|
|
10
|
+
* - `online`: ask the auth service about the grant on every call. Simplest,
|
|
11
|
+
* slowest, and denies when the service cannot be reached.
|
|
12
|
+
*/
|
|
13
|
+
export declare const REVOCATION_CHECK_MODES: readonly ['offline', 'online', 'feed'];
|
|
14
|
+
export type RevocationCheckMode = (typeof REVOCATION_CHECK_MODES)[number];
|
|
15
|
+
export declare function isRevocationCheckMode(value: unknown): value is RevocationCheckMode;
|
|
16
|
+
export { RevokedSet } from './set.js';
|
|
17
|
+
export type { CredentialRef, RevocationAction, RevocationEntry, RevocationMatch } from './set.js';
|
|
18
|
+
export { RevocationFeed } from './feed.js';
|
|
19
|
+
export type { FeedUnavailableReason, RevocationFeedOptions, RevocationFeedState } from './feed.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/revocations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,YAAI,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAC7E,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Revocation checking for `enforce()` (PRD G-6).
|
|
3
|
+
*
|
|
4
|
+
* - `offline` (default): no check. A revoked grant's token stays
|
|
5
|
+
* cryptographically valid until it expires, which is why the other two modes
|
|
6
|
+
* exist.
|
|
7
|
+
* - `feed`: follow the revocation feed and keep an in-memory set of revoked
|
|
8
|
+
* grants and tokens. Denies within seconds of a revocation, with no network
|
|
9
|
+
* call on the hot path, and fails closed when the feed goes stale.
|
|
10
|
+
* - `online`: ask the auth service about the grant on every call. Simplest,
|
|
11
|
+
* slowest, and denies when the service cannot be reached.
|
|
12
|
+
*/
|
|
13
|
+
export const REVOCATION_CHECK_MODES = ['offline', 'online', 'feed'];
|
|
14
|
+
export function isRevocationCheckMode(value) {
|
|
15
|
+
return typeof value === 'string' && REVOCATION_CHECK_MODES.includes(value);
|
|
16
|
+
}
|
|
17
|
+
export { RevokedSet } from './set.js';
|
|
18
|
+
export { RevocationFeed } from './feed.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/revocations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAG7E,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,sBAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|