@1matrix/config-loader 0.1.2 → 0.1.3

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 (39) hide show
  1. package/README.md +133 -6
  2. package/dist/adapters/express-auth.d.ts +18 -0
  3. package/dist/adapters/express-auth.d.ts.map +1 -0
  4. package/dist/adapters/express-auth.js +32 -0
  5. package/dist/adapters/express-auth.js.map +1 -0
  6. package/dist/adapters/express-webhook.d.ts +6 -0
  7. package/dist/adapters/express-webhook.d.ts.map +1 -0
  8. package/dist/adapters/express-webhook.js +14 -0
  9. package/dist/adapters/express-webhook.js.map +1 -0
  10. package/dist/adapters/fastify-auth.d.ts +18 -0
  11. package/dist/adapters/fastify-auth.d.ts.map +1 -0
  12. package/dist/adapters/fastify-auth.js +32 -0
  13. package/dist/adapters/fastify-auth.js.map +1 -0
  14. package/dist/adapters/fastify-webhook.d.ts +13 -0
  15. package/dist/adapters/fastify-webhook.d.ts.map +1 -0
  16. package/dist/adapters/fastify-webhook.js +14 -0
  17. package/dist/adapters/fastify-webhook.js.map +1 -0
  18. package/dist/auth/api-key-verifier.d.ts +8 -0
  19. package/dist/auth/api-key-verifier.d.ts.map +1 -0
  20. package/dist/auth/api-key-verifier.js +30 -0
  21. package/dist/auth/api-key-verifier.js.map +1 -0
  22. package/dist/auth/hash-utils.d.ts +2 -0
  23. package/dist/auth/hash-utils.d.ts.map +1 -0
  24. package/dist/auth/hash-utils.js +9 -0
  25. package/dist/auth/hash-utils.js.map +1 -0
  26. package/dist/config-loader.d.ts +2 -0
  27. package/dist/config-loader.d.ts.map +1 -1
  28. package/dist/config-loader.js +6 -0
  29. package/dist/config-loader.js.map +1 -1
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +15 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/webhook/webhook-core.d.ts +20 -0
  36. package/dist/webhook/webhook-core.d.ts.map +1 -0
  37. package/dist/webhook/webhook-core.js +77 -0
  38. package/dist/webhook/webhook-core.js.map +1 -0
  39. package/package.json +3 -3
package/README.md CHANGED
@@ -13,6 +13,8 @@ Hot-reloadable public configuration management for Applications with GitHub webh
13
13
  - ✅ **Fail-safe Caching**: Local cache fallback when GitHub is unavailable
14
14
  - ✅ **TypeScript**: Full TypeScript support with type definitions
15
15
  - ✅ **Event-Driven**: Listen to configuration changes with EventEmitter
16
+ - ✅ **Framework Adapters**: Built-in Express and Fastify support
17
+ - ✅ **API Key Auth**: Ready-to-use API key authentication middleware
16
18
 
17
19
  ## Installation
18
20
 
@@ -76,23 +78,77 @@ config.on("validation-error", (configName, errors) => {
76
78
  });
77
79
  ```
78
80
 
79
- ### 4. Set Up Webhook (Express)
81
+ ### 4. Set Up Webhook
82
+
83
+ **Express:**
80
84
 
81
85
  ```typescript
82
86
  import express from "express";
87
+ import { createExpressWebhook } from "@1matrix/config-loader";
83
88
 
84
89
  const app = express();
85
90
 
