@hawcx/oauth-client 0.2.0 → 5.1.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.
Files changed (74) hide show
  1. package/README.md +587 -204
  2. package/dist/client-assertion.d.ts +45 -0
  3. package/dist/client-assertion.d.ts.map +1 -0
  4. package/dist/client-assertion.js +141 -0
  5. package/dist/client-assertion.js.map +1 -0
  6. package/dist/delegation/credentials.d.ts +92 -0
  7. package/dist/delegation/credentials.d.ts.map +1 -0
  8. package/dist/delegation/credentials.js +215 -0
  9. package/dist/delegation/credentials.js.map +1 -0
  10. package/dist/delegation/crypto.d.ts +2 -2
  11. package/dist/delegation/crypto.d.ts.map +1 -1
  12. package/dist/delegation/crypto.js +41 -32
  13. package/dist/delegation/crypto.js.map +1 -1
  14. package/dist/delegation/exceptions.d.ts +12 -5
  15. package/dist/delegation/exceptions.d.ts.map +1 -1
  16. package/dist/delegation/exceptions.js +12 -14
  17. package/dist/delegation/exceptions.js.map +1 -1
  18. package/dist/delegation/factory.d.ts +20 -0
  19. package/dist/delegation/factory.d.ts.map +1 -0
  20. package/dist/delegation/factory.js +49 -0
  21. package/dist/delegation/factory.js.map +1 -0
  22. package/dist/delegation/hawcx.d.ts +59 -224
  23. package/dist/delegation/hawcx.d.ts.map +1 -1
  24. package/dist/delegation/hawcx.js +99 -299
  25. package/dist/delegation/hawcx.js.map +1 -1
  26. package/dist/delegation/index.d.ts +4 -9
  27. package/dist/delegation/index.d.ts.map +1 -1
  28. package/dist/delegation/index.js +5 -17
  29. package/dist/delegation/index.js.map +1 -1
  30. package/dist/delegation/transport.d.ts +40 -0
  31. package/dist/delegation/transport.d.ts.map +1 -0
  32. package/dist/delegation/transport.js +120 -0
  33. package/dist/delegation/transport.js.map +1 -0
  34. package/dist/errors.d.ts +62 -0
  35. package/dist/errors.d.ts.map +1 -0
  36. package/dist/errors.js +73 -0
  37. package/dist/errors.js.map +1 -0
  38. package/dist/index.d.ts +12 -15
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +20 -27
  41. package/dist/index.js.map +1 -1
  42. package/dist/oauth.d.ts +265 -0
  43. package/dist/oauth.d.ts.map +1 -0
  44. package/dist/oauth.js +497 -0
  45. package/dist/oauth.js.map +1 -0
  46. package/dist/stepup/client.d.ts +26 -0
  47. package/dist/stepup/client.d.ts.map +1 -0
  48. package/dist/stepup/client.js +78 -0
  49. package/dist/stepup/client.js.map +1 -0
  50. package/dist/stepup/index.d.ts +3 -0
  51. package/dist/stepup/index.d.ts.map +1 -0
  52. package/dist/stepup/index.js +19 -0
  53. package/dist/stepup/index.js.map +1 -0
  54. package/dist/stepup/types.d.ts +35 -0
  55. package/dist/stepup/types.d.ts.map +1 -0
  56. package/dist/stepup/types.js +3 -0
  57. package/dist/stepup/types.js.map +1 -0
  58. package/package.json +13 -16
  59. package/dist/client.d.ts +0 -134
  60. package/dist/client.d.ts.map +0 -1
  61. package/dist/client.js +0 -300
  62. package/dist/client.js.map +0 -1
  63. package/dist/delegation/client.d.ts +0 -116
  64. package/dist/delegation/client.d.ts.map +0 -1
  65. package/dist/delegation/client.js +0 -227
  66. package/dist/delegation/client.js.map +0 -1
  67. package/dist/exceptions.d.ts +0 -52
  68. package/dist/exceptions.d.ts.map +0 -1
  69. package/dist/exceptions.js +0 -81
  70. package/dist/exceptions.js.map +0 -1
  71. package/dist/utils.d.ts +0 -61
  72. package/dist/utils.d.ts.map +0 -1
  73. package/dist/utils.js +0 -263
  74. package/dist/utils.js.map +0 -1
