apitally 0.1.1 → 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 (183) hide show
  1. package/lib/cjs/common/client.js +395 -0
  2. package/lib/cjs/common/client.js.map +1 -0
  3. package/lib/cjs/common/index.js +13 -0
  4. package/lib/cjs/common/index.js.map +1 -0
  5. package/lib/cjs/common/keyRegistry.js +162 -0
  6. package/lib/cjs/common/keyRegistry.js.map +1 -0
  7. package/lib/cjs/common/logging.js +17 -0
  8. package/lib/cjs/common/logging.js.map +1 -0
  9. package/lib/cjs/common/requestLogger.js +69 -0
  10. package/lib/cjs/common/requestLogger.js.map +1 -0
  11. package/lib/cjs/common/types.js +6 -0
  12. package/lib/cjs/common/types.js.map +1 -0
  13. package/lib/cjs/common/utils.js +24 -0
  14. package/lib/cjs/common/utils.js.map +1 -0
  15. package/lib/cjs/common/validationErrorLogger.js +58 -0
  16. package/lib/cjs/common/validationErrorLogger.js.map +1 -0
  17. package/lib/cjs/express/auth.js +105 -0
  18. package/lib/cjs/express/auth.js.map +1 -0
  19. package/lib/cjs/express/index.js +27 -0
  20. package/lib/cjs/express/index.js.map +1 -0
  21. package/lib/cjs/express/listEndpoints.js +175 -0
  22. package/lib/cjs/express/listEndpoints.js.map +1 -0
  23. package/lib/cjs/express/middleware.js +167 -0
  24. package/lib/cjs/express/middleware.js.map +1 -0
  25. package/lib/cjs/fastify/auth.js +105 -0
  26. package/lib/cjs/fastify/auth.js.map +1 -0
  27. package/lib/cjs/fastify/index.js +28 -0
  28. package/lib/cjs/fastify/index.js.map +1 -0
  29. package/lib/cjs/fastify/plugin.js +147 -0
  30. package/lib/cjs/fastify/plugin.js.map +1 -0
  31. package/lib/cjs/index.js +6 -0
  32. package/lib/cjs/index.js.map +1 -0
  33. package/lib/cjs/koa/auth.js +113 -0
  34. package/lib/cjs/koa/auth.js.map +1 -0
  35. package/lib/cjs/koa/index.js +27 -0
  36. package/lib/cjs/koa/index.js.map +1 -0
  37. package/lib/cjs/koa/middleware.js +122 -0
  38. package/lib/cjs/koa/middleware.js.map +1 -0
  39. package/lib/cjs/nestjs/auth.js +132 -0
  40. package/lib/cjs/nestjs/auth.js.map +1 -0
  41. package/lib/cjs/nestjs/index.js +39 -0
  42. package/lib/cjs/nestjs/index.js.map +1 -0
  43. package/lib/esm/common/client.js +385 -0
  44. package/lib/esm/common/client.js.map +1 -0
  45. package/lib/esm/common/index.js +1 -0
  46. package/lib/esm/common/index.js.map +1 -0
  47. package/lib/esm/common/keyRegistry.js +155 -0
  48. package/lib/esm/common/keyRegistry.js.map +1 -0
  49. package/lib/esm/common/logging.js +11 -0
  50. package/lib/esm/common/logging.js.map +1 -0
  51. package/lib/esm/common/requestLogger.js +63 -0
  52. package/lib/esm/common/requestLogger.js.map +1 -0
  53. package/lib/esm/common/types.js +1 -0
  54. package/lib/esm/common/types.js.map +1 -0
  55. package/lib/esm/common/utils.js +16 -0
  56. package/lib/esm/common/utils.js.map +1 -0
  57. package/lib/esm/common/validationErrorLogger.js +52 -0
  58. package/lib/esm/common/validationErrorLogger.js.map +1 -0
  59. package/lib/esm/express/auth.js +98 -0
  60. package/lib/esm/express/auth.js.map +1 -0
  61. package/lib/esm/express/index.js +4 -0
  62. package/lib/esm/express/index.js.map +1 -0
  63. package/lib/esm/express/listEndpoints.js +168 -0
  64. package/lib/esm/express/listEndpoints.js.map +1 -0
  65. package/lib/esm/express/middleware.js +160 -0
  66. package/lib/esm/express/middleware.js.map +1 -0
  67. package/lib/esm/fastify/auth.js +98 -0
  68. package/lib/esm/fastify/auth.js.map +1 -0
  69. package/lib/esm/fastify/index.js +4 -0
  70. package/lib/esm/fastify/index.js.map +1 -0
  71. package/lib/esm/fastify/plugin.js +140 -0
  72. package/lib/esm/fastify/plugin.js.map +1 -0
  73. package/lib/esm/index.js +1 -0
  74. package/lib/esm/index.js.map +1 -0
  75. package/lib/esm/koa/auth.js +106 -0
  76. package/lib/esm/koa/auth.js.map +1 -0
  77. package/lib/esm/koa/index.js +4 -0
  78. package/lib/esm/koa/index.js.map +1 -0
  79. package/lib/esm/koa/middleware.js +115 -0
  80. package/lib/esm/koa/middleware.js.map +1 -0
  81. package/lib/esm/nestjs/auth.js +126 -0
  82. package/lib/esm/nestjs/auth.js.map +1 -0
  83. package/lib/esm/nestjs/index.js +4 -0
  84. package/lib/esm/nestjs/index.js.map +1 -0
  85. package/{dist/src → lib/types}/common/client.d.ts +7 -6
  86. package/lib/types/common/client.d.ts.map +1 -0
  87. package/lib/types/common/index.d.ts +2 -0
  88. package/{dist/src → lib/types}/common/index.d.ts.map +1 -1
  89. package/{dist/src → lib/types}/common/requestLogger.d.ts +1 -1
  90. package/{dist/src → lib/types}/common/requestLogger.d.ts.map +1 -1
  91. package/{dist/src → lib/types}/common/types.d.ts +2 -2
  92. package/lib/types/common/types.d.ts.map +1 -0
  93. package/{dist/src → lib/types}/common/validationErrorLogger.d.ts +1 -1
  94. package/{dist/src → lib/types}/common/validationErrorLogger.d.ts.map +1 -1
  95. package/{dist/src → lib/types}/express/auth.d.ts +1 -1
  96. package/lib/types/express/auth.d.ts.map +1 -0
  97. package/lib/types/express/index.d.ts +4 -0
  98. package/{dist/src → lib/types}/express/index.d.ts.map +1 -1
  99. package/lib/types/express/listEndpoints.d.ts +3 -0
  100. package/{dist/src → lib/types}/express/middleware.d.ts +3 -3
  101. package/lib/types/express/middleware.d.ts.map +1 -0
  102. package/{dist/src → lib/types}/fastify/auth.d.ts +1 -1
  103. package/lib/types/fastify/auth.d.ts.map +1 -0
  104. package/lib/types/fastify/index.d.ts +4 -0
  105. package/{dist/src → lib/types}/fastify/index.d.ts.map +1 -1
  106. package/lib/types/fastify/plugin.d.ts +15 -0
  107. package/lib/types/fastify/plugin.d.ts.map +1 -0
  108. package/lib/types/koa/index.d.ts +4 -0
  109. package/{dist/src → lib/types}/koa/index.d.ts.map +1 -1
  110. package/{dist/src → lib/types}/koa/middleware.d.ts +1 -1
  111. package/{dist/src → lib/types}/koa/middleware.d.ts.map +1 -1
  112. package/{dist/src → lib/types}/nestjs/auth.d.ts +1 -1
  113. package/{dist/src → lib/types}/nestjs/auth.d.ts.map +1 -1
  114. package/lib/types/nestjs/index.d.ts +4 -0
  115. package/lib/types/nestjs/index.d.ts.map +1 -0
  116. package/package.json +117 -8
  117. package/dist/src/common/client.d.ts.map +0 -1
  118. package/dist/src/common/client.js +0 -244
  119. package/dist/src/common/client.js.map +0 -1
  120. package/dist/src/common/index.d.ts +0 -2
  121. package/dist/src/common/index.js +0 -6
  122. package/dist/src/common/index.js.map +0 -1
  123. package/dist/src/common/keyRegistry.js +0 -90
  124. package/dist/src/common/keyRegistry.js.map +0 -1
  125. package/dist/src/common/logging.js +0 -13
  126. package/dist/src/common/logging.js.map +0 -1
  127. package/dist/src/common/requestLogger.js +0 -49
  128. package/dist/src/common/requestLogger.js.map +0 -1
  129. package/dist/src/common/types.d.ts.map +0 -1
  130. package/dist/src/common/types.js +0 -3
  131. package/dist/src/common/types.js.map +0 -1
  132. package/dist/src/common/utils.js +0 -23
  133. package/dist/src/common/utils.js.map +0 -1
  134. package/dist/src/common/validationErrorLogger.js +0 -40
  135. package/dist/src/common/validationErrorLogger.js.map +0 -1
  136. package/dist/src/express/auth.d.ts.map +0 -1
  137. package/dist/src/express/auth.js +0 -66
  138. package/dist/src/express/auth.js.map +0 -1
  139. package/dist/src/express/index.d.ts +0 -4
  140. package/dist/src/express/index.js +0 -10
  141. package/dist/src/express/index.js.map +0 -1
  142. package/dist/src/express/listEndpoints.d.ts +0 -3
  143. package/dist/src/express/listEndpoints.js +0 -166
  144. package/dist/src/express/listEndpoints.js.map +0 -1
  145. package/dist/src/express/middleware.d.ts.map +0 -1
  146. package/dist/src/express/middleware.js +0 -164
  147. package/dist/src/express/middleware.js.map +0 -1
  148. package/dist/src/fastify/auth.d.ts.map +0 -1
  149. package/dist/src/fastify/auth.js +0 -66
  150. package/dist/src/fastify/auth.js.map +0 -1
  151. package/dist/src/fastify/index.d.ts +0 -4
  152. package/dist/src/fastify/index.js +0 -13
  153. package/dist/src/fastify/index.js.map +0 -1
  154. package/dist/src/fastify/plugin.d.ts +0 -16
  155. package/dist/src/fastify/plugin.d.ts.map +0 -1
  156. package/dist/src/fastify/plugin.js +0 -124
  157. package/dist/src/fastify/plugin.js.map +0 -1
  158. package/dist/src/index.js +0 -3
  159. package/dist/src/index.js.map +0 -1
  160. package/dist/src/koa/auth.js +0 -67
  161. package/dist/src/koa/auth.js.map +0 -1
  162. package/dist/src/koa/index.d.ts +0 -4
  163. package/dist/src/koa/index.js +0 -10
  164. package/dist/src/koa/index.js.map +0 -1
  165. package/dist/src/koa/middleware.js +0 -108
  166. package/dist/src/koa/middleware.js.map +0 -1
  167. package/dist/src/nestjs/auth.js +0 -88
  168. package/dist/src/nestjs/auth.js.map +0 -1
  169. package/dist/src/nestjs/index.d.ts +0 -4
  170. package/dist/src/nestjs/index.d.ts.map +0 -1
  171. package/dist/src/nestjs/index.js +0 -12
  172. package/dist/src/nestjs/index.js.map +0 -1
  173. /package/{dist/src → lib/types}/common/keyRegistry.d.ts +0 -0
  174. /package/{dist/src → lib/types}/common/keyRegistry.d.ts.map +0 -0
  175. /package/{dist/src → lib/types}/common/logging.d.ts +0 -0
  176. /package/{dist/src → lib/types}/common/logging.d.ts.map +0 -0
  177. /package/{dist/src → lib/types}/common/utils.d.ts +0 -0
  178. /package/{dist/src → lib/types}/common/utils.d.ts.map +0 -0
  179. /package/{dist/src → lib/types}/express/listEndpoints.d.ts.map +0 -0
  180. /package/{dist/src → lib/types}/index.d.ts +0 -0
  181. /package/{dist/src → lib/types}/index.d.ts.map +0 -0
  182. /package/{dist/src → lib/types}/koa/auth.d.ts +0 -0
  183. /package/{dist/src → lib/types}/koa/auth.d.ts.map +0 -0
