@mondaydotcomorg/atp-providers 0.17.14

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 (58) hide show
  1. package/README.md +430 -0
  2. package/__tests__/oauth-integration.test.ts +457 -0
  3. package/__tests__/scope-checkers.test.ts +560 -0
  4. package/__tests__/token-expiration.test.ts +308 -0
  5. package/dist/audit/jsonl.d.ts +29 -0
  6. package/dist/audit/jsonl.d.ts.map +1 -0
  7. package/dist/audit/jsonl.js +163 -0
  8. package/dist/audit/jsonl.js.map +1 -0
  9. package/dist/audit/opentelemetry.d.ts +23 -0
  10. package/dist/audit/opentelemetry.d.ts.map +1 -0
  11. package/dist/audit/opentelemetry.js +240 -0
  12. package/dist/audit/opentelemetry.js.map +1 -0
  13. package/dist/audit/otel-metrics.d.ts +111 -0
  14. package/dist/audit/otel-metrics.d.ts.map +1 -0
  15. package/dist/audit/otel-metrics.js +115 -0
  16. package/dist/audit/otel-metrics.js.map +1 -0
  17. package/dist/auth/env.d.ts +21 -0
  18. package/dist/auth/env.d.ts.map +1 -0
  19. package/dist/auth/env.js +48 -0
  20. package/dist/auth/env.js.map +1 -0
  21. package/dist/cache/file.d.ts +47 -0
  22. package/dist/cache/file.d.ts.map +1 -0
  23. package/dist/cache/file.js +262 -0
  24. package/dist/cache/file.js.map +1 -0
  25. package/dist/cache/memory.d.ts +30 -0
  26. package/dist/cache/memory.d.ts.map +1 -0
  27. package/dist/cache/memory.js +81 -0
  28. package/dist/cache/memory.js.map +1 -0
  29. package/dist/cache/redis.d.ts +28 -0
  30. package/dist/cache/redis.d.ts.map +1 -0
  31. package/dist/cache/redis.js +124 -0
  32. package/dist/cache/redis.js.map +1 -0
  33. package/dist/index.d.ts +10 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +9 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/oauth/index.d.ts +2 -0
  38. package/dist/oauth/index.d.ts.map +1 -0
  39. package/dist/oauth/index.js +2 -0
  40. package/dist/oauth/index.js.map +1 -0
  41. package/dist/oauth/scope-checkers.d.ts +61 -0
  42. package/dist/oauth/scope-checkers.d.ts.map +1 -0
  43. package/dist/oauth/scope-checkers.js +166 -0
  44. package/dist/oauth/scope-checkers.js.map +1 -0
  45. package/package.json +26 -0
  46. package/project.json +31 -0
  47. package/src/audit/jsonl.ts +189 -0
  48. package/src/audit/opentelemetry.ts +286 -0
  49. package/src/audit/otel-metrics.ts +122 -0
  50. package/src/auth/env.ts +65 -0
  51. package/src/cache/file.ts +330 -0
  52. package/src/cache/memory.ts +105 -0
  53. package/src/cache/redis.ts +160 -0
  54. package/src/index.ts +32 -0
  55. package/src/oauth/index.ts +1 -0
  56. package/src/oauth/scope-checkers.ts +196 -0
  57. package/tsconfig.json +14 -0
  58. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,262 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ /**
5
+ * File-based cache provider for persistent local caching
6
+ * Good for single-server deployments that need persistence across restarts
7
+ * Supports cross-pod scenarios when using a shared filesystem (NFS, EFS, etc.)
8
+ */
9
+ export class FileCache {
10
+ name = 'file';
11
+ cacheDir;
12
+ maxKeys;
13
+ defaultTTL;
14
+ cleanupInterval;
15
+ cleanupTimer;
16
+ initPromise;
17
+ constructor(options = {}) {
18
+ this.cacheDir = options.cacheDir || path.join(os.tmpdir(), 'atp-cache');
19
+ this.maxKeys = options.maxKeys || 1000;
20
+ this.defaultTTL = options.defaultTTL || 3600;
21
+ this.cleanupInterval = options.cleanupInterval || 300; // 5 minutes
22
+ // Initialize asynchronously
23
+ this.initPromise = this.initialize();
24
+ }
25
+ async initialize() {
26
+ try {
27
+ await fs.mkdir(this.cacheDir, { recursive: true });
28
+ // Start periodic cleanup
29
+ this.startCleanup();
30
+ }
31
+ catch (error) {
32
+ console.error('[FileCache] Failed to initialize cache directory:', error instanceof Error ? error.message : error);
33
+ }
34
+ }
35
+ async ensureInitialized() {
36
+ if (this.initPromise) {
37
+ await this.initPromise;
38
+ }
39
+ }
40
+ getFilePath(key) {
41
+ // Sanitize key to be filesystem-safe
42
+ const sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');
43
+ return path.join(this.cacheDir, `${sanitizedKey}.json`);
44
+ }
45
+ startCleanup() {
46
+ if (this.cleanupInterval > 0) {
47
+ this.cleanupTimer = setInterval(() => {
48
+ this.cleanExpired().catch((error) => {
49
+ console.error('[FileCache] Cleanup error:', error);
50
+ });
51
+ }, this.cleanupInterval * 1000);
52
+ // Don't prevent process exit
53
+ if (this.cleanupTimer.unref) {
54
+ this.cleanupTimer.unref();
55
+ }
56
+ }
57
+ }
58
+ async cleanExpired() {
59
+ try {
60
+ await this.ensureInitialized();
61
+ const files = await fs.readdir(this.cacheDir);
62
+ const now = Date.now();
63
+ for (const file of files) {
64
+ if (!file.endsWith('.json'))
65
+ continue;
66
+ const filePath = path.join(this.cacheDir, file);
67
+ try {
68
+ const content = await fs.readFile(filePath, 'utf-8');
69
+ const entry = JSON.parse(content);
70
+ if (entry.expiresAt !== -1 && now > entry.expiresAt) {
71
+ await fs.unlink(filePath);
72
+ }
73
+ }
74
+ catch {
75
+ // If we can't read or parse a file, delete it
76
+ try {
77
+ await fs.unlink(filePath);
78
+ }
79
+ catch {
80
+ // Ignore deletion errors
81
+ }
82
+ }
83
+ }
84
+ // Enforce max keys limit
85
+ await this.enforceMaxKeys();
86
+ }
87
+ catch (error) {
88
+ console.error('[FileCache] Failed to clean expired entries:', error instanceof Error ? error.message : error);
89
+ }
90
+ }
91
+ async enforceMaxKeys() {
92
+ try {
93
+ const files = await fs.readdir(this.cacheDir);
94
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
95
+ if (jsonFiles.length > this.maxKeys) {
96
+ // Sort by modification time and remove oldest
97
+ const fileStats = await Promise.all(jsonFiles.map(async (file) => {
98
+ const filePath = path.join(this.cacheDir, file);
99
+ const stats = await fs.stat(filePath);
100
+ return { file, mtime: stats.mtime.getTime() };
101
+ }));
102
+ fileStats.sort((a, b) => a.mtime - b.mtime);
103
+ const toDelete = fileStats.slice(0, jsonFiles.length - this.maxKeys);
104
+ await Promise.all(toDelete.map((item) => {
105
+ const filePath = path.join(this.cacheDir, item.file);
106
+ return fs.unlink(filePath).catch(() => {
107
+ // Ignore errors
108
+ });
109
+ }));
110
+ }
111
+ }
112
+ catch (error) {
113
+ console.error('[FileCache] Failed to enforce max keys:', error instanceof Error ? error.message : error);
114
+ }
115
+ }
116
+ async get(key) {
117
+ try {
118
+ await this.ensureInitialized();
119
+ const filePath = this.getFilePath(key);
120
+ const content = await fs.readFile(filePath, 'utf-8');
121
+ const entry = JSON.parse(content);
122
+ if (entry.expiresAt !== -1 && Date.now() > entry.expiresAt) {
123
+ await this.delete(key);
124
+ return null;
125
+ }
126
+ return entry.value;
127
+ }
128
+ catch (error) {
129
+ if (error.code === 'ENOENT') {
130
+ return null;
131
+ }
132
+ console.error('[FileCache] Failed to get key:', key, error instanceof Error ? error.message : error);
133
+ return null;
134
+ }
135
+ }
136
+ async set(key, value, ttl) {
137
+ try {
138
+ await this.ensureInitialized();
139
+ await this.enforceMaxKeys();
140
+ const expiresAt = ttl
141
+ ? Date.now() + ttl * 1000
142
+ : this.defaultTTL > 0
143
+ ? Date.now() + this.defaultTTL * 1000
144
+ : -1;
145
+ const entry = { value, expiresAt };
146
+ const filePath = this.getFilePath(key);
147
+ await fs.writeFile(filePath, JSON.stringify(entry), 'utf-8');
148
+ }
149
+ catch (error) {
150
+ console.error('[FileCache] Failed to set key:', key, error instanceof Error ? error.message : error);
151
+ }
152
+ }
153
+ async delete(key) {
154
+ try {
155
+ await this.ensureInitialized();
156
+ const filePath = this.getFilePath(key);
157
+ await fs.unlink(filePath);
158
+ }
159
+ catch (error) {
160
+ if (error.code !== 'ENOENT') {
161
+ console.error('[FileCache] Failed to delete key:', key, error instanceof Error ? error.message : error);
162
+ }
163
+ }
164
+ }
165
+ async has(key) {
166
+ const value = await this.get(key);
167
+ return value !== null;
168
+ }
169
+ async clear(pattern) {
170
+ try {
171
+ await this.ensureInitialized();
172
+ const files = await fs.readdir(this.cacheDir);
173
+ if (!pattern) {
174
+ // Clear all cache files
175
+ await Promise.all(files
176
+ .filter((f) => f.endsWith('.json'))
177
+ .map((file) => {
178
+ const filePath = path.join(this.cacheDir, file);
179
+ return fs.unlink(filePath).catch(() => {
180
+ // Ignore errors
181
+ });
182
+ }));
183
+ return;
184
+ }
185
+ // Convert glob pattern to regex
186
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
187
+ // Read all files and check if they match the pattern
188
+ for (const file of files) {
189
+ if (!file.endsWith('.json'))
190
+ continue;
191
+ // Extract original key from filename (reverse sanitization is approximate)
192
+ const keyBase = file.replace('.json', '');
193
+ // We need to read the file to get the original key
194
+ // For now, use a simple pattern match on the sanitized filename
195
+ if (regex.test(keyBase)) {
196
+ const filePath = path.join(this.cacheDir, file);
197
+ await fs.unlink(filePath).catch(() => {
198
+ // Ignore errors
199
+ });
200
+ }
201
+ }
202
+ }
203
+ catch (error) {
204
+ console.error('[FileCache] Failed to clear cache:', error instanceof Error ? error.message : error);
205
+ }
206
+ }
207
+ async mget(keys) {
208
+ return Promise.all(keys.map((key) => this.get(key)));
209
+ }
210
+ async mset(entries) {
211
+ await Promise.all(entries.map(([key, value, ttl]) => this.set(key, value, ttl)));
212
+ }
213
+ async disconnect() {
214
+ if (this.cleanupTimer) {
215
+ clearInterval(this.cleanupTimer);
216
+ this.cleanupTimer = undefined;
217
+ }
218
+ // Don't delete cache files on disconnect - they should persist
219
+ }
220
+ /** Get cache statistics */
221
+ async getStats() {
222
+ try {
223
+ await this.ensureInitialized();
224
+ const files = await fs.readdir(this.cacheDir);
225
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
226
+ // Calculate total size
227
+ let totalSize = 0;
228
+ for (const file of jsonFiles) {
229
+ const filePath = path.join(this.cacheDir, file);
230
+ try {
231
+ const stats = await fs.stat(filePath);
232
+ totalSize += stats.size;
233
+ }
234
+ catch {
235
+ // Ignore errors
236
+ }
237
+ }
238
+ return {
239
+ keys: jsonFiles.length,
240
+ maxKeys: this.maxKeys,
241
+ utilization: (jsonFiles.length / this.maxKeys) * 100,
242
+ sizeBytes: totalSize,
243
+ cacheDir: this.cacheDir,
244
+ };
245
+ }
246
+ catch (error) {
247
+ console.error('[FileCache] Failed to get stats:', error);
248
+ return {
249
+ keys: 0,
250
+ maxKeys: this.maxKeys,
251
+ utilization: 0,
252
+ sizeBytes: 0,
253
+ cacheDir: this.cacheDir,
254
+ };
255
+ }
256
+ }
257
+ /** Manually trigger cleanup of expired entries */
258
+ async cleanup() {
259
+ await this.cleanExpired();
260
+ }
261
+ }
262
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/cache/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CacheProvider } from '@mondaydotcomorg/atp-protocol';
2
+ /**
3
+ * In-memory cache provider with LRU eviction
4
+ * Good for development and single-server deployments
5
+ */
6
+ export declare class MemoryCache implements CacheProvider {
7
+ name: string;
8
+ private cache;
9
+ private maxKeys;
10
+ private defaultTTL;
11
+ constructor(options?: {
12
+ maxKeys?: number;
13
+ defaultTTL?: number;
14
+ });
15
+ get<T>(key: string): Promise<T | null>;
16
+ set(key: string, value: unknown, ttl?: number): Promise<void>;
17
+ delete(key: string): Promise<void>;
18
+ has(key: string): Promise<boolean>;
19
+ clear(pattern?: string): Promise<void>;
20
+ mget(keys: string[]): Promise<Array<unknown | null>>;
21
+ mset(entries: Array<[string, unknown, number?]>): Promise<void>;
22
+ disconnect(): Promise<void>;
23
+ /** Get cache statistics */
24
+ getStats(): {
25
+ keys: number;
26
+ maxKeys: number;
27
+ utilization: number;
28
+ };
29
+ }
30
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAOnE;;;GAGG;AACH,qBAAa,WAAY,YAAW,aAAa;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAM7D,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAkBtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAIpD,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,2BAA2B;IAC3B,QAAQ;;;;;CAOR"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * In-memory cache provider with LRU eviction
3
+ * Good for development and single-server deployments
4
+ */
5
+ export class MemoryCache {
6
+ name = 'memory';
7
+ cache;
8
+ maxKeys;
9
+ defaultTTL;
10
+ constructor(options = {}) {
11
+ this.cache = new Map();
12
+ this.maxKeys = options.maxKeys || 1000;
13
+ this.defaultTTL = options.defaultTTL || 3600;
14
+ }
15
+ async get(key) {
16
+ const entry = this.cache.get(key);
17
+ if (!entry) {
18
+ return null;
19
+ }
20
+ if (entry.expiresAt !== -1 && Date.now() > entry.expiresAt) {
21
+ this.cache.delete(key);
22
+ return null;
23
+ }
24
+ this.cache.delete(key);
25
+ this.cache.set(key, entry);
26
+ return entry.value;
27
+ }
28
+ async set(key, value, ttl) {
29
+ if (this.cache.size >= this.maxKeys && !this.cache.has(key)) {
30
+ const firstKey = this.cache.keys().next().value;
31
+ if (firstKey) {
32
+ this.cache.delete(firstKey);
33
+ }
34
+ }
35
+ const expiresAt = ttl
36
+ ? Date.now() + ttl * 1000
37
+ : this.defaultTTL > 0
38
+ ? Date.now() + this.defaultTTL * 1000
39
+ : -1;
40
+ this.cache.set(key, { value, expiresAt });
41
+ }
42
+ async delete(key) {
43
+ this.cache.delete(key);
44
+ }
45
+ async has(key) {
46
+ const value = await this.get(key);
47
+ return value !== null;
48
+ }
49
+ async clear(pattern) {
50
+ if (!pattern) {
51
+ this.cache.clear();
52
+ return;
53
+ }
54
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
55
+ for (const key of this.cache.keys()) {
56
+ if (regex.test(key)) {
57
+ this.cache.delete(key);
58
+ }
59
+ }
60
+ }
61
+ async mget(keys) {
62
+ return Promise.all(keys.map((key) => this.get(key)));
63
+ }
64
+ async mset(entries) {
65
+ for (const [key, value, ttl] of entries) {
66
+ await this.set(key, value, ttl);
67
+ }
68
+ }
69
+ async disconnect() {
70
+ this.cache.clear();
71
+ }
72
+ /** Get cache statistics */
73
+ getStats() {
74
+ return {
75
+ keys: this.cache.size,
76
+ maxKeys: this.maxKeys,
77
+ utilization: (this.cache.size / this.maxKeys) * 100,
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { CacheProvider } from '@mondaydotcomorg/atp-protocol';
2
+ import type Redis from 'ioredis';
3
+ export interface RedisCacheOptions {
4
+ redis: Redis;
5
+ keyPrefix?: string;
6
+ defaultTTL?: number;
7
+ }
8
+ /**
9
+ * Redis-backed cache provider for distributed systems
10
+ * Enables cross-pod state sharing and resume capabilities
11
+ */
12
+ export declare class RedisCache implements CacheProvider {
13
+ name: string;
14
+ private redis;
15
+ private keyPrefix;
16
+ private defaultTTL?;
17
+ constructor(options: RedisCacheOptions);
18
+ private getFullKey;
19
+ get<T>(key: string): Promise<T | null>;
20
+ set(key: string, value: unknown, ttl?: number): Promise<void>;
21
+ delete(key: string): Promise<void>;
22
+ has(key: string): Promise<boolean>;
23
+ clear(pattern?: string): Promise<void>;
24
+ mget(keys: string[]): Promise<Array<unknown | null>>;
25
+ mset(entries: Array<[string, unknown, number?]>): Promise<void>;
26
+ disconnect(): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,UAAW,YAAW,aAAa;IAC/C,IAAI,SAAW;IACf,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,OAAO,EAAE,iBAAiB;IAMtC,OAAO,CAAC,UAAU;IAIZ,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAetC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAclC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAcpD,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAUjC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Redis-backed cache provider for distributed systems
3
+ * Enables cross-pod state sharing and resume capabilities
4
+ */
5
+ export class RedisCache {
6
+ name = 'redis';
7
+ redis;
8
+ keyPrefix;
9
+ defaultTTL;
10
+ constructor(options) {
11
+ this.redis = options.redis;
12
+ this.keyPrefix = options.keyPrefix || 'atp:cache:';
13
+ this.defaultTTL = options.defaultTTL;
14
+ }
15
+ getFullKey(key) {
16
+ return `${this.keyPrefix}${key}`;
17
+ }
18
+ async get(key) {
19
+ try {
20
+ const value = await this.redis.get(this.getFullKey(key));
21
+ if (!value)
22
+ return null;
23
+ return JSON.parse(value);
24
+ }
25
+ catch (error) {
26
+ console.error('[RedisCache] Failed to get key:', key, error instanceof Error ? error.message : error);
27
+ return null;
28
+ }
29
+ }
30
+ async set(key, value, ttl) {
31
+ try {
32
+ const serialized = JSON.stringify(value);
33
+ const fullKey = this.getFullKey(key);
34
+ const effectiveTTL = ttl ?? this.defaultTTL;
35
+ if (effectiveTTL) {
36
+ await this.redis.setex(fullKey, effectiveTTL, serialized);
37
+ }
38
+ else {
39
+ await this.redis.set(fullKey, serialized);
40
+ }
41
+ }
42
+ catch (error) {
43
+ console.error('[RedisCache] Failed to set key:', key, error instanceof Error ? error.message : error);
44
+ }
45
+ }
46
+ async delete(key) {
47
+ try {
48
+ await this.redis.del(this.getFullKey(key));
49
+ }
50
+ catch (error) {
51
+ console.error('[RedisCache] Failed to delete key:', key, error instanceof Error ? error.message : error);
52
+ }
53
+ }
54
+ async has(key) {
55
+ try {
56
+ const exists = await this.redis.exists(this.getFullKey(key));
57
+ return exists === 1;
58
+ }
59
+ catch (error) {
60
+ console.error('[RedisCache] Failed to check key:', key, error instanceof Error ? error.message : error);
61
+ return false;
62
+ }
63
+ }
64
+ async clear(pattern) {
65
+ try {
66
+ if (pattern) {
67
+ const fullPattern = this.getFullKey(pattern);
68
+ const keys = await this.redis.keys(fullPattern);
69
+ if (keys.length > 0) {
70
+ await this.redis.del(...keys);
71
+ }
72
+ }
73
+ else {
74
+ const keys = await this.redis.keys(this.getFullKey('*'));
75
+ if (keys.length > 0) {
76
+ await this.redis.del(...keys);
77
+ }
78
+ }
79
+ }
80
+ catch (error) {
81
+ console.error('[RedisCache] Failed to clear cache:', error instanceof Error ? error.message : error);
82
+ }
83
+ }
84
+ async mget(keys) {
85
+ try {
86
+ const fullKeys = keys.map((key) => this.getFullKey(key));
87
+ const values = await this.redis.mget(...fullKeys);
88
+ return values.map((value) => (value ? JSON.parse(value) : null));
89
+ }
90
+ catch (error) {
91
+ console.error('[RedisCache] Failed to mget keys:', error instanceof Error ? error.message : error);
92
+ return keys.map(() => null);
93
+ }
94
+ }
95
+ async mset(entries) {
96
+ try {
97
+ const pipeline = this.redis.pipeline();
98
+ for (const [key, value, ttl] of entries) {
99
+ const serialized = JSON.stringify(value);
100
+ const fullKey = this.getFullKey(key);
101
+ const effectiveTTL = ttl ?? this.defaultTTL;
102
+ if (effectiveTTL) {
103
+ pipeline.setex(fullKey, effectiveTTL, serialized);
104
+ }
105
+ else {
106
+ pipeline.set(fullKey, serialized);
107
+ }
108
+ }
109
+ await pipeline.exec();
110
+ }
111
+ catch (error) {
112
+ console.error('[RedisCache] Failed to mset entries:', error instanceof Error ? error.message : error);
113
+ }
114
+ }
115
+ async disconnect() {
116
+ try {
117
+ await this.redis.quit();
118
+ }
119
+ catch (error) {
120
+ console.error('[RedisCache] Failed to disconnect:', error instanceof Error ? error.message : error);
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { MemoryCache } from './cache/memory.js';
2
+ export { RedisCache } from './cache/redis.js';
3
+ export { FileCache } from './cache/file.js';
4
+ export { EnvAuthProvider } from './auth/env.js';
5
+ export * from './oauth/index.js';
6
+ export { JSONLAuditSink } from './audit/jsonl.js';
7
+ export { OpenTelemetryAuditSink } from './audit/opentelemetry.js';
8
+ export { OTelCounter, OTelHistogram, OTelSpan, OTelAttribute, METRIC_CONFIGS, OTEL_SERVICE_NAME, OTEL_TRACER_NAME, OTEL_METER_NAME, ATTRIBUTE_PREFIX_TOOL, ATTRIBUTE_PREFIX_METADATA, } from './audit/otel-metrics.js';
9
+ export type { CacheProvider, AuthProvider, AuditSink, AuditEvent, AuditFilter, UserCredentialData, } from '@mondaydotcomorg/atp-protocol';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACN,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACX,aAAa,EACb,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,kBAAkB,GAClB,MAAM,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { MemoryCache } from './cache/memory.js';
2
+ export { RedisCache } from './cache/redis.js';
3
+ export { FileCache } from './cache/file.js';
4
+ export { EnvAuthProvider } from './auth/env.js';
5
+ export * from './oauth/index.js';
6
+ export { JSONLAuditSink } from './audit/jsonl.js';
7
+ export { OpenTelemetryAuditSink } from './audit/opentelemetry.js';
8
+ export { OTelCounter, OTelHistogram, OTelSpan, OTelAttribute, METRIC_CONFIGS, OTEL_SERVICE_NAME, OTEL_TRACER_NAME, OTEL_METER_NAME, ATTRIBUTE_PREFIX_TOOL, ATTRIBUTE_PREFIX_METADATA, } from './audit/otel-metrics.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACN,WAAW,EACX,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ScopeCheckerRegistry } from './scope-checkers.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ScopeCheckerRegistry } from './scope-checkers.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}