@1matrix/config-loader 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +352 -0
  2. package/dist/config-loader.d.ts +26 -0
  3. package/dist/config-loader.d.ts.map +1 -0
  4. package/dist/config-loader.js +174 -0
  5. package/dist/config-loader.js.map +1 -0
  6. package/dist/fetcher/file-cache-fetcher.d.ts +9 -0
  7. package/dist/fetcher/file-cache-fetcher.d.ts.map +1 -0
  8. package/dist/fetcher/file-cache-fetcher.js +80 -0
  9. package/dist/fetcher/file-cache-fetcher.js.map +1 -0
  10. package/dist/fetcher/github-fetcher.d.ts +14 -0
  11. package/dist/fetcher/github-fetcher.d.ts.map +1 -0
  12. package/dist/fetcher/github-fetcher.js +123 -0
  13. package/dist/fetcher/github-fetcher.js.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +25 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/poller/config-poller.d.ts +13 -0
  19. package/dist/poller/config-poller.d.ts.map +1 -0
  20. package/dist/poller/config-poller.js +48 -0
  21. package/dist/poller/config-poller.js.map +1 -0
  22. package/dist/types/index.d.ts +32 -0
  23. package/dist/types/index.d.ts.map +1 -0
  24. package/dist/types/index.js +3 -0
  25. package/dist/types/index.js.map +1 -0
  26. package/dist/utils/deep-get.d.ts +2 -0
  27. package/dist/utils/deep-get.d.ts.map +1 -0
  28. package/dist/utils/deep-get.js +18 -0
  29. package/dist/utils/deep-get.js.map +1 -0
  30. package/dist/utils/env-mapper.d.ts +7 -0
  31. package/dist/utils/env-mapper.d.ts.map +1 -0
  32. package/dist/utils/env-mapper.js +15 -0
  33. package/dist/utils/env-mapper.js.map +1 -0
  34. package/dist/utils/logger.d.ts +9 -0
  35. package/dist/utils/logger.d.ts.map +1 -0
  36. package/dist/utils/logger.js +24 -0
  37. package/dist/utils/logger.js.map +1 -0
  38. package/dist/validator/default-schemas.d.ts +2 -0
  39. package/dist/validator/default-schemas.d.ts.map +1 -0
  40. package/dist/validator/default-schemas.js +46 -0
  41. package/dist/validator/default-schemas.js.map +1 -0
  42. package/dist/validator/schema-validator.d.ts +13 -0
  43. package/dist/validator/schema-validator.d.ts.map +1 -0
  44. package/dist/validator/schema-validator.js +52 -0
  45. package/dist/validator/schema-validator.js.map +1 -0
  46. package/dist/webhook/signature-validator.d.ts +6 -0
  47. package/dist/webhook/signature-validator.d.ts.map +1 -0
  48. package/dist/webhook/signature-validator.js +64 -0
  49. package/dist/webhook/signature-validator.js.map +1 -0
  50. package/dist/webhook/webhook-handler.d.ts +11 -0
  51. package/dist/webhook/webhook-handler.d.ts.map +1 -0
  52. package/dist/webhook/webhook-handler.js +60 -0
  53. package/dist/webhook/webhook-handler.js.map +1 -0
  54. package/package.json +50 -0
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookHandler = void 0;
4
+ const signature_validator_1 = require("./signature-validator");
5
+ class WebhookHandler {
6
+ constructor(configLoader, options = {}) {
7
+ this.configLoader = configLoader;
8
+ this.onUpdate = options.onUpdate || (() => { });
9
+ this.onError = options.onError || console.error;
10
+ if (!configLoader.options.webhookSecret) {
11
+ throw new Error('webhookSecret is required for webhook handler');
12
+ }
13
+ this.signatureValidator = new signature_validator_1.SignatureValidator(configLoader.options.webhookSecret);
14
+ }
15
+ createMiddleware() {
16
+ return async (req, res) => {
17
+ try {
18
+ const signature = req.headers['x-hub-signature-256'];
19
+ const payload = JSON.stringify(req.body);
20
+ if (!this.signatureValidator.validate(payload, signature)) {
21
+ return res.status(401).json({
22
+ error: 'Invalid signature',
23
+ message: 'Webhook signature validation failed'
24
+ });
25
+ }
26
+ const event = req.headers['x-github-event'];
27
+ if (event !== 'push') {
28
+ return res.status(200).json({
29
+ message: `Ignored: not a push event (received: ${event})`
30
+ });
31
+ }
32
+ const ref = req.body.ref;
33
+ const expectedRef = `refs/heads/${this.configLoader.options.branch}`;
34
+ if (ref !== expectedRef) {
35
+ return res.status(200).json({
36
+ message: `Ignored: not target branch (expected: ${expectedRef}, got: ${ref})`
37
+ });
38
+ }
39
+ await this.configLoader.refresh();
40
+ const allConfigs = this.configLoader.getAll();
41
+ this.onUpdate(allConfigs);
42
+ return res.status(200).json({
43
+ success: true,
44
+ message: 'Configurations updated successfully',
45
+ configs: Object.keys(allConfigs)
46
+ });
47
+ }
48
+ catch (error) {
49
+ const err = error;
50
+ this.onError(err);
51
+ return res.status(500).json({
52
+ error: 'Internal server error',
53
+ message: err.message
54
+ });
55
+ }
56
+ };
57
+ }
58
+ }
59
+ exports.WebhookHandler = WebhookHandler;
60
+ //# sourceMappingURL=webhook-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-handler.js","sourceRoot":"","sources":["../../src/webhook/webhook-handler.ts"],"names":[],"mappings":";;;AACA,+DAA2D;AAO3D,MAAa,cAAc;IAUzB,YAAY,YAA0B,EAAE,UAAiC,EAAE;QACzE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,wCAAkB,CAC9C,YAAY,CAAC,OAAO,CAAC,aAAa,CACnC,CAAC;IACJ,CAAC;IAMD,gBAAgB;QACd,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YAC3C,IAAI,CAAC;gBAEH,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAuB,CAAC;gBAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEzC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,KAAK,EAAE,mBAAmB;wBAC1B,OAAO,EAAE,qCAAqC;qBAC/C,CAAC,CAAC;gBACL,CAAC;gBAGD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;gBAClE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,wCAAwC,KAAK,GAAG;qBAC1D,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;gBACzB,MAAM,WAAW,GAAG,cAAc,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAErE,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;oBACxB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,yCAAyC,WAAW,UAAU,GAAG,GAAG;qBAC9E,CAAC,CAAC;gBACL,CAAC;gBAGD,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAGlC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAE1B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,qCAAqC;oBAC9C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;iBACjC,CAAC,CAAC;YAEL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAc,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,KAAK,EAAE,uBAAuB;oBAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF;AAlFD,wCAkFC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@1matrix/config-loader",
3
+ "version": "0.1.0",
4
+ "description": "Hot-reloadable public configuration management for Apps with GitHub webhook integration",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "build:watch": "tsc --watch",
10
+ "test": "jest",
11
+ "test:watch": "jest --watch",
12
+ "test:coverage": "jest --coverage",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "config",
17
+ "configuration",
18
+ "github",
19
+ "webhook",
20
+ "hot-reload",
21
+ "web3",
22
+ "typescript"
23
+ ],
24
+ "author": "OneMatrix",
25
+ "license": "MIT",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "dependencies": {
30
+ "@octokit/rest": "^18.12.0",
31
+ "ajv": "^8.12.0",
32
+ "eventemitter3": "^5.0.1"
33
+ },
34
+ "devDependencies": {
35
+ "@ethersproject/keccak256": "^5.7.0",
36
+ "@ethersproject/strings": "^5.7.0",
37
+ "@types/express": "^4.17.21",
38
+ "@types/jest": "^29.5.11",
39
+ "@types/node": "^20.10.6",
40
+ "express": "^4.18.2",
41
+ "jest": "^29.7.0",
42
+ "nock": "^13.5.0",
43
+ "supertest": "^6.3.4",
44
+ "ts-jest": "^29.1.1",
45
+ "typescript": "^5.3.3"
46
+ },
47
+ "engines": {
48
+ "node": ">=16.0.0"
49
+ }
50
+ }