86
91
  app.post(
87
- "/webhook/config-update",
92
+ "/webhook/config",
88
93
  express.json(),
89
- config.createWebhookHandler({
94
+ createExpressWebhook(config, {
90
95
  onUpdate: (configs) => console.log("Updated via webhook"),
91
96
  onError: (err) => console.error(err),
92
97
  })
93
98
  );
94
99
  ```
95
100
 
101
+ **Fastify:**
102
+
103
+ ```typescript
104
+ import Fastify from "fastify";
105
+ import { createFastifyWebhook } from "@1matrix/config-loader";
106
+
107
+ const fastify = Fastify();
108
+
109
+ fastify.post("/webhook/config", createFastifyWebhook(config, {
110
+ onUpdate: (configs) => console.log("Updated via webhook"),
111
+ onError: (err) => console.error(err),
112
+ }));
113
+ ```
114
+
115
+ ### 5. Protect Routes with API Key Authentication
116
+
117
+ **Express:**
118
+
119
+ ```typescript
120
+ import { createExpressApiKeyAuth } from "@1matrix/config-loader";
121
+
122
+ // Default: uses Keccak256 hashing (most common)
123
+ app.use("/api", createExpressApiKeyAuth(config));
124
+
125
+ // If clients send pre-hashed keys (disable hashing)
126
+ app.use("/api", createExpressApiKeyAuth(config, { hashFn: null }));
127
+
128
+ app.get("/api/protected", (req, res) => {
129
+ res.json({ authenticatedAs: req.apiKeyName });
130
+ });
131
+ ```
132
+
133
+ **Fastify:**
134
+
135
+ ```typescript
136
+ import { createFastifyApiKeyAuth } from "@1matrix/config-loader";
137
+
138
+ // Default: uses Keccak256 hashing (most common)
139
+ fastify.addHook("preHandler", createFastifyApiKeyAuth(config));
140
+
141
+ // If clients send pre-hashed keys (disable hashing)
142
+ fastify.addHook("preHandler", createFastifyApiKeyAuth(config, { hashFn: null }));
143
+
144
+ // Or apply to specific routes
145
+ fastify.get("/api/protected", {
146
+ preHandler: createFastifyApiKeyAuth(config)
147
+ }, async (request) => {
148
+ return { authenticatedAs: request.apiKeyName };
149
+ });
150
+ ```
151
+
96
152
  ## Configuration Repository Structure
97
153
 
98
154
  Your GitHub configuration repository should follow this structure:
@@ -115,7 +171,7 @@ public-configs/
115
171
 
116
172
  ### Example Configurations
117
173
 
118
- **`dev/api-keys.json`**
174
+ **`api/keys-dev.json`**
119
175
 
120
176
  ```json
121
177
  {
@@ -124,7 +180,7 @@ public-configs/
124
180
  }
125
181
  ```
126
182
 
127
- **`dev/roles.json`**
183
+ **`rabc/roles-dev.json`**
128
184
 
129
185
  ```json
130
186
  {
@@ -136,7 +192,7 @@ public-configs/
136
192
  }
137
193
  ```
138
194
 
139
- **`dev/intent-handlers.json`**
195
+ **`intent/handlers-dev.json`**
140
196
 
141
197
  ```json
142
198
  [
@@ -165,6 +221,77 @@ public-configs/
165
221
 
166
222
  ## API Reference
167
223
 
224
+ ### Framework Adapters
225
+
226
+ #### `createExpressWebhook(configLoader, options?)`
227
+
228
+ Create Express middleware for handling GitHub webhook requests.
229
+
230
+ **Parameters:**
231
+ - `configLoader: ConfigLoader` - ConfigLoader instance
232
+ - `options?: WebhookCoreOptions` - Optional webhook handler options
233
+ - `onUpdate?: (configs) => void` - Called when configs are updated
234
+ - `onError?: (error) => void` - Called on errors
235
+
236
+ **Returns:** Express middleware function
237
+
238
+ #### `createFastifyWebhook(configLoader, options?)`
239
+
240
+ Create Fastify route handler for GitHub webhook requests.
241
+
242
+ **Parameters:** Same as `createExpressWebhook`
243
+
244
+ **Returns:** Fastify route handler function
245
+
246
+ #### `createExpressApiKeyAuth(configLoader, options?)`
247
+
248
+ Create Express middleware for API key authentication.
249
+
250
+ **Parameters:**
251
+ - `configLoader: ConfigLoader` - ConfigLoader instance
252
+ - `options?: ExpressApiKeyAuthOptions`
253
+ - `headerName?: string` - Header to extract API key from (default: `x-api-key`)
254
+ - `hashFn?: (raw: string) => string` - Function to hash raw API keys
255
+ - `onError?: (req, res, error) => void` - Custom error handler
256
+ - `onSuccess?: (req, res, name) => void` - Custom success handler
257
+
258
+ **Returns:** Express middleware function
259
+
260
+ **Note:** Attaches `apiKeyName` to `req` object when authentication succeeds.
261
+
262
+ #### `createFastifyApiKeyAuth(configLoader, options?)`
263
+
264
+ Create Fastify preHandler hook for API key authentication.
265
+
266
+ **Parameters:**
267
+ - `configLoader: ConfigLoader` - ConfigLoader instance
268
+ - `options?: FastifyApiKeyAuthOptions`
269
+ - `headerName?: string` - Header to extract API key from (default: `x-api-key`)
270
+ - `hashFn?: (raw: string) => string` - Function to hash raw API keys
271
+ - `onError?: (request, reply, error) => void` - Custom error handler
272
+ - `onSuccess?: (request, reply, name) => void` - Custom success handler
273
+
274
+ **Returns:** Fastify preHandler hook function
275
+
276
+ **Note:** Attaches `apiKeyName` to `request` object when authentication succeeds.
277
+
278
+ #### `verifyApiKey(configLoader, hashedKey)`
279
+
280
+ Low-level API key verification utility (used internally by auth adapters).
281
+
282
+ **Parameters:**
283
+ - `configLoader: ConfigLoader` - ConfigLoader instance
284
+ - `hashedKey: string | undefined` - Pre-hashed API key
285
+
286
+ **Returns:** `ApiKeyVerificationResult`
287
+ ```typescript
288
+ {
289
+ valid: boolean;
290
+ name?: string; // API key name if valid
291
+ error?: string; // Error message if invalid
292
+ }
293
+ ```
294
+
168
295
  ### ConfigLoader Options
169
296
 
170
297
  ```typescript
@@ -0,0 +1,18 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { ConfigLoader } from '../config-loader';
3
+ export interface ExpressApiKeyAuthOptions {
4
+ headerName?: string;
5
+ hashFn?: ((rawKey: string) => string) | null;
6
+ onError?: (req: Request, res: Response, error: string) => void;
7
+ onSuccess?: (req: Request, res: Response, name: string) => void;
8
+ }
9
+ declare global {
10
+ namespace Express {
11
+ interface Request {
12
+ apiKeyName?: string;
13
+ }
14
+ }
15
+ }
16
+ export type ExpressApiKeyMiddleware = (req: Request, res: Response, next: NextFunction) => void;
17
+ export declare function createExpressApiKeyAuth(configLoader: ConfigLoader, options?: ExpressApiKeyAuthOptions): ExpressApiKeyMiddleware;
18
+ //# sourceMappingURL=express-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-auth.d.ts","sourceRoot":"","sources":["../../src/adapters/express-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,MAAM,WAAW,wBAAwB;IAKvC,UAAU,CAAC,EAAE,MAAM,CAAC;IAuBpB,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAM/D,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB;KACF;CACF;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,KACf,IAAI,CAAC;AAiCV,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAoCzB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createExpressApiKeyAuth = createExpressApiKeyAuth;
4
+ const api_key_verifier_1 = require("../auth/api-key-verifier");
5
+ const hash_utils_1 = require("../auth/hash-utils");
6
+ function createExpressApiKeyAuth(configLoader, options = {}) {
7
+ const headerName = options.headerName || 'x-api-key';
8
+ const hashFn = options.hashFn === undefined ? hash_utils_1.defaultHashFn : options.hashFn;
9
+ const onError = options.onError || ((_req, res, error) => {
10
+ res.status(401).json({
11
+ error: 'Unauthorized',
12
+ message: error
13
+ });
14
+ });
15
+ const onSuccess = options.onSuccess || ((req, _res, name) => {
16
+ req.apiKeyName = name;
17
+ });
18
+ return (req, res, next) => {
19
+ let rawKey = req.headers[headerName.toLowerCase()];
20
+ if (Array.isArray(rawKey)) {
21
+ rawKey = rawKey[0];
22
+ }
23
+ const hashedKey = rawKey && hashFn ? hashFn(rawKey) : rawKey;
24
+ const result = (0, api_key_verifier_1.verifyApiKey)(configLoader, hashedKey);
25
+ if (!result.valid) {
26
+ return onError(req, res, result.error || 'Invalid API key');
27
+ }
28
+ onSuccess(req, res, result.name);
29
+ next();
30
+ };
31
+ }
32
+ //# sourceMappingURL=express-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-auth.js","sourceRoot":"","sources":["../../src/adapters/express-auth.ts"],"names":[],"mappings":";;AA8FA,0DAuCC;AAnID,+DAAwD;AACxD,mDAAmD;AA2FnD,SAAgB,uBAAuB,CACrC,YAA0B,EAC1B,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC;IAErD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,0BAAa,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC1D,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAEzD,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAuB,CAAC;QAEzE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAG7D,MAAM,MAAM,GAAG,IAAA,+BAAY,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;QAC9D,CAAC;QAGD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAK,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Request, Response } from 'express';
2
+ import { ConfigLoader } from '../config-loader';
3
+ import { WebhookCoreOptions } from '../webhook/webhook-core';
4
+ export type ExpressWebhookMiddleware = (req: Request, res: Response) => Promise<void | Response>;
5
+ export declare function createExpressWebhook(configLoader: ConfigLoader, options?: WebhookCoreOptions): ExpressWebhookMiddleware;
6
+ //# sourceMappingURL=express-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-webhook.d.ts","sourceRoot":"","sources":["../../src/adapters/express-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAwB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAsBjG,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,kBAAuB,GAC/B,wBAAwB,CAa1B"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createExpressWebhook = createExpressWebhook;
4
+ const webhook_core_1 = require("../webhook/webhook-core");
5
+ function createExpressWebhook(configLoader, options = {}) {
6
+ return async (req, res) => {
7
+ const response = await (0, webhook_core_1.handleWebhookRequest)(configLoader, {
8
+ body: req.body,
9
+ headers: req.headers
10
+ }, options);
11
+ return res.status(response.status).json(response.body);
12
+ };
13
+ }
14
+ //# sourceMappingURL=express-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-webhook.js","sourceRoot":"","sources":["../../src/adapters/express-webhook.ts"],"names":[],"mappings":";;AA0BA,oDAgBC;AAxCD,0DAAmF;AAwBnF,SAAgB,oBAAoB,CAClC,YAA0B,EAC1B,UAA8B,EAAE;IAEhC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAA,mCAAoB,EACzC,YAAY,EACZ;YACE,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAwD;SACtE,EACD,OAAO,CACR,CAAC;QAEF,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ConfigLoader } from '../config-loader';
2
+ export interface FastifyRequest {
3
+ headers: Record<string, string | string[] | undefined>;
4
+ apiKeyName?: string;
5
+ }
6
+ export interface FastifyReply {
7
+ code(statusCode: number): FastifyReply;
8
+ send(payload: any): FastifyReply;
9
+ }
10
+ export interface FastifyApiKeyAuthOptions {
11
+ headerName?: string;
12
+ hashFn?: ((rawKey: string) => string) | null;
13
+ onError?: (request: FastifyRequest, reply: FastifyReply, error: string) => void;
14
+ onSuccess?: (request: FastifyRequest, reply: FastifyReply, name: string) => void;
15
+ }
16
+ export type FastifyApiKeyHook = (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
17
+ export declare function createFastifyApiKeyAuth(configLoader: ConfigLoader, options?: FastifyApiKeyAuthOptions): FastifyApiKeyHook;
18
+ //# sourceMappingURL=fastify-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify-auth.d.ts","sourceRoot":"","sources":["../../src/adapters/fastify-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,YAAY,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IAKvC,UAAU,CAAC,EAAE,MAAM,CAAC;IAuBpB,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAMhF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;AAiCnB,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAoCnB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFastifyApiKeyAuth = createFastifyApiKeyAuth;
4
+ const api_key_verifier_1 = require("../auth/api-key-verifier");
5
+ const hash_utils_1 = require("../auth/hash-utils");
6
+ function createFastifyApiKeyAuth(configLoader, options = {}) {
7
+ const headerName = options.headerName || 'x-api-key';
8
+ const hashFn = options.hashFn === undefined ? hash_utils_1.defaultHashFn : options.hashFn;
9
+ const onError = options.onError || ((_request, reply, error) => {
10
+ reply.code(401).send({
11
+ error: 'Unauthorized',
12
+ message: error
13
+ });
14
+ });
15
+ const onSuccess = options.onSuccess || ((request, _reply, name) => {
16
+ request.apiKeyName = name;
17
+ });
18
+ return async (request, reply) => {
19
+ let rawKey = request.headers[headerName.toLowerCase()];
20
+ if (Array.isArray(rawKey)) {
21
+ rawKey = rawKey[0];
22
+ }
23
+ const hashedKey = rawKey && hashFn ? hashFn(rawKey) : rawKey;
24
+ const result = (0, api_key_verifier_1.verifyApiKey)(configLoader, hashedKey);
25
+ if (!result.valid) {
26
+ onError(request, reply, result.error || 'Invalid API key');
27
+ return;
28
+ }
29
+ onSuccess(request, reply, result.name);
30
+ };
31
+ }
32
+ //# sourceMappingURL=fastify-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify-auth.js","sourceRoot":"","sources":["../../src/adapters/fastify-auth.ts"],"names":[],"mappings":";;AA8FA,0DAuCC;AApID,+DAAwD;AACxD,mDAAmD;AA4FnD,SAAgB,uBAAuB,CACrC,YAA0B,EAC1B,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC;IAErD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,0BAAa,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QAChE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAE5D,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAGD,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAG7D,MAAM,MAAM,GAAG,IAAA,+BAAY,EAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAGD,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAK,CAAC,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { ConfigLoader } from '../config-loader';
2
+ import { WebhookCoreOptions } from '../webhook/webhook-core';
3
+ export interface FastifyRequest {
4
+ body: any;
5
+ headers: Record<string, string | string[] | undefined>;
6
+ }
7
+ export interface FastifyReply {
8
+ code(statusCode: number): FastifyReply;
9
+ send(payload: any): FastifyReply;
10
+ }
11
+ export type FastifyWebhookHandler = (request: FastifyRequest, reply: FastifyReply) => Promise<void | FastifyReply>;
12
+ export declare function createFastifyWebhook(configLoader: ConfigLoader, options?: WebhookCoreOptions): FastifyWebhookHandler;
13
+ //# sourceMappingURL=fastify-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify-webhook.d.ts","sourceRoot":"","sources":["../../src/adapters/fastify-webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAwB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGnF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,YAAY,CAAC;CAClC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;AAsBlC,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,kBAAuB,GAC/B,qBAAqB,CAavB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFastifyWebhook = createFastifyWebhook;
4
+ const webhook_core_1 = require("../webhook/webhook-core");
5
+ function createFastifyWebhook(configLoader, options = {}) {
6
+ return async (request, reply) => {
7
+ const response = await (0, webhook_core_1.handleWebhookRequest)(configLoader, {
8
+ body: request.body,
9
+ headers: request.headers
10
+ }, options);
11
+ return reply.code(response.status).send(response.body);
12
+ };
13
+ }
14
+ //# sourceMappingURL=fastify-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify-webhook.js","sourceRoot":"","sources":["../../src/adapters/fastify-webhook.ts"],"names":[],"mappings":";;AAuCA,oDAgBC;AAtDD,0DAAmF;AAsCnF,SAAgB,oBAAoB,CAClC,YAA0B,EAC1B,UAA8B,EAAE;IAEhC,OAAO,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAA,mCAAoB,EACzC,YAAY,EACZ;YACE,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,EACD,OAAO,CACR,CAAC;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ConfigLoader } from '../config-loader';
2
+ export interface ApiKeyVerificationResult {
3
+ valid: boolean;
4
+ name?: string;
5
+ error?: string;
6
+ }
7
+ export declare function verifyApiKey(configLoader: ConfigLoader, hashedKey: string | undefined): ApiKeyVerificationResult;
8
+ //# sourceMappingURL=api-key-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-verifier.d.ts","sourceRoot":"","sources":["../../src/auth/api-key-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD,wBAAgB,YAAY,CAC1B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,wBAAwB,CAgC1B"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyApiKey = verifyApiKey;
4
+ function verifyApiKey(configLoader, hashedKey) {
5
+ if (!hashedKey) {
6
+ return {
7
+ valid: false,
8
+ error: 'No API key provided'
9
+ };
10
+ }
11
+ const apiKeys = configLoader.get('api-keys');
12
+ if (!apiKeys || typeof apiKeys !== 'object') {
13
+ return {
14
+ valid: false,
15
+ error: 'API keys configuration not loaded'
16
+ };
17
+ }
18
+ const name = apiKeys[hashedKey];
19
+ if (!name) {
20
+ return {
21
+ valid: false,
22
+ error: 'Invalid API key'
23
+ };
24
+ }
25
+ return {
26
+ valid: true,
27
+ name
28
+ };
29
+ }
30
+ //# sourceMappingURL=api-key-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-verifier.js","sourceRoot":"","sources":["../../src/auth/api-key-verifier.ts"],"names":[],"mappings":";;AA8BA,oCAmCC;AAnCD,SAAgB,YAAY,CAC1B,YAA0B,EAC1B,SAA6B;IAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qBAAqB;SAC7B,CAAC;IACJ,CAAC;IAGD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAyB,UAAU,CAAC,CAAC;IAErE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,mCAAmC;SAC3C,CAAC;IACJ,CAAC;IAGD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,iBAAiB;SACzB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function defaultHashFn(rawKey: string): string;
2
+ //# sourceMappingURL=hash-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-utils.d.ts","sourceRoot":"","sources":["../../src/auth/hash-utils.ts"],"names":[],"mappings":"AAgBA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultHashFn = defaultHashFn;
4
+ const keccak256_1 = require("@ethersproject/keccak256");
5
+ const strings_1 = require("@ethersproject/strings");
6
+ function defaultHashFn(rawKey) {
7
+ return (0, keccak256_1.keccak256)((0, strings_1.toUtf8Bytes)(rawKey)).slice(2);
8
+ }
9
+ //# sourceMappingURL=hash-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-utils.js","sourceRoot":"","sources":["../../src/auth/hash-utils.ts"],"names":[],"mappings":";;AAgBA,sCAEC;AAlBD,wDAAqD;AACrD,oDAAqD;AAerD,SAAgB,aAAa,CAAC,MAAc;IAC1C,OAAO,IAAA,qBAAS,EAAC,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import EventEmitter from 'eventemitter3';
2
2
  import { ConfigLoaderOptions, WebhookHandlerOptions, ExpressMiddleware } from './types';
3
+ import { WebhookCoreOptions } from './webhook/webhook-core';
3
4
  export declare class ConfigLoader extends EventEmitter {
4
5
  readonly options: ConfigLoaderOptions;
5
6
  private readonly logger;
@@ -19,6 +20,7 @@ export declare class ConfigLoader extends EventEmitter {
19
20
  getCurrentEnvironment(): string;
20
21
  getConfigNames(): string[];
21
22
  createWebhookHandler(options?: WebhookHandlerOptions): ExpressMiddleware;
23
+ registerFastifyWebhook(app: any, path?: string, options?: WebhookCoreOptions): void;
22
24
  reload(): Promise<void>;
23
25
  private detectChanges;
24
26
  destroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAUzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMxF,qBAAa,YAAa,SAAQ,YAAY;IAC5C,SAAgB,OAAO,EAAE,mBAAmB,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAsB;IAC7B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAK9B,OAAO,EAAE,mBAAmB;IAoDlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyE9B,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS3D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ1B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAQ7B,qBAAqB,IAAI,MAAM;IAQ/B,cAAc,IAAI,MAAM,EAAE;IAS1B,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,iBAAiB;IAQtE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,OAAO,CAAC,aAAa;IA0BrB,OAAO,IAAI,IAAI;CAOhB"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAUzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,qBAAa,YAAa,SAAQ,YAAY;IAC5C,SAAgB,OAAO,EAAE,mBAAmB,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAsB;IAC7B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAK9B,OAAO,EAAE,mBAAmB;IAoDlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyE9B,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS3D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ1B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAQ7B,qBAAqB,IAAI,MAAM;IAQ/B,cAAc,IAAI,MAAM,EAAE;IAU1B,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,iBAAiB;IAyB5E,sBAAsB,CACpB,GAAG,EAAE,GAAG,EACR,IAAI,GAAE,MAA0B,EAChC,OAAO,GAAE,kBAAuB,GAC/B,IAAI;IASD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,OAAO,CAAC,aAAa;IA0BrB,OAAO,IAAI,IAAI;CAOhB"}
@@ -14,6 +14,7 @@ const env_mapper_1 = require("./utils/env-mapper");
14
14
  const deep_get_1 = require("./utils/deep-get");
15
15
  const default_schemas_1 = require("./validator/default-schemas");
16
16
  const logger_1 = require("./utils/logger");
17
+ const fastify_webhook_1 = require("./adapters/fastify-webhook");
17
18
  class ConfigLoader extends eventemitter3_1.default {
18
19
  constructor(options) {
19
20
  super();
@@ -143,6 +144,11 @@ class ConfigLoader extends eventemitter3_1.default {
143
144
  const handler = new webhook_handler_1.WebhookHandler(this, options);
144
145
  return handler.createMiddleware();
145
146
  }
147
+ registerFastifyWebhook(app, path = '/webhook/config', options = {}) {
148
+ const handler = (0, fastify_webhook_1.createFastifyWebhook)(this, options);
149
+ app.post(path, handler);
150
+ this.logger.info(`Fastify webhook registered at POST ${path}`);
151
+ }
146
152
  async reload() {
147
153
  await this.refresh();
148
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,4 +2,17 @@ export { ConfigLoader } from "./config-loader";
2
2
  export * from "./types";
3
3
  export { EnvMapper } from "./utils/env-mapper";
4
4
  export { deepGet } from "./utils/deep-get";
5
+ export { createExpressWebhook } from "./adapters/express-webhook";
6
+ export type { ExpressWebhookMiddleware } from "./adapters/express-webhook";
7
+ export { createFastifyWebhook } from "./adapters/fastify-webhook";
8
+ export type { FastifyWebhookHandler, FastifyRequest, FastifyReply } from "./adapters/fastify-webhook";
9
+ export { createExpressApiKeyAuth } from "./adapters/express-auth";
10
+ export type { ExpressApiKeyAuthOptions, ExpressApiKeyMiddleware } from "./adapters/express-auth";
11
+ export { createFastifyApiKeyAuth } from "./adapters/fastify-auth";
12
+ export type { FastifyApiKeyAuthOptions, FastifyApiKeyHook } from "./adapters/fastify-auth";
13
+ export { verifyApiKey } from "./auth/api-key-verifier";
14
+ export type { ApiKeyVerificationResult } from "./auth/api-key-verifier";
15
+ export { defaultHashFn } from "./auth/hash-utils";
16
+ export { handleWebhookRequest } from "./webhook/webhook-core";
17
+ export type { WebhookRequest, WebhookResponse, WebhookCoreOptions } from "./webhook/webhook-core";
5
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG3F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.deepGet = exports.EnvMapper = exports.ConfigLoader = void 0;
17
+ exports.handleWebhookRequest = exports.defaultHashFn = exports.verifyApiKey = exports.createFastifyApiKeyAuth = exports.createExpressApiKeyAuth = exports.createFastifyWebhook = exports.createExpressWebhook = exports.deepGet = exports.EnvMapper = exports.ConfigLoader = void 0;
18
18
  var config_loader_1 = require("./config-loader");
19
19
  Object.defineProperty(exports, "ConfigLoader", { enumerable: true, get: function () { return config_loader_1.ConfigLoader; } });
20
20
  __exportStar(require("./types"), exports);
@@ -22,4 +22,18 @@ var env_mapper_1 = require("./utils/env-mapper");
22
22
  Object.defineProperty(exports, "EnvMapper", { enumerable: true, get: function () { return env_mapper_1.EnvMapper; } });
23
23
  var deep_get_1 = require("./utils/deep-get");
24
24
  Object.defineProperty(exports, "deepGet", { enumerable: true, get: function () { return deep_get_1.deepGet; } });
25
+ var express_webhook_1 = require("./adapters/express-webhook");
26
+ Object.defineProperty(exports, "createExpressWebhook", { enumerable: true, get: function () { return express_webhook_1.createExpressWebhook; } });
27
+ var fastify_webhook_1 = require("./adapters/fastify-webhook");
28
+ Object.defineProperty(exports, "createFastifyWebhook", { enumerable: true, get: function () { return fastify_webhook_1.createFastifyWebhook; } });
29
+ var express_auth_1 = require("./adapters/express-auth");
30
+ Object.defineProperty(exports, "createExpressApiKeyAuth", { enumerable: true, get: function () { return express_auth_1.createExpressApiKeyAuth; } });
31
+ var fastify_auth_1 = require("./adapters/fastify-auth");
32
+ Object.defineProperty(exports, "createFastifyApiKeyAuth", { enumerable: true, get: function () { return fastify_auth_1.createFastifyApiKeyAuth; } });
33
+ var api_key_verifier_1 = require("./auth/api-key-verifier");
34
+ Object.defineProperty(exports, "verifyApiKey", { enumerable: true, get: function () { return api_key_verifier_1.verifyApiKey; } });
35
+ var hash_utils_1 = require("./auth/hash-utils");
36
+ Object.defineProperty(exports, "defaultHashFn", { enumerable: true, get: function () { return hash_utils_1.defaultHashFn; } });
37
+ var webhook_core_1 = require("./webhook/webhook-core");
38
+ Object.defineProperty(exports, "handleWebhookRequest", { enumerable: true, get: function () { return webhook_core_1.handleWebhookRequest; } });
25
39
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,0CAAwB;AACxB,iDAA+C;AAAtC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,mGAAA,OAAO,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,0CAAwB;AACxB,iDAA+C;AAAtC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,mGAAA,OAAO,OAAA;AAGhB,8DAAkE;AAAzD,uHAAA,oBAAoB,OAAA;AAE7B,8DAAkE;AAAzD,uHAAA,oBAAoB,OAAA;AAI7B,wDAAkE;AAAzD,uHAAA,uBAAuB,OAAA;AAEhC,wDAAkE;AAAzD,uHAAA,uBAAuB,OAAA;AAIhC,4DAAuD;AAA9C,gHAAA,YAAY,OAAA;AAErB,gDAAkD;AAAzC,2GAAA,aAAa,OAAA;AACtB,uDAA8D;AAArD,oHAAA,oBAAoB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAE1F,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAE1F,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,20 @@
1
+ import { ConfigLoader } from '../config-loader';
2
+ export interface WebhookRequest {
3
+ body: any;
4
+ headers: Record<string, string | string[] | undefined>;
5
+ }
6
+ export interface WebhookResponse {
7
+ status: number;
8
+ body: {
9
+ success?: boolean;
10
+ error?: string;
11
+ message: string;
12
+ configs?: string[];
13
+ };
14
+ }
15
+ export interface WebhookCoreOptions {
16
+ onUpdate?: (configs: Record<string, any>) => void;
17
+ onError?: (error: Error) => void;
18
+ }
19
+ export declare function handleWebhookRequest(configLoader: ConfigLoader, request: WebhookRequest, options?: WebhookCoreOptions): Promise<WebhookResponse>;
20
+ //# sourceMappingURL=webhook-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-core.d.ts","sourceRoot":"","sources":["../../src/webhook/webhook-core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAMD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAuF1B"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleWebhookRequest = handleWebhookRequest;
4
+ const signature_validator_1 = require("./signature-validator");
5
+ async function handleWebhookRequest(configLoader, request, options = {}) {
6
+ const onUpdate = options.onUpdate || (() => { });
7
+ const onError = options.onError || console.error;
8
+ try {
9
+ if (!configLoader.options.webhookSecret) {
10
+ return {
11
+ status: 500,
12
+ body: {
13
+ error: 'Configuration error',
14
+ message: 'webhookSecret is required for webhook handler'
15
+ }
16
+ };
17
+ }
18
+ const signatureValidator = new signature_validator_1.SignatureValidator(configLoader.options.webhookSecret);
19
+ const signature = Array.isArray(request.headers['x-hub-signature-256'])
20
+ ? request.headers['x-hub-signature-256'][0]
21
+ : request.headers['x-hub-signature-256'];
22
+ const payload = JSON.stringify(request.body);
23
+ if (!signatureValidator.validate(payload, signature)) {
24
+ return {
25
+ status: 401,
26
+ body: {
27
+ error: 'Invalid signature',
28
+ message: 'Webhook signature validation failed'
29
+ }
30
+ };
31
+ }
32
+ const event = Array.isArray(request.headers['x-github-event'])
33
+ ? request.headers['x-github-event'][0]
34
+ : request.headers['x-github-event'];
35
+ if (event !== 'push') {
36
+ return {
37
+ status: 200,
38
+ body: {
39
+ message: `Ignored: not a push event (received: ${event})`
40
+ }
41
+ };
42
+ }
43
+ const ref = request.body.ref;
44
+ const expectedRef = `refs/heads/${configLoader.options.branch}`;
45
+ if (ref !== expectedRef) {
46
+ return {
47
+ status: 200,
48
+ body: {
49
+ message: `Ignored: not target branch (expected: ${expectedRef}, got: ${ref})`
50
+ }
51
+ };
52
+ }
53
+ await configLoader.refresh();
54
+ const allConfigs = configLoader.getAll();
55
+ onUpdate(allConfigs);
56
+ return {
57
+ status: 200,
58
+ body: {
59
+ success: true,
60
+ message: 'Configurations updated successfully',
61
+ configs: Object.keys(allConfigs)
62
+ }
63
+ };
64
+ }
65
+ catch (error) {
66
+ const err = error;
67
+ onError(err);
68
+ return {
69
+ status: 500,
70
+ body: {
71
+ error: 'Internal server error',
72
+ message: err.message
73
+ }
74
+ };
75
+ }
76
+ }
77
+ //# sourceMappingURL=webhook-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-core.js","sourceRoot":"","sources":["../../src/webhook/webhook-core.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1matrix/config-loader",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Hot-reloadable public configuration management for Apps with GitHub webhook integration",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,13 +26,13 @@
26
26
  "dist"
27
27
  ],
28
28
  "dependencies": {
29
+ "@ethersproject/keccak256": "^5.7.0",
30
+ "@ethersproject/strings": "^5.7.0",
29
31
  "@octokit/rest": "^18.12.0",
30
32
  "ajv": "^8.12.0",
31
33
  "eventemitter3": "^5.0.1"
32
34
  },
33
35
  "devDependencies": {
34
- "@ethersproject/keccak256": "^5.7.0",
35
- "@ethersproject/strings": "^5.7.0",
36
36
  "@types/express": "^4.17.21",
37
37
  "@types/jest": "^29.5.11",
38
38
  "@types/node": "^20.10.6",