@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.
- package/README.md +133 -6
- package/dist/adapters/express-auth.d.ts +18 -0
- package/dist/adapters/express-auth.d.ts.map +1 -0
- package/dist/adapters/express-auth.js +32 -0
- package/dist/adapters/express-auth.js.map +1 -0
- package/dist/adapters/express-webhook.d.ts +6 -0
- package/dist/adapters/express-webhook.d.ts.map +1 -0
- package/dist/adapters/express-webhook.js +14 -0
- package/dist/adapters/express-webhook.js.map +1 -0
- package/dist/adapters/fastify-auth.d.ts +18 -0
- package/dist/adapters/fastify-auth.d.ts.map +1 -0
- package/dist/adapters/fastify-auth.js +32 -0
- package/dist/adapters/fastify-auth.js.map +1 -0
- package/dist/adapters/fastify-webhook.d.ts +13 -0
- package/dist/adapters/fastify-webhook.d.ts.map +1 -0
- package/dist/adapters/fastify-webhook.js +14 -0
- package/dist/adapters/fastify-webhook.js.map +1 -0
- package/dist/auth/api-key-verifier.d.ts +8 -0
- package/dist/auth/api-key-verifier.d.ts.map +1 -0
- package/dist/auth/api-key-verifier.js +30 -0
- package/dist/auth/api-key-verifier.js.map +1 -0
- package/dist/auth/hash-utils.d.ts +2 -0
- package/dist/auth/hash-utils.d.ts.map +1 -0
- package/dist/auth/hash-utils.js +9 -0
- package/dist/auth/hash-utils.js.map +1 -0
- package/dist/config-loader.d.ts +2 -0
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +6 -0
- package/dist/config-loader.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/webhook/webhook-core.d.ts +20 -0
- package/dist/webhook/webhook-core.d.ts.map +1 -0
- package/dist/webhook/webhook-core.js +77 -0
- package/dist/webhook/webhook-core.js.map +1 -0
- 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
|
|
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
|
|
92
|
+
"/webhook/config",
|
|
88
93
|
express.json(),
|
|
89
|
-
config
|
|
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
|
-
**`
|
|
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
|
-
**`
|
|
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
|
-
**`
|
|
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 @@
|
|
|
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"}
|
package/dist/config-loader.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/config-loader.js
CHANGED
|
@@ -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":";;;;;;AAAA,kEAAyC;AACzC,6DAAyD;AACzD,qEAAgE;AAChE,mEAA+D;AAC/D,+DAA2D;AAC3D,0DAAsD;AACtD,mDAA+C;AAC/C,+CAA2C;AAC3C,iEAA6D;AAC7D,2CAAwC;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
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",
|