package/dist/utils.js DELETED
@@ -1,263 +0,0 @@
1
- "use strict";
2
- /**
3
- * Internal utilities for the Hawcx OAuth Client SDK
4
- */
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
- Object.defineProperty(o, "default", { enumerable: true, value: v });
18
- }) : function(o, v) {
19
- o["default"] = v;
20
- });
21
- var __importStar = (this && this.__importStar) || (function () {
22
- var ownKeys = function(o) {
23
- ownKeys = Object.getOwnPropertyNames || function (o) {
24
- var ar = [];
25
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
- return ar;
27
- };
28
- return ownKeys(o);
29
- };
30
- return function (mod) {
31
- if (mod && mod.__esModule) return mod;
32
- var result = {};
33
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
- __setModuleDefault(result, mod);
35
- return result;
36
- };
37
- })();
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.loadPublicKey = loadPublicKey;
43
- exports.fetchJwks = fetchJwks;
44
- exports.getKeyFromJwks = getKeyFromJwks;
45
- exports.jwkToPem = jwkToPem;
46
- const fs = __importStar(require("fs"));
47
- const axios_1 = __importDefault(require("axios"));
48
- const exceptions_1 = require("./exceptions");
49
- // JWKS cache: {url: {jwks: {...}, timestamp: number}}
50
- const jwksCache = {};
51
- const JWKS_CACHE_TTL = 3600000; // 1 hour in milliseconds
52
- /**
53
- * Load public key from string or file.
54
- *
55
- * @param keyInput - Either a PEM-formatted public key string or a path to a key file
56
- * @returns PEM-formatted public key string
57
- * @throws InvalidPublicKeyError if the key cannot be loaded or is invalid
58
- *
59
- * @example
60
- * ```typescript
61
- * // From file
62
- * const key = loadPublicKey('keys/public.pem');
63
- *
64
- * // From string
65
- * const key = loadPublicKey(process.env.PUBLIC_KEY!);
66
- * ```
67
- */
68
- function loadPublicKey(keyInput) {
69
- // Check for empty input first
70
- if (!keyInput || (typeof keyInput === 'string' && !keyInput.trim())) {
71
- throw new exceptions_1.InvalidPublicKeyError('Public key is empty');
72
- }
73
- // Check if it looks like a file path (not starting with -----)
74
- if (!keyInput.includes('-----BEGIN')) {
75
- try {
76
- if (!fs.existsSync(keyInput)) {
77
- throw new exceptions_1.InvalidPublicKeyError(`Public key file not found: ${keyInput}`);
78
- }
79
- const stat = fs.statSync(keyInput);
80
- if (!stat.isFile()) {
81
- throw new exceptions_1.InvalidPublicKeyError(`Public key path is not a file: ${keyInput}`);
82
- }
83
- const keyContent = fs.readFileSync(keyInput, 'utf-8');
84
- return validatePemFormat(keyContent);
85
- }
86
- catch (error) {
87
- if (error instanceof exceptions_1.InvalidPublicKeyError) {
88
- throw error;
89
- }
90
- throw new exceptions_1.InvalidPublicKeyError(`Error reading public key file ${keyInput}: ${error}`);
91
- }
92
- }
93
- // Otherwise, treat as PEM string directly
94
- if (typeof keyInput !== 'string') {
95
- throw new exceptions_1.InvalidPublicKeyError(`Public key must be a string, got ${typeof keyInput}`);
96
- }
97
- return validatePemFormat(keyInput);
98
- }
99
- /**
100
- * Validate that the key content looks like a valid PEM public key.
101
- *
102
- * @param keyContent - The key content to validate
103
- * @returns The validated key content
104
- * @throws InvalidPublicKeyError if the key format is invalid
105
- */
106
- function validatePemFormat(keyContent) {
107
- if (!keyContent || !keyContent.trim()) {
108
- throw new exceptions_1.InvalidPublicKeyError('Public key is empty');
109
- }
110
- const keyStripped = keyContent.trim();
111
- // Check for PEM markers
112
- if (!keyStripped.includes('-----BEGIN') || !keyStripped.includes('-----END')) {
113
- throw new exceptions_1.InvalidPublicKeyError('Public key does not appear to be in PEM format (missing BEGIN/END markers)');
114
- }
115
- // Check for common public key markers
116
- const validMarkers = [
117
- 'BEGIN PUBLIC KEY',
118
- 'BEGIN RSA PUBLIC KEY',
119
- 'BEGIN CERTIFICATE',
120
- ];
121
- if (!validMarkers.some(marker => keyStripped.includes(marker))) {
122
- throw new exceptions_1.InvalidPublicKeyError(`Public key does not contain recognized PEM markers. Expected one of: ${validMarkers.join(', ')}`);
123
- }
124
- return keyStripped;
125
- }
126
- /**
127
- * Fetch JWKS (JSON Web Key Set) from a URL with caching.
128
- *
129
- * @param jwksUrl - URL to fetch JWKS from (e.g., https://example.com/.well-known/jwks.json)
130
- * @param timeout - Request timeout in milliseconds (default: 10000)
131
- * @param ttl - Cache TTL in milliseconds (default: 3600000)
132
- * @returns JWKS object containing 'keys' array
133
- * @throws InvalidPublicKeyError if JWKS cannot be fetched or is invalid
134
- *
135
- * @example
136
- * ```typescript
137
- * const jwks = await fetchJwks('https://example.com/.well-known/jwks.json');
138
- * console.log(jwks.keys[0].kid);
139
- * ```
140
- */
141
- async function fetchJwks(jwksUrl, timeout = 10000, ttl = JWKS_CACHE_TTL) {
142
- if (!jwksUrl || typeof jwksUrl !== 'string') {
143
- throw new exceptions_1.InvalidPublicKeyError('JWKS URL must be a non-empty string');
144
- }
145
- // Check cache
146
- const now = Date.now();
147
- const cached = jwksCache[jwksUrl];
148
- if (cached && now - cached.timestamp < ttl) {
149
- return cached.jwks;
150
- }
151
- // Fetch from URL
152
- try {
153
- const response = await axios_1.default.get(jwksUrl, { timeout });
154
- const jwks = response.data;
155
- // Validate JWKS format
156
- if (!jwks || typeof jwks !== 'object' || !Array.isArray(jwks.keys)) {
157
- throw new exceptions_1.InvalidPublicKeyError(`Invalid JWKS format: missing 'keys' field in response from ${jwksUrl}`);
158
- }
159
- if (jwks.keys.length === 0) {
160
- throw new exceptions_1.InvalidPublicKeyError(`Invalid JWKS format: 'keys' must be a non-empty array in response from ${jwksUrl}`);
161
- }
162
- // Cache the result
163
- jwksCache[jwksUrl] = {
164
- jwks,
165
- timestamp: now,
166
- };
167
- return jwks;
168
- }
169
- catch (error) {
170
- if (axios_1.default.isAxiosError(error)) {
171
- throw new exceptions_1.InvalidPublicKeyError(`Failed to fetch JWKS from ${jwksUrl}: ${error.message}`);
172
- }
173
- throw new exceptions_1.InvalidPublicKeyError(`Failed to fetch JWKS from ${jwksUrl}: ${error}`);
174
- }
175
- }
176
- /**
177
- * Extract a public key from JWKS and convert to PEM format.
178
- *
179
- * @param jwks - JWKS object (must contain 'keys' array)
180
- * @param kid - Key ID to search for (optional). If not provided, uses first key.
181
- * @returns PEM-formatted public key string
182
- * @throws InvalidPublicKeyError if key cannot be found or converted
183
- *
184
- * @example
185
- * ```typescript
186
- * const jwks = await fetchJwks('https://example.com/.well-known/jwks.json');
187
- * const pemKey = getKeyFromJwks(jwks, 'key-123');
188
- * ```
189
- */
190
- function getKeyFromJwks(jwks, kid) {
191
- if (!jwks || typeof jwks !== 'object' || !Array.isArray(jwks.keys)) {
192
- throw new exceptions_1.InvalidPublicKeyError("Invalid JWKS: missing 'keys' field");
193
- }
194
- const keys = jwks.keys;
195
- if (keys.length === 0) {
196
- throw new exceptions_1.InvalidPublicKeyError("Invalid JWKS: 'keys' must be a non-empty array");
197
- }
198
- // Find the key
199
- let jwk;
200
- if (kid) {
201
- // Search for specific key ID
202
- jwk = keys.find((k) => k.kid === kid);
203
- if (!jwk) {
204
- throw new exceptions_1.InvalidPublicKeyError(`Key with kid='${kid}' not found in JWKS`);
205
- }
206
- }
207
- else {
208
- // Use first key
209
- jwk = keys[0];
210
- }
211
- // Convert JWK to PEM
212
- return jwkToPem(jwk);
213
- }
214
- /**
215
- * Convert a JWK (JSON Web Key) to PEM format.
216
- * Supports RSA and EC (Elliptic Curve) keys.
217
- *
218
- * @param jwk - JWK object
219
- * @returns PEM-formatted public key string
220
- * @throws InvalidPublicKeyError if JWK cannot be converted
221
- */
222
- function jwkToPem(jwk) {
223
- if (!jwk || typeof jwk !== 'object') {
224
- throw new exceptions_1.InvalidPublicKeyError('Invalid JWK: must be an object');
225
- }
226
- const { kty } = jwk;
227
- if (!kty) {
228
- throw new exceptions_1.InvalidPublicKeyError('Invalid JWK: missing kty field');
229
- }
230
- try {
231
- // Use Node.js crypto module to convert JWK to PEM
232
- const crypto = require('crypto');
233
- // Create a KeyObject from the JWK
234
- const keyObject = crypto.createPublicKey({
235
- key: jwk,
236
- format: 'jwk'
237
- });
238
- // Export as PEM
239
- const pem = keyObject.export({
240
- type: 'spki',
241
- format: 'pem'
242
- });
243
- return pem.toString();
244
- }
245
- catch (error) {
246
- throw new exceptions_1.InvalidPublicKeyError(`Failed to convert JWK to PEM: ${error}`);
247
- }
248
- }
249
- /**
250
- * Decode base64url-encoded data (RFC 4648)
251
- */
252
- function base64urlDecode(data) {
253
- // Add padding if needed
254
- let padded = data;
255
- const padding = 4 - (data.length % 4);
256
- if (padding !== 4) {
257
- padded += '='.repeat(padding);
258
- }
259
- // Replace URL-safe characters
260
- const base64 = padded.replace(/-/g, '+').replace(/_/g, '/');
261
- return Buffer.from(base64, 'base64');
262
- }
263
- //# sourceMappingURL=utils.js.map
package/dist/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}