@globiguard/sdk 1.0.0 → 1.0.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.
Files changed (71) hide show
  1. package/LICENSE +128 -0
  2. package/README.md +80 -0
  3. package/dist/bootstrap.d.ts +5 -0
  4. package/dist/bootstrap.d.ts.map +1 -0
  5. package/dist/bootstrap.js +67 -0
  6. package/dist/bootstrap.js.map +1 -0
  7. package/dist/client.d.ts +61 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +260 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/entitlements.node.d.ts +12 -0
  12. package/dist/entitlements.node.d.ts.map +1 -0
  13. package/dist/entitlements.node.js +215 -0
  14. package/dist/entitlements.node.js.map +1 -0
  15. package/dist/errors.d.ts +21 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +46 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/fetch.d.ts +21 -0
  20. package/dist/fetch.d.ts.map +1 -0
  21. package/dist/fetch.js +151 -0
  22. package/dist/fetch.js.map +1 -0
  23. package/dist/governed-actions.d.ts +34 -0
  24. package/dist/governed-actions.d.ts.map +1 -0
  25. package/dist/governed-actions.js +146 -0
  26. package/dist/governed-actions.js.map +1 -0
  27. package/dist/index.d.ts +14 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/realtime.d.ts +21 -0
  32. package/dist/realtime.d.ts.map +1 -0
  33. package/dist/realtime.js +265 -0
  34. package/dist/realtime.js.map +1 -0
  35. package/dist/resources/actions.d.ts +5 -0
  36. package/dist/resources/actions.d.ts.map +1 -0
  37. package/dist/resources/actions.js +48 -0
  38. package/dist/resources/actions.js.map +1 -0
  39. package/dist/resources/audit.d.ts +5 -0
  40. package/dist/resources/audit.d.ts.map +1 -0
  41. package/dist/resources/audit.js +62 -0
  42. package/dist/resources/audit.js.map +1 -0
  43. package/dist/resources/installs.d.ts +4 -0
  44. package/dist/resources/installs.d.ts.map +1 -0
  45. package/dist/resources/installs.js +19 -0
  46. package/dist/resources/installs.js.map +1 -0
  47. package/dist/resources/orgs.d.ts +4 -0
  48. package/dist/resources/orgs.d.ts.map +1 -0
  49. package/dist/resources/orgs.js +48 -0
  50. package/dist/resources/orgs.js.map +1 -0
  51. package/dist/resources/path-segments.d.ts +2 -0
  52. package/dist/resources/path-segments.d.ts.map +1 -0
  53. package/dist/resources/path-segments.js +4 -0
  54. package/dist/resources/path-segments.js.map +1 -0
  55. package/dist/resources/policies.d.ts +5 -0
  56. package/dist/resources/policies.d.ts.map +1 -0
  57. package/dist/resources/policies.js +64 -0
  58. package/dist/resources/policies.js.map +1 -0
  59. package/dist/resources/queue.d.ts +5 -0
  60. package/dist/resources/queue.d.ts.map +1 -0
  61. package/dist/resources/queue.js +36 -0
  62. package/dist/resources/queue.js.map +1 -0
  63. package/dist/resources/workflows.d.ts +5 -0
  64. package/dist/resources/workflows.d.ts.map +1 -0
  65. package/dist/resources/workflows.js +63 -0
  66. package/dist/resources/workflows.js.map +1 -0
  67. package/dist/server.d.ts +8 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +128 -0
  70. package/dist/server.js.map +1 -0
  71. package/package.json +49 -3