@@ -0,0 +1,98 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import { ApitallyClient } from "../common/client.js";
4
+ export var requireApiKey = function requireApiKey() {
5
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
6
+ scopes = _ref.scopes,
7
+ customHeader = _ref.customHeader;
8
+ return /*#__PURE__*/function () {
9
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(request, reply, done) {
10
+ var apiKey, authorizationParts, customHeaderValue, client, keyInfo;
11
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
12
+ while (1) switch (_context.prev = _context.next) {
13
+ case 0:
14
+ if (customHeader) {
15
+ _context.next = 13;
16
+ break;
17
+ }
18
+ if (request.headers.authorization) {
19
+ _context.next = 4;
20
+ break;
21
+ }
22
+ reply.code(401).header("WWW-Authenticate", "ApiKey").send({
23
+ error: "Missing authorization header"
24
+ });
25
+ return _context.abrupt("return");
26
+ case 4:
27
+ authorizationParts = request.headers.authorization.split(" ");
28
+ if (!(authorizationParts.length === 2 && authorizationParts[0].toLowerCase() === "apikey")) {
29
+ _context.next = 9;
30
+ break;
31
+ }
32
+ apiKey = authorizationParts[1];
33
+ _context.next = 11;
34
+ break;
35
+ case 9:
36
+ reply.code(401).header("WWW-Authenticate", "ApiKey").send({
37
+ error: "Invalid authorization scheme"
38
+ });
39
+ return _context.abrupt("return");
40
+ case 11:
41
+ _context.next = 14;
42
+ break;
43
+ case 13:
44
+ if (customHeader) {
45
+ customHeaderValue = request.headers[customHeader.toLowerCase()];
46
+ if (typeof customHeaderValue === "string") {
47
+ apiKey = customHeaderValue;
48
+ } else if (Array.isArray(customHeaderValue)) {
49
+ apiKey = customHeaderValue[0];
50
+ }
51
+ }
52
+ case 14:
53
+ if (apiKey) {
54
+ _context.next = 17;
55
+ break;
56
+ }
57
+ reply.code(403).send({
58
+ error: "Missing API key"
59
+ });
60
+ return _context.abrupt("return");
61
+ case 17:
62
+ client = ApitallyClient.getInstance();
63
+ _context.next = 20;
64
+ return client.keyRegistry.get(apiKey);
65
+ case 20:
66
+ keyInfo = _context.sent;
67
+ if (keyInfo) {
68
+ _context.next = 24;
69
+ break;
70
+ }
71
+ reply.code(403).send({
72
+ error: "Invalid API key"
73
+ });
74
+ return _context.abrupt("return");
75
+ case 24:
76
+ if (!(scopes && !keyInfo.hasScopes(scopes))) {
77
+ _context.next = 27;
78
+ break;
79
+ }
80
+ reply.code(403).send({
81
+ error: "Permission denied"
82
+ });
83
+ return _context.abrupt("return");
84
+ case 27:
85
+ request.keyInfo = keyInfo;
86
+ done();
87
+ case 29:
88
+ case "end":
89
+ return _context.stop();
90
+ }
91
+ }, _callee);
92
+ }));
93
+ return function (_x, _x2, _x3) {
94
+ return _ref2.apply(this, arguments);
95
+ };
96
+ }();
97
+ };
98
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","names":["ApitallyClient","requireApiKey","_ref","arguments","length","undefined","scopes","customHeader","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","request","reply","done","apiKey","authorizationParts","customHeaderValue","client","keyInfo","wrap","_callee$","_context","prev","next","headers","authorization","code","header","send","error","abrupt","split","toLowerCase","Array","isArray","getInstance","keyRegistry","get","sent","hasScopes","stop","_x","_x2","_x3","apply"],"sources":["../../../src/fastify/auth.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { KeyInfo } from "../common/keyRegistry.js";
2
+ export { requireApiKey } from "./auth.js";
3
+ export { default as apitallyPlugin } from "./plugin.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["KeyInfo","requireApiKey","default","apitallyPlugin"],"sources":["../../../src/fastify/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,QAAQ,0BAA0B;AAClD,SAASC,aAAa,QAAQ,WAAW;AACzC,SAASC,OAAO,IAAIC,cAAc,QAAQ,aAAa"}
@@ -0,0 +1,140 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ import fp from "fastify-plugin";
7
+ import { ApitallyClient } from "../common/client.js";
8
+ import { KeyInfo } from "../common/keyRegistry.js";
9
+ import { getPackageVersion } from "../common/utils.js";
10
+ var apitallyPlugin = /*#__PURE__*/function () {
11
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(fastify, config) {
12
+ var client, routes;
13
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
14
+ while (1) switch (_context2.prev = _context2.next) {
15
+ case 0:
16
+ client = new ApitallyClient(config);
17
+ routes = [];
18
+ fastify.decorateRequest("consumerIdentifier", null);
19
+ fastify.decorateRequest("keyInfo", null);
20
+ fastify.decorateReply("payload", null);
21
+ fastify.addHook("onRoute", function (routeOptions) {
22
+ var methods = Array.isArray(routeOptions.method) ? routeOptions.method : [routeOptions.method];
23
+ methods.forEach(function (method) {
24
+ routeOptions.onSend;
25
+ if (method !== "HEAD") {
26
+ routes.push({
27
+ method: method,
28
+ path: routeOptions.url
29
+ });
30
+ }
31
+ });
32
+ });
33
+ fastify.addHook("onReady", function () {
34
+ client.setAppInfo(getAppInfo(routes, config.appVersion));
35
+ });
36
+ fastify.addHook("onClose", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
37
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
38
+ while (1) switch (_context.prev = _context.next) {
39
+ case 0:
40
+ _context.next = 2;
41
+ return client.handleShutdown();
42
+ case 2:
43
+ case "end":
44
+ return _context.stop();
45
+ }
46
+ }, _callee);
47
+ })));
48
+ fastify.addHook("onSend", function (request, reply, payload, done) {
49
+ try {
50
+ reply.payload = JSON.parse(payload);
51
+ } catch (error) {} // eslint-disable-line no-empty
52
+ done();
53
+ });
54
+ fastify.addHook("onResponse", function (request, reply, done) {
55
+ // Get path from routeOptions if available (from v4), otherwise fallback to deprecated routerPath
56
+ var path = "routeOptions" in request ? request.routeOptions.url : request.routerPath;
57
+ client.requestLogger.logRequest({
58
+ consumer: getConsumer(request),
59
+ method: request.method,
60
+ path: path,
61
+ statusCode: reply.statusCode,
62
+ responseTime: reply.getResponseTime()
63
+ });
64
+ if ((reply.statusCode === 400 || reply.statusCode === 422) && reply.payload && (!reply.payload.code || reply.payload.code === "FST_ERR_VALIDATION") && typeof reply.payload.message === "string") {
65
+ var validationErrors = extractAjvErrors(reply.payload.message);
66
+ validationErrors.forEach(function (error) {
67
+ client.validationErrorLogger.logValidationError(_objectSpread({
68
+ consumer: getConsumer(request),
69
+ method: request.method,
70
+ path: path
71
+ }, error));
72
+ });
73
+ }
74
+ done();
75
+ });
76
+ case 10:
77
+ case "end":
78
+ return _context2.stop();
79
+ }
80
+ }, _callee2);
81
+ }));
82
+ return function apitallyPlugin(_x, _x2) {
83
+ return _ref.apply(this, arguments);
84
+ };
85
+ }();
86
+ var getAppInfo = function getAppInfo(routes, appVersion) {
87
+ var versions = [["nodejs", process.version]];
88
+ var fastifyVersion = getPackageVersion("fastify");
89
+ var apitallyVersion = getPackageVersion("../..");
90
+ if (fastifyVersion) {
91
+ versions.push(["fastify", fastifyVersion]);
92
+ }
93
+ if (apitallyVersion) {
94
+ versions.push(["apitally", apitallyVersion]);
95
+ }
96
+ if (appVersion) {
97
+ versions.push(["app", appVersion]);
98
+ }
99
+ return {
100
+ paths: routes,
101
+ versions: new Map(versions),
102
+ client: "js:fastify"
103
+ };
104
+ };
105
+ var getConsumer = function getConsumer(request) {
106
+ if (request.consumerIdentifier) {
107
+ return String(request.consumerIdentifier);
108
+ }
109
+ if (request.keyInfo && request.keyInfo instanceof KeyInfo) {
110
+ return "key:".concat(request.keyInfo.keyId);
111
+ }
112
+ return null;
113
+ };
114
+ var extractAjvErrors = function extractAjvErrors(message) {
115
+ var regex = /(?<=^|, )((?:headers|params|query|querystring|body)[/.][^ ]+)(?= )/g;
116
+ var matches = [];
117
+ var match;
118
+ while ((match = regex.exec(message)) !== null) {
119
+ matches.push({
120
+ match: match[0],
121
+ index: match.index
122
+ });
123
+ }
124
+ return matches.map(function (m, i) {
125
+ var endIndex = i + 1 < matches.length ? matches[i + 1].index - 2 : message.length;
126
+ var matchSplit = m.match.split(/[/.]/);
127
+ if (matchSplit[0] === "querystring") {
128
+ matchSplit[0] = "query";
129
+ }
130
+ return {
131
+ loc: matchSplit.join("."),
132
+ msg: message.substring(m.index, endIndex),
133
+ type: ""
134
+ };
135
+ });
136
+ };
137
+ export default fp(apitallyPlugin, {
138
+ name: "apitally"
139
+ });
140
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","names":["fp","ApitallyClient","KeyInfo","getPackageVersion","apitallyPlugin","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee2","fastify","config","client","routes","wrap","_callee2$","_context2","prev","next","decorateRequest","decorateReply","addHook","routeOptions","methods","Array","isArray","method","forEach","onSend","push","path","url","setAppInfo","getAppInfo","appVersion","_callee","_callee$","_context","handleShutdown","stop","request","reply","payload","done","JSON","parse","error","routerPath","requestLogger","logRequest","consumer","getConsumer","statusCode","responseTime","getResponseTime","code","message","validationErrors","extractAjvErrors","validationErrorLogger","logValidationError","_objectSpread","_x","_x2","apply","arguments","versions","process","version","fastifyVersion","apitallyVersion","paths","Map","consumerIdentifier","String","keyInfo","concat","keyId","regex","matches","match","exec","index","map","m","i","endIndex","length","matchSplit","split","loc","join","msg","substring","type","name"],"sources":["../../../src/fastify/plugin.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import { ApitallyClient } from "../common/client.js";
4
+ export var requireApiKey = function requireApiKey() {
5
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
6
+ scopes = _ref.scopes,
7
+ customHeader = _ref.customHeader;
8
+ return /*#__PURE__*/function () {
9
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, next) {
10
+ var apiKey, authorizationParts, customHeaderValue, client, keyInfo;
11
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
12
+ while (1) switch (_context.prev = _context.next) {
13
+ case 0:
14
+ if (customHeader) {
15
+ _context.next = 17;
16
+ break;
17
+ }
18
+ if (ctx.headers.authorization) {
19
+ _context.next = 6;
20
+ break;
21
+ }
22
+ ctx.status = 401;
23
+ ctx.set("WWW-Authenticate", "ApiKey");
24
+ ctx.body = {
25
+ error: "Missing authorization header"
26
+ };
27
+ return _context.abrupt("return");
28
+ case 6:
29
+ authorizationParts = ctx.headers.authorization.split(" ");
30
+ if (!(authorizationParts.length === 2 && authorizationParts[0].toLowerCase() === "apikey")) {
31
+ _context.next = 11;
32
+ break;
33
+ }
34
+ apiKey = authorizationParts[1];
35
+ _context.next = 15;
36
+ break;
37
+ case 11:
38
+ ctx.status = 401;
39
+ ctx.set("WWW-Authenticate", "ApiKey");
40
+ ctx.body = {
41
+ error: "Invalid authorization scheme"
42
+ };
43
+ return _context.abrupt("return");
44
+ case 15:
45
+ _context.next = 18;
46
+ break;
47
+ case 17:
48
+ if (customHeader) {
49
+ customHeaderValue = ctx.headers[customHeader.toLowerCase()];
50
+ if (typeof customHeaderValue === "string") {
51
+ apiKey = customHeaderValue;
52
+ } else if (Array.isArray(customHeaderValue)) {
53
+ apiKey = customHeaderValue[0];
54
+ }
55
+ }
56
+ case 18:
57
+ if (apiKey) {
58
+ _context.next = 22;
59
+ break;
60
+ }
61
+ ctx.status = 403;
62
+ ctx.body = {
63
+ error: "Missing API key"
64
+ };
65
+ return _context.abrupt("return");
66
+ case 22:
67
+ client = ApitallyClient.getInstance();
68
+ _context.next = 25;
69
+ return client.keyRegistry.get(apiKey);
70
+ case 25:
71
+ keyInfo = _context.sent;
72
+ if (keyInfo) {
73
+ _context.next = 30;
74
+ break;
75
+ }
76
+ ctx.status = 403;
77
+ ctx.body = {
78
+ error: "Invalid API key"
79
+ };
80
+ return _context.abrupt("return");
81
+ case 30:
82
+ if (!(scopes && !keyInfo.hasScopes(scopes))) {
83
+ _context.next = 34;
84
+ break;
85
+ }
86
+ ctx.status = 403;
87
+ ctx.body = {
88
+ error: "Permission denied"
89
+ };
90
+ return _context.abrupt("return");
91
+ case 34:
92
+ ctx.state.keyInfo = keyInfo;
93
+ _context.next = 37;
94
+ return next();
95
+ case 37:
96
+ case "end":
97
+ return _context.stop();
98
+ }
99
+ }, _callee);
100
+ }));
101
+ return function (_x, _x2) {
102
+ return _ref2.apply(this, arguments);
103
+ };
104
+ }();
105
+ };
106
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","names":["ApitallyClient","requireApiKey","_ref","arguments","length","undefined","scopes","customHeader","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","ctx","next","apiKey","authorizationParts","customHeaderValue","client","keyInfo","wrap","_callee$","_context","prev","headers","authorization","status","set","body","error","abrupt","split","toLowerCase","Array","isArray","getInstance","keyRegistry","get","sent","hasScopes","state","stop","_x","_x2","apply"],"sources":["../../../src/koa/auth.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { KeyInfo } from "../common/keyRegistry.js";
2
+ export { requireApiKey } from "./auth.js";
3
+ export { useApitally } from "./middleware.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["KeyInfo","requireApiKey","useApitally"],"sources":["../../../src/koa/index.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAO,QAAQ,0BAA0B;AAClD,SAASC,aAAa,QAAQ,WAAW;AACzC,SAASC,WAAW,QAAQ,iBAAiB"}
@@ -0,0 +1,115 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import { ApitallyClient } from "../common/client.js";
4
+ import { KeyInfo } from "../common/keyRegistry.js";
5
+ import { getPackageVersion } from "../common/utils.js";
6
+ export var useApitally = function useApitally(app, config) {
7
+ var client = new ApitallyClient(config);
8
+ var middleware = getMiddleware(client);
9
+ app.use(middleware);
10
+ setTimeout(function () {
11
+ client.setAppInfo(getAppInfo(app, config.appVersion));
12
+ }, 100);
13
+ };
14
+ var getMiddleware = function getMiddleware(client) {
15
+ return /*#__PURE__*/function () {
16
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, next) {
17
+ var startTime, statusCode;
18
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
19
+ while (1) switch (_context.prev = _context.next) {
20
+ case 0:
21
+ startTime = performance.now();
22
+ _context.prev = 1;
23
+ _context.next = 4;
24
+ return next();
25
+ case 4:
26
+ _context.next = 10;
27
+ break;
28
+ case 6:
29
+ _context.prev = 6;
30
+ _context.t0 = _context["catch"](1);
31
+ statusCode = _context.t0.statusCode || _context.t0.status || 500;
32
+ throw _context.t0;
33
+ case 10:
34
+ _context.prev = 10;
35
+ try {
36
+ // _matchedRoute is set by koa-router, routePath is set by koa-route
37
+ if (ctx._matchedRoute || ctx.routePath) {
38
+ client.requestLogger.logRequest({
39
+ consumer: getConsumer(ctx),
40
+ method: ctx.request.method,
41
+ path: ctx._matchedRoute || ctx.routePath,
42
+ statusCode: statusCode || ctx.response.status,
43
+ responseTime: performance.now() - startTime
44
+ });
45
+ }
46
+ } catch (error) {
47
+ client.logger.error("Error while logging request in Apitally middleware.", {
48
+ context: ctx,
49
+ error: error
50
+ });
51
+ }
52
+ return _context.finish(10);
53
+ case 13:
54
+ case "end":
55
+ return _context.stop();
56
+ }
57
+ }, _callee, null, [[1, 6, 10, 13]]);
58
+ }));
59
+ return function (_x, _x2) {
60
+ return _ref.apply(this, arguments);
61
+ };
62
+ }();
63
+ };
64
+ var getConsumer = function getConsumer(ctx) {
65
+ if (ctx.state.consumerIdentifier) {
66
+ return String(ctx.state.consumerIdentifier);
67
+ }
68
+ if (ctx.state.keyInfo && ctx.state.keyInfo instanceof KeyInfo) {
69
+ return "key:".concat(ctx.state.keyInfo.keyId);
70
+ }
71
+ return null;
72
+ };
73
+ var getAppInfo = function getAppInfo(app, appVersion) {
74
+ var versions = [["nodejs", process.version]];
75
+ var koaVersion = getPackageVersion("koa");
76
+ var apitallyVersion = getPackageVersion("../..");
77
+ if (koaVersion) {
78
+ versions.push(["koa", koaVersion]);
79
+ }
80
+ if (apitallyVersion) {
81
+ versions.push(["apitally", apitallyVersion]);
82
+ }
83
+ if (appVersion) {
84
+ versions.push(["app", appVersion]);
85
+ }
86
+ return {
87
+ paths: listEndpoints(app),
88
+ versions: new Map(versions),
89
+ client: "js:koa"
90
+ };
91
+ };
92
+ var isKoaRouterMiddleware = function isKoaRouterMiddleware(middleware) {
93
+ return typeof middleware === "function" && middleware.router && Array.isArray(middleware.router.stack);
94
+ };
95
+ var listEndpoints = function listEndpoints(app) {
96
+ var endpoints = [];
97
+ app.middleware.forEach(function (middleware) {
98
+ if (isKoaRouterMiddleware(middleware)) {
99
+ middleware.router.stack.forEach(function (layer) {
100
+ if (layer.methods && layer.methods.length > 0) {
101
+ layer.methods.forEach(function (method) {
102
+ if (method.toUpperCase() !== "HEAD") {
103
+ endpoints.push({
104
+ method: method.toUpperCase(),
105
+ path: layer.path
106
+ });
107
+ }
108
+ });
109
+ }
110
+ });
111
+ }
112
+ });
113
+ return endpoints;
114
+ };
115
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","names":["ApitallyClient","KeyInfo","getPackageVersion","useApitally","app","config","client","middleware","getMiddleware","use","setTimeout","setAppInfo","getAppInfo","appVersion","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","ctx","next","startTime","statusCode","wrap","_callee$","_context","prev","performance","now","t0","status","_matchedRoute","routePath","requestLogger","logRequest","consumer","getConsumer","method","request","path","response","responseTime","error","logger","context","finish","stop","_x","_x2","apply","arguments","state","consumerIdentifier","String","keyInfo","concat","keyId","versions","process","version","koaVersion","apitallyVersion","push","paths","listEndpoints","Map","isKoaRouterMiddleware","router","Array","isArray","stack","endpoints","forEach","layer","methods","length","toUpperCase"],"sources":["../../../src/koa/middleware.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
+ import _typeof from "@babel/runtime/helpers/typeof";
6
+ var _class;
7
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
+ var __decorate = this && this.__decorate || function (decorators, target, key, desc) {
9
+ var c = arguments.length,
10
+ r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
11
+ d;
12
+ if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ };
15
+ var __metadata = this && this.__metadata || function (k, v) {
16
+ if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
17
+ };
18
+ var ApitallyApiKeyGuard_1;
19
+ import { ForbiddenException, Injectable, SetMetadata, UnauthorizedException, createParamDecorator } from "@nestjs/common";
20
+ import { Reflector } from "@nestjs/core";
21
+ import { ApitallyClient } from "../common/client.js";
22
+ export var Scopes = function Scopes() {
23
+ for (var _len = arguments.length, scopes = new Array(_len), _key = 0; _key < _len; _key++) {
24
+ scopes[_key] = arguments[_key];
25
+ }
26
+ return SetMetadata("scopes", scopes);
27
+ };
28
+ var ApitallyApiKeyGuard = (_class = /*#__PURE__*/function () {
29
+ function ApitallyApiKeyGuard(reflector) {
30
+ _classCallCheck(this, ApitallyApiKeyGuard);
31
+ _defineProperty(this, "reflector", void 0);
32
+ this.reflector = reflector;
33
+ }
34
+ _createClass(ApitallyApiKeyGuard, [{
35
+ key: "canActivate",
36
+ value: function () {
37
+ var _canActivate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(context) {
38
+ var customHeader, req, res, apiKey, authorizationParts, customHeaderValue, client, keyInfo, scopes;
39
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
40
+ while (1) switch (_context.prev = _context.next) {
41
+ case 0:
42
+ customHeader = ApitallyApiKeyGuard_1.customHeader;
43
+ req = context.switchToHttp().getRequest();
44
+ res = context.switchToHttp().getResponse();
45
+ if (customHeader) {
46
+ _context.next = 16;
47
+ break;
48
+ }
49
+ if (req.headers.authorization) {
50
+ _context.next = 7;
51
+ break;
52
+ }
53
+ res.set("WWW-Authenticate", "ApiKey");
54
+ throw new UnauthorizedException("Missing authorization header");
55
+ case 7:
56
+ authorizationParts = req.headers.authorization.split(" ");
57
+ if (!(authorizationParts.length === 2 && authorizationParts[0].toLowerCase() === "apikey")) {
58
+ _context.next = 12;
59
+ break;
60
+ }
61
+ apiKey = authorizationParts[1];
62
+ _context.next = 14;
63
+ break;
64
+ case 12:
65
+ res.set("WWW-Authenticate", "ApiKey");
66
+ throw new UnauthorizedException("Invalid authorization scheme");
67
+ case 14:
68
+ _context.next = 17;
69
+ break;
70
+ case 16:
71
+ if (customHeader) {
72
+ customHeaderValue = req.headers[customHeader.toLowerCase()];
73
+ if (typeof customHeaderValue === "string") {
74
+ apiKey = customHeaderValue;
75
+ } else if (Array.isArray(customHeaderValue)) {
76
+ apiKey = customHeaderValue[0];
77
+ }
78
+ }
79
+ case 17:
80
+ if (apiKey) {
81
+ _context.next = 19;
82
+ break;
83
+ }
84
+ throw new ForbiddenException("Missing API key");
85
+ case 19:
86
+ client = ApitallyClient.getInstance();
87
+ _context.next = 22;
88
+ return client.keyRegistry.get(apiKey);
89
+ case 22:
90
+ keyInfo = _context.sent;
91
+ if (keyInfo) {
92
+ _context.next = 25;
93
+ break;
94
+ }
95
+ throw new ForbiddenException("Invalid API key");
96
+ case 25:
97
+ scopes = this.reflector.get("scopes", context.getHandler());
98
+ if (!(scopes && !keyInfo.hasScopes(scopes))) {
99
+ _context.next = 28;
100
+ break;
101
+ }
102
+ throw new ForbiddenException("Permission denied");
103
+ case 28:
104
+ req.keyInfo = keyInfo;
105
+ return _context.abrupt("return", true);
106
+ case 30:
107
+ case "end":
108
+ return _context.stop();
109
+ }
110
+ }, _callee, this);
111
+ }));
112
+ function canActivate(_x) {
113
+ return _canActivate.apply(this, arguments);
114
+ }
115
+ return canActivate;
116
+ }()
117
+ }]);
118
+ return ApitallyApiKeyGuard;
119
+ }(), ApitallyApiKeyGuard_1 = _class, _defineProperty(_class, "customHeader", void 0), _class);
120
+ ApitallyApiKeyGuard = ApitallyApiKeyGuard_1 = __decorate([Injectable(), __metadata("design:paramtypes", [Reflector])], ApitallyApiKeyGuard);
121
+ export { ApitallyApiKeyGuard };
122
+ export var GetKeyInfo = createParamDecorator(function (data, context) {
123
+ var req = context.switchToHttp().getRequest();
124
+ return req.keyInfo;
125
+ });
126
+ //# sourceMappingURL=auth.js.map