@@ -0,0 +1,215 @@
1
+ import crypto from "node:crypto";
2
+ import { GLOBIGUARD_ENTITLEMENT_MANIFEST_TYPE, GLOBIGUARD_ENTITLEMENT_SIGNING_ALGORITHM } from "@globiguard/contracts";
3
+ import { GlobiguardConfigError } from "./errors.js";
4
+ const COMMERCIAL_PLANS = new Set([
5
+ "FREE",
6
+ "STARTER",
7
+ "GROWTH",
8
+ "SCALE",
9
+ "ENTERPRISE"
10
+ ]);
11
+ const BILLING_STATUSES = new Set([
12
+ "FREE",
13
+ "PILOT",
14
+ "ACTIVE",
15
+ "GRACE",
16
+ "PAST_DUE",
17
+ "SUSPENDED",
18
+ "CANCELED"
19
+ ]);
20
+ const OVERAGE_MODES = new Set([
21
+ "NONE",
22
+ "METERED",
23
+ "CONTRACT"
24
+ ]);
25
+ const OFFLINE_DEPLOYMENT_MODES = new Set([
26
+ "self_hosted",
27
+ "sovereign"
28
+ ]);
29
+ const MANIFEST_ENVIRONMENTS = new Set([
30
+ "sandbox",
31
+ "live"
32
+ ]);
33
+ export function verifySignedEntitlementManifest(manifest, options) {
34
+ const decoded = decodeManifestToken(manifest.token);
35
+ if (manifest.serialization !== "jws-compact") {
36
+ throw new GlobiguardConfigError("Unsupported entitlement manifest serialization.");
37
+ }
38
+ if (JSON.stringify(manifest.protected) !== JSON.stringify(decoded.protected)) {
39
+ throw new GlobiguardConfigError("Entitlement manifest protected header does not match the signed token.");
40
+ }
41
+ if (JSON.stringify(manifest.payload) !== JSON.stringify(decoded.payload)) {
42
+ throw new GlobiguardConfigError("Entitlement manifest payload does not match the signed token.");
43
+ }
44
+ const rawPublicKey = options.publicKeysById[decoded.protected.kid];
45
+ if (!rawPublicKey) {
46
+ throw new GlobiguardConfigError(`Unknown entitlement manifest signing key "${decoded.protected.kid}".`);
47
+ }
48
+ const verified = crypto.verify(null, Buffer.from(decoded.signingInput, "utf8"), createEd25519PublicKey(rawPublicKey), decoded.signature);
49
+ if (!verified) {
50
+ throw new GlobiguardConfigError("Entitlement manifest signature verification failed.");
51
+ }
52
+ const now = options.now ?? new Date();
53
+ const issuedAt = parseIsoDate(decoded.payload.issuedAt, "issuedAt");
54
+ const notBefore = parseIsoDate(decoded.payload.notBefore, "notBefore");
55
+ const expiresAt = parseIsoDate(decoded.payload.expiresAt, "expiresAt");
56
+ if (!issuedAt) {
57
+ throw new GlobiguardConfigError("Entitlement manifest field \"issuedAt\" must be present.");
58
+ }
59
+ if (!notBefore) {
60
+ throw new GlobiguardConfigError("Entitlement manifest field \"notBefore\" must be present.");
61
+ }
62
+ if (!expiresAt) {
63
+ throw new GlobiguardConfigError("Entitlement manifest field \"expiresAt\" must be present.");
64
+ }
65
+ if (issuedAt.getTime() > expiresAt.getTime()) {
66
+ throw new GlobiguardConfigError("Entitlement manifest timestamps are inconsistent.");
67
+ }
68
+ if (notBefore.getTime() > now.getTime()) {
69
+ throw new GlobiguardConfigError("Entitlement manifest is not active yet.");
70
+ }
71
+ if (expiresAt.getTime() <= now.getTime()) {
72
+ throw new GlobiguardConfigError("Entitlement manifest has expired.");
73
+ }
74
+ if (options.expectedIssuer &&
75
+ decoded.payload.issuer !== options.expectedIssuer) {
76
+ throw new GlobiguardConfigError("Entitlement manifest issuer does not match the expected issuer.");
77
+ }
78
+ if (options.expectedOrgId &&
79
+ decoded.payload.subject.orgId !== options.expectedOrgId) {
80
+ throw new GlobiguardConfigError("Entitlement manifest workspace does not match the expected workspace.");
81
+ }
82
+ if (options.expectedProjectId &&
83
+ decoded.payload.subject.projectId !== options.expectedProjectId) {
84
+ throw new GlobiguardConfigError("Entitlement manifest project does not match the expected project.");
85
+ }
86
+ if (options.expectedEnvironment &&
87
+ decoded.payload.subject.environment !== options.expectedEnvironment) {
88
+ throw new GlobiguardConfigError("Entitlement manifest environment does not match the expected environment.");
89
+ }
90
+ if (options.expectedDeploymentMode &&
91
+ decoded.payload.subject.deploymentMode !== options.expectedDeploymentMode) {
92
+ throw new GlobiguardConfigError("Entitlement manifest deployment mode does not match the expected deployment mode.");
93
+ }
94
+ return decoded.payload;
95
+ }
96
+ function decodeManifestToken(token) {
97
+ const parts = token.split(".");
98
+ if (parts.length !== 3) {
99
+ throw new GlobiguardConfigError("Invalid entitlement manifest token.");
100
+ }
101
+ const [encodedHeader, encodedPayload, encodedSignature] = parts;
102
+ const protectedHeader = decodeJson(encodedHeader, "Invalid entitlement manifest protected header.");
103
+ const payload = decodeJson(encodedPayload, "Invalid entitlement manifest payload.");
104
+ if (protectedHeader.alg !== GLOBIGUARD_ENTITLEMENT_SIGNING_ALGORITHM ||
105
+ protectedHeader.typ !== GLOBIGUARD_ENTITLEMENT_MANIFEST_TYPE ||
106
+ !protectedHeader.kid) {
107
+ throw new GlobiguardConfigError("Unsupported entitlement manifest protected header.");
108
+ }
109
+ if (payload.manifestType !== GLOBIGUARD_ENTITLEMENT_MANIFEST_TYPE ||
110
+ payload.manifestVersion !== 1) {
111
+ throw new GlobiguardConfigError("Unsupported entitlement manifest payload.");
112
+ }
113
+ validateManifestPayload(payload);
114
+ return {
115
+ protected: protectedHeader,
116
+ payload,
117
+ signature: decodeBase64Url(encodedSignature),
118
+ signingInput: `${encodedHeader}.${encodedPayload}`
119
+ };
120
+ }
121
+ function parseIsoDate(value, fieldName) {
122
+ if (!value) {
123
+ return null;
124
+ }
125
+ const timestamp = Date.parse(value);
126
+ if (Number.isNaN(timestamp)) {
127
+ throw new GlobiguardConfigError(`Entitlement manifest field "${fieldName}" must be a valid ISO timestamp.`);
128
+ }
129
+ return new Date(timestamp);
130
+ }
131
+ function validateManifestPayload(payload) {
132
+ requireNonEmptyString(payload.manifestId, "manifestId");
133
+ requireNonEmptyString(payload.issuer, "issuer");
134
+ requireNonEmptyString(payload.issuedAt, "issuedAt");
135
+ requireNonEmptyString(payload.notBefore, "notBefore");
136
+ requireNonEmptyString(payload.expiresAt, "expiresAt");
137
+ validateManifestSubject(payload.subject);
138
+ validateCommercialState(payload.commercial);
139
+ validateEntitlements(payload.entitlements);
140
+ }
141
+ function validateManifestSubject(subject) {
142
+ requireNonEmptyString(subject.orgId, "subject.orgId");
143
+ requireNonEmptyString(subject.workspaceName, "subject.workspaceName");
144
+ requireNonEmptyString(subject.orgSlug, "subject.orgSlug");
145
+ requireNonEmptyString(subject.projectId, "subject.projectId");
146
+ requireNonEmptyString(subject.projectSlug, "subject.projectSlug");
147
+ requireRequiredEnvironment(subject.environment, "subject.environment");
148
+ if (!OFFLINE_DEPLOYMENT_MODES.has(subject.deploymentMode)) {
149
+ throw new GlobiguardConfigError("Entitlement manifest field \"subject.deploymentMode\" is invalid.");
150
+ }
151
+ }
152
+ function validateCommercialState(commercial) {
153
+ if (!COMMERCIAL_PLANS.has(commercial.commercialPlan)) {
154
+ throw new GlobiguardConfigError("Entitlement manifest field \"commercial.commercialPlan\" is invalid.");
155
+ }
156
+ if (!BILLING_STATUSES.has(commercial.billingStatus)) {
157
+ throw new GlobiguardConfigError("Entitlement manifest field \"commercial.billingStatus\" is invalid.");
158
+ }
159
+ if (typeof commercial.pilotActive !== "boolean") {
160
+ throw new GlobiguardConfigError("Entitlement manifest field \"commercial.pilotActive\" is invalid.");
161
+ }
162
+ }
163
+ function validateEntitlements(entitlements) {
164
+ requireNullableNonNegativeInteger(entitlements.includedQueriesPerMonth, "entitlements.includedQueriesPerMonth");
165
+ requireNullableNonNegativeInteger(entitlements.frameworkSlots, "entitlements.frameworkSlots");
166
+ if (!OVERAGE_MODES.has(entitlements.overageMode)) {
167
+ throw new GlobiguardConfigError("Entitlement manifest field \"entitlements.overageMode\" is invalid.");
168
+ }
169
+ }
170
+ function requireNonEmptyString(value, fieldName) {
171
+ if (typeof value !== "string" || value.length === 0) {
172
+ throw new GlobiguardConfigError(`Entitlement manifest field "${fieldName}" must be a non-empty string.`);
173
+ }
174
+ }
175
+ function requireRequiredEnvironment(value, fieldName) {
176
+ if (!MANIFEST_ENVIRONMENTS.has(value)) {
177
+ throw new GlobiguardConfigError(`Entitlement manifest field "${fieldName}" is invalid.`);
178
+ }
179
+ }
180
+ function requireNullableNonNegativeInteger(value, fieldName) {
181
+ if (value === null) {
182
+ return;
183
+ }
184
+ if (!Number.isInteger(value) || value < 0) {
185
+ throw new GlobiguardConfigError(`Entitlement manifest field "${fieldName}" must be a non-negative integer or null.`);
186
+ }
187
+ }
188
+ function createEd25519PublicKey(base64UrlKey) {
189
+ const rawKey = decodeBase64Url(base64UrlKey);
190
+ if (rawKey.length !== 32) {
191
+ throw new GlobiguardConfigError("Entitlement manifest public key must be a base64url-encoded Ed25519 key.");
192
+ }
193
+ const spkiPrefix = Buffer.from("302a300506032b6570032100", "hex");
194
+ return crypto.createPublicKey({
195
+ key: Buffer.concat([spkiPrefix, rawKey]),
196
+ format: "der",
197
+ type: "spki"
198
+ });
199
+ }
200
+ function decodeJson(value, message) {
201
+ try {
202
+ return JSON.parse(decodeBase64Url(value).toString("utf8"));
203
+ }
204
+ catch {
205
+ throw new GlobiguardConfigError(message);
206
+ }
207
+ }
208
+ function decodeBase64Url(value) {
209
+ const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
210
+ const padding = normalized.length % 4 === 0
211
+ ? ""
212
+ : "=".repeat(4 - (normalized.length % 4));
213
+ return Buffer.from(normalized + padding, "base64");
214
+ }
215
+ //# sourceMappingURL=entitlements.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.node.js","sourceRoot":"","sources":["../src/entitlements.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { GlobiguardSdkErrorKind, GlobiguardSdkErrorShape } from "@globiguard/contracts";
2
+ export type { GlobiguardSdkErrorKind, GlobiguardSdkErrorShape };
3
+ export declare class GlobiguardAuthorityError extends Error {
4
+ readonly kind: GlobiguardSdkErrorKind;
5
+ readonly authorizationId?: string;
6
+ readonly queueEntryId?: string | null;
7
+ readonly evidencePackageId?: string;
8
+ readonly retryAfterSeconds?: number;
9
+ readonly safeDetails?: Record<string, string | number | boolean | null>;
10
+ constructor(shape: GlobiguardSdkErrorShape);
11
+ toJSON(): GlobiguardSdkErrorShape;
12
+ }
13
+ export declare class GlobiguardConfigError extends Error {
14
+ constructor(message: string);
15
+ }
16
+ export declare class GlobiguardHttpError extends Error {
17
+ readonly status: number;
18
+ readonly body: unknown;
19
+ constructor(message: string, status: number, body: unknown);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAC;AAEhE,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;gBAE5D,KAAK,EAAE,uBAAuB;IAW1C,MAAM,IAAI,uBAAuB;CAWlC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM3D"}
package/dist/errors.js ADDED
@@ -0,0 +1,46 @@
1
+ export class GlobiguardAuthorityError extends Error {
2
+ kind;
3
+ authorizationId;
4
+ queueEntryId;
5
+ evidencePackageId;
6
+ retryAfterSeconds;
7
+ safeDetails;
8
+ constructor(shape) {
9
+ super(shape.message);
10
+ this.name = "GlobiguardAuthorityError";
11
+ this.kind = shape.kind;
12
+ this.authorizationId = shape.authorizationId;
13
+ this.queueEntryId = shape.queueEntryId;
14
+ this.evidencePackageId = shape.evidencePackageId;
15
+ this.retryAfterSeconds = shape.retryAfterSeconds;
16
+ this.safeDetails = shape.safeDetails;
17
+ }
18
+ toJSON() {
19
+ return {
20
+ kind: this.kind,
21
+ message: this.message,
22
+ authorizationId: this.authorizationId,
23
+ queueEntryId: this.queueEntryId,
24
+ evidencePackageId: this.evidencePackageId,
25
+ retryAfterSeconds: this.retryAfterSeconds,
26
+ safeDetails: this.safeDetails
27
+ };
28
+ }
29
+ }
30
+ export class GlobiguardConfigError extends Error {
31
+ constructor(message) {
32
+ super(message);
33
+ this.name = "GlobiguardConfigError";
34
+ }
35
+ }
36
+ export class GlobiguardHttpError extends Error {
37
+ status;
38
+ body;
39
+ constructor(message, status, body) {
40
+ super(message);
41
+ this.name = "GlobiguardHttpError";
42
+ this.status = status;
43
+ this.body = body;
44
+ }
45
+ }
46
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,IAAI,CAAyB;IAC7B,eAAe,CAAU;IACzB,YAAY,CAAiB;IAC7B,iBAAiB,CAAU;IAC3B,iBAAiB,CAAU;IAC3B,WAAW,CAAoD;IAExE,YAAY,KAA8B;QACxC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,MAAM,CAAS;IACf,IAAI,CAAU;IAEvB,YAAY,OAAe,EAAE,MAAc,EAAE,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { GlobiguardCredential, GlobiguardEnvironment } from "@globiguard/contracts";
2
+ type QueryValue = string | number | boolean | null | undefined;
3
+ export interface GlobiguardRequestOptions {
4
+ method?: string;
5
+ headers?: HeadersInit;
6
+ query?: Record<string, QueryValue>;
7
+ body?: unknown;
8
+ signal?: AbortSignal;
9
+ }
10
+ interface RequestJsonArgs {
11
+ baseUrl: string;
12
+ clientName: string;
13
+ credential: GlobiguardCredential;
14
+ environment: GlobiguardEnvironment;
15
+ fetchImpl: typeof fetch;
16
+ path: string;
17
+ options?: GlobiguardRequestOptions;
18
+ }
19
+ export declare function requestJson<TResponse>({ baseUrl, clientName, credential, environment, fetchImpl, path, options }: RequestJsonArgs): Promise<TResponse>;
20
+ export {};
21
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAI/B,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,EAAE,qBAAqB,CAAC;IACnC,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAuKD,wBAAsB,WAAW,CAAC,SAAS,EAAE,EAC3C,OAAO,EACP,UAAU,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,IAAI,EACJ,OAAO,EACR,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAqDtC"}
package/dist/fetch.js ADDED
@@ -0,0 +1,151 @@
1
+ import { GlobiguardConfigError, GlobiguardHttpError } from "./errors.js";
2
+ function joinUrl(baseUrl, path) {
3
+ if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(path) || path.startsWith("//")) {
4
+ throw new GlobiguardConfigError("Request paths must be relative to the configured GlobiGuard service.");
5
+ }
6
+ if (!path.startsWith("/")) {
7
+ throw new GlobiguardConfigError("Request paths must start with '/'.");
8
+ }
9
+ if (path.includes("?") || path.includes("#")) {
10
+ throw new GlobiguardConfigError("Request paths must not include query strings or fragments.");
11
+ }
12
+ if (path.includes("\\")) {
13
+ throw new GlobiguardConfigError("Request paths must not contain backslashes.");
14
+ }
15
+ const normalizedBase = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
16
+ const base = new URL(normalizedBase);
17
+ const trimmedPath = path.startsWith("/") ? path.slice(1) : path;
18
+ const segments = trimmedPath.split("/").filter(Boolean);
19
+ for (const segment of segments) {
20
+ let decodedSegment;
21
+ try {
22
+ decodedSegment = decodeURIComponent(segment);
23
+ }
24
+ catch {
25
+ throw new GlobiguardConfigError("Request paths must contain valid percent-encoding.");
26
+ }
27
+ if (decodedSegment === "." || decodedSegment === "..") {
28
+ throw new GlobiguardConfigError("Request paths must not contain dot segments.");
29
+ }
30
+ }
31
+ const url = new URL(trimmedPath, base);
32
+ if (url.origin !== base.origin) {
33
+ throw new GlobiguardConfigError("Resolved request URL must stay on the configured GlobiGuard origin.");
34
+ }
35
+ if (!url.pathname.startsWith(base.pathname)) {
36
+ throw new GlobiguardConfigError("Resolved request URL must stay under the configured GlobiGuard base path.");
37
+ }
38
+ return url;
39
+ }
40
+ function applyQuery(url, query) {
41
+ if (!query) {
42
+ return;
43
+ }
44
+ for (const [key, value] of Object.entries(query)) {
45
+ if (value === undefined || value === null) {
46
+ continue;
47
+ }
48
+ url.searchParams.set(key, String(value));
49
+ }
50
+ }
51
+ function buildCredentialHeaders(credential) {
52
+ const headers = new Headers();
53
+ if (credential.projectId) {
54
+ headers.set("x-globiguard-project-id", credential.projectId);
55
+ }
56
+ switch (credential.kind) {
57
+ case "publishable":
58
+ headers.set("x-globiguard-publishable-key", credential.token);
59
+ break;
60
+ case "secret":
61
+ headers.set("x-globiguard-secret-key", credential.token);
62
+ break;
63
+ case "local":
64
+ headers.set("x-globiguard-local-mode", "true");
65
+ if (credential.token) {
66
+ headers.set("x-globiguard-local-token", credential.token);
67
+ }
68
+ break;
69
+ default:
70
+ throw new GlobiguardConfigError("Unrecognized GlobiGuard credential kind.");
71
+ }
72
+ return headers;
73
+ }
74
+ function isReservedHeader(name) {
75
+ const normalized = name.toLowerCase();
76
+ return (normalized === "x-globiguard-client" ||
77
+ normalized === "x-globiguard-environment" ||
78
+ normalized === "x-globiguard-project-id" ||
79
+ normalized === "x-globiguard-publishable-key" ||
80
+ normalized === "x-globiguard-secret-key" ||
81
+ normalized === "x-globiguard-local-mode" ||
82
+ normalized === "x-globiguard-local-token");
83
+ }
84
+ function buildBody(body) {
85
+ if (body === undefined) {
86
+ return {
87
+ body: undefined,
88
+ setJsonContentType: false
89
+ };
90
+ }
91
+ if (ArrayBuffer.isView(body)) {
92
+ const bytes = new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
93
+ return {
94
+ body: bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength),
95
+ setJsonContentType: false
96
+ };
97
+ }
98
+ if (typeof body === "string" ||
99
+ body instanceof Blob ||
100
+ body instanceof FormData ||
101
+ body instanceof URLSearchParams ||
102
+ body instanceof ArrayBuffer) {
103
+ return {
104
+ body,
105
+ setJsonContentType: false
106
+ };
107
+ }
108
+ return {
109
+ body: JSON.stringify(body),
110
+ setJsonContentType: true
111
+ };
112
+ }
113
+ export async function requestJson({ baseUrl, clientName, credential, environment, fetchImpl, path, options }) {
114
+ const url = joinUrl(baseUrl, path);
115
+ applyQuery(url, options?.query);
116
+ const callerHeaders = new Headers(options?.headers);
117
+ const headers = buildCredentialHeaders(credential);
118
+ callerHeaders.forEach((value, key) => {
119
+ if (!isReservedHeader(key)) {
120
+ headers.set(key, value);
121
+ }
122
+ });
123
+ headers.set("x-globiguard-client", clientName);
124
+ headers.set("x-globiguard-environment", environment);
125
+ const requestBody = buildBody(options?.body);
126
+ if (requestBody.setJsonContentType &&
127
+ !headers.has("content-type") &&
128
+ !(requestBody.body instanceof FormData)) {
129
+ headers.set("content-type", "application/json");
130
+ }
131
+ const response = await fetchImpl(url, {
132
+ method: options?.method ?? "GET",
133
+ headers,
134
+ body: requestBody.body,
135
+ signal: options?.signal
136
+ });
137
+ const hasNoContent = response.status === 204 ||
138
+ response.status === 205 ||
139
+ response.headers.get("content-length") === "0";
140
+ const contentType = response.headers.get("content-type") ?? "";
141
+ const responseBody = hasNoContent
142
+ ? undefined
143
+ : contentType.includes("application/json")
144
+ ? await response.json()
145
+ : await response.text();
146
+ if (!response.ok) {
147
+ throw new GlobiguardHttpError(`GlobiGuard request failed with status ${response.status}.`, response.status, responseBody);
148
+ }
149
+ return responseBody;
150
+ }
151
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { GlobiguardActionAuthorizationRequest, GlobiguardActionAuthorizationResponse, GlobiguardActionsClient, GlobiguardApproval, GlobiguardApprovalCreateRequest, GlobiguardAuditClient, GlobiguardEvidenceListRequest, GlobiguardEvidencePackageSummary, GlobiguardEvidenceRef, GlobiguardIncidentReplay, GlobiguardIncidentReplayLookupRequest, GlobiguardQueueEntry, GlobiguardQueueReadClient } from "@globiguard/contracts";
2
+ export interface GlobiguardGovernedActionRuntimeConfig {
3
+ actions: GlobiguardActionsClient;
4
+ audit: GlobiguardAuditClient;
5
+ queue: GlobiguardQueueReadClient;
6
+ }
7
+ export interface GlobiguardWaitForApprovalOptions {
8
+ queueEntryId: string;
9
+ signal?: AbortSignal;
10
+ maxAttempts?: number;
11
+ intervalMs?: number;
12
+ }
13
+ export interface GlobiguardIdempotencyKeyInput {
14
+ stableSeed: string;
15
+ actionType: string;
16
+ actorId?: string;
17
+ payloadSha256?: string;
18
+ windowBucket?: string;
19
+ }
20
+ export interface GlobiguardGovernedActionsClient {
21
+ authorizeAction(request: GlobiguardActionAuthorizationRequest): Promise<GlobiguardActionAuthorizationResponse>;
22
+ authorizeActionOrThrow(request: GlobiguardActionAuthorizationRequest): Promise<GlobiguardActionAuthorizationResponse>;
23
+ requestApproval(request: GlobiguardApprovalCreateRequest): Promise<GlobiguardApproval>;
24
+ getApprovalStatus(approvalId: string): Promise<GlobiguardApproval>;
25
+ getEvidenceReferences(request?: GlobiguardEvidenceListRequest): Promise<GlobiguardEvidenceRef[]>;
26
+ exportEvidencePackage(request?: Parameters<GlobiguardAuditClient["export"]>[0]): ReturnType<GlobiguardAuditClient["export"]>;
27
+ getEvidencePackageSummary(evidencePackageId: string): Promise<GlobiguardEvidencePackageSummary>;
28
+ getIncidentReplay(request: GlobiguardIncidentReplayLookupRequest): Promise<GlobiguardIncidentReplay>;
29
+ waitForApproval(options: GlobiguardWaitForApprovalOptions): Promise<GlobiguardQueueEntry>;
30
+ }
31
+ export declare function createGovernedActionsClient(config: GlobiguardGovernedActionRuntimeConfig): GlobiguardGovernedActionsClient;
32
+ export declare function deriveActionIdempotencyKey(input: GlobiguardIdempotencyKeyInput): Promise<string>;
33
+ export declare function generateCorrelationId(): string;
34
+ //# sourceMappingURL=governed-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governed-actions.d.ts","sourceRoot":"","sources":["../src/governed-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EACpC,qCAAqC,EACrC,uBAAuB,EACvB,kBAAkB,EAClB,+BAA+B,EAC/B,qBAAqB,EACrB,6BAA6B,EAC7B,gCAAgC,EAChC,qBAAqB,EACrB,wBAAwB,EACxB,qCAAqC,EACrC,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,qCAAqC;IACpD,OAAO,EAAE,uBAAuB,CAAC;IACjC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,KAAK,EAAE,yBAAyB,CAAC;CAClC;AAED,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,eAAe,CACb,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAClD,sBAAsB,CACpB,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAClD,eAAe,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvF,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnE,qBAAqB,CACnB,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACpC,qBAAqB,CACnB,OAAO,CAAC,EAAE,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GACvD,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,yBAAyB,CACvB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC7C,iBAAiB,CACf,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,eAAe,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3F;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,qCAAqC,GAC5C,+BAA+B,CAkEjC;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C"}