@requestly/requestly-proxy 1.0.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 (89) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +5 -0
  3. package/dist/components/interfaces/logger-service.d.ts +4 -0
  4. package/dist/components/interfaces/logger-service.js +2 -0
  5. package/dist/components/interfaces/rules-data-source.d.ts +6 -0
  6. package/dist/components/interfaces/rules-data-source.js +2 -0
  7. package/dist/components/proxy-middleware/constants.d.ts +11 -0
  8. package/dist/components/proxy-middleware/constants.js +21 -0
  9. package/dist/components/proxy-middleware/helpers/ctx_rq_namespace.d.ts +35 -0
  10. package/dist/components/proxy-middleware/helpers/ctx_rq_namespace.js +96 -0
  11. package/dist/components/proxy-middleware/helpers/harObectCreator.d.ts +140 -0
  12. package/dist/components/proxy-middleware/helpers/harObectCreator.js +158 -0
  13. package/dist/components/proxy-middleware/helpers/http_helpers.d.ts +2 -0
  14. package/dist/components/proxy-middleware/helpers/http_helpers.js +47 -0
  15. package/dist/components/proxy-middleware/helpers/proxy_ctx_helper.d.ts +14 -0
  16. package/dist/components/proxy-middleware/helpers/proxy_ctx_helper.js +86 -0
  17. package/dist/components/proxy-middleware/helpers/response_helper.d.ts +3 -0
  18. package/dist/components/proxy-middleware/helpers/response_helper.js +17 -0
  19. package/dist/components/proxy-middleware/helpers/rule_processor_helper.d.ts +17 -0
  20. package/dist/components/proxy-middleware/helpers/rule_processor_helper.js +192 -0
  21. package/dist/components/proxy-middleware/index.d.ts +25 -0
  22. package/dist/components/proxy-middleware/index.js +257 -0
  23. package/dist/components/proxy-middleware/middlewares/amiusing_middleware.d.ts +6 -0
  24. package/dist/components/proxy-middleware/middlewares/amiusing_middleware.js +25 -0
  25. package/dist/components/proxy-middleware/middlewares/logger_middleware.d.ts +66 -0
  26. package/dist/components/proxy-middleware/middlewares/logger_middleware.js +89 -0
  27. package/dist/components/proxy-middleware/middlewares/rules_middleware.d.ts +40 -0
  28. package/dist/components/proxy-middleware/middlewares/rules_middleware.js +117 -0
  29. package/dist/components/proxy-middleware/middlewares/ssl_cert_middleware.d.ts +7 -0
  30. package/dist/components/proxy-middleware/middlewares/ssl_cert_middleware.js +33 -0
  31. package/dist/components/proxy-middleware/rule_action_processor/handle_mixed_response.d.ts +14 -0
  32. package/dist/components/proxy-middleware/rule_action_processor/handle_mixed_response.js +78 -0
  33. package/dist/components/proxy-middleware/rule_action_processor/index.d.ts +13 -0
  34. package/dist/components/proxy-middleware/rule_action_processor/index.js +101 -0
  35. package/dist/components/proxy-middleware/rule_action_processor/modified_requests_pool.d.ts +7 -0
  36. package/dist/components/proxy-middleware/rule_action_processor/modified_requests_pool.js +34 -0
  37. package/dist/components/proxy-middleware/rule_action_processor/processors/block_processor.d.ts +6 -0
  38. package/dist/components/proxy-middleware/rule_action_processor/processors/block_processor.js +21 -0
  39. package/dist/components/proxy-middleware/rule_action_processor/processors/delay_processor.d.ts +6 -0
  40. package/dist/components/proxy-middleware/rule_action_processor/processors/delay_processor.js +29 -0
  41. package/dist/components/proxy-middleware/rule_action_processor/processors/insert_processor.d.ts +6 -0
  42. package/dist/components/proxy-middleware/rule_action_processor/processors/insert_processor.js +154 -0
  43. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_header_processor.d.ts +6 -0
  44. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_header_processor.js +69 -0
  45. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_request_processor.d.ts +6 -0
  46. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_request_processor.js +89 -0
  47. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_response_processor.d.ts +6 -0
  48. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_response_processor.js +109 -0
  49. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_user_agent_processor.d.ts +6 -0
  50. package/dist/components/proxy-middleware/rule_action_processor/processors/modify_user_agent_processor.js +25 -0
  51. package/dist/components/proxy-middleware/rule_action_processor/processors/redirect_processor.d.ts +6 -0
  52. package/dist/components/proxy-middleware/rule_action_processor/processors/redirect_processor.js +58 -0
  53. package/dist/components/proxy-middleware/rule_action_processor/utils.d.ts +11 -0
  54. package/dist/components/proxy-middleware/rule_action_processor/utils.js +33 -0
  55. package/dist/components/ssl-proxying/ssl-proxying-manager.d.ts +3 -0
  56. package/dist/components/ssl-proxying/ssl-proxying-manager.js +6 -0
  57. package/dist/constants/cert.d.ts +7 -0
  58. package/dist/constants/cert.js +13 -0
  59. package/dist/index.d.ts +4 -0
  60. package/dist/index.js +11 -0
  61. package/dist/lib/proxy/bin/mitm-proxy.d.ts +2 -0
  62. package/dist/lib/proxy/bin/mitm-proxy.js +30 -0
  63. package/dist/lib/proxy/custom/utils/checkInvalidHeaderChar.d.ts +8 -0
  64. package/dist/lib/proxy/custom/utils/checkInvalidHeaderChar.js +14 -0
  65. package/dist/lib/proxy/index.d.ts +2 -0
  66. package/dist/lib/proxy/index.js +2 -0
  67. package/dist/lib/proxy/lib/ca.d.ts +8 -0
  68. package/dist/lib/proxy/lib/ca.js +277 -0
  69. package/dist/lib/proxy/lib/middleware/gunzip.d.ts +2 -0
  70. package/dist/lib/proxy/lib/middleware/gunzip.js +17 -0
  71. package/dist/lib/proxy/lib/middleware/wildcard.d.ts +1 -0
  72. package/dist/lib/proxy/lib/middleware/wildcard.js +20 -0
  73. package/dist/lib/proxy/lib/proxy.d.ts +36 -0
  74. package/dist/lib/proxy/lib/proxy.js +1217 -0
  75. package/dist/rq-proxy-provider.d.ts +10 -0
  76. package/dist/rq-proxy-provider.js +20 -0
  77. package/dist/rq-proxy.d.ts +15 -0
  78. package/dist/rq-proxy.js +53 -0
  79. package/dist/test.d.ts +1 -0
  80. package/dist/test.js +111 -0
  81. package/dist/types/index.d.ts +12 -0
  82. package/dist/types/index.js +2 -0
  83. package/dist/utils/circularQueue.d.ts +2 -0
  84. package/dist/utils/circularQueue.js +31 -0
  85. package/dist/utils/helpers/rules-helper.d.ts +11 -0
  86. package/dist/utils/helpers/rules-helper.js +59 -0
  87. package/dist/utils/index.d.ts +0 -0
  88. package/dist/utils/index.js +0 -0
  89. package/package.json +43 -0
@@ -0,0 +1,10 @@
1
+ import RQProxy from "./rq-proxy";
2
+ import ILoggerService from "./components/interfaces/logger-service";
3
+ import IRulesDataSource from "./components/interfaces/rules-data-source";
4
+ import { ProxyConfig } from "./types";
5
+ declare class RQProxyProvider {
6
+ static rqProxyInstance: any;
7
+ static createInstance: (proxyConfig: ProxyConfig, rulesDataSource: IRulesDataSource, loggerService: ILoggerService) => void;
8
+ static getInstance: () => RQProxy;
9
+ }
10
+ export default RQProxyProvider;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const rq_proxy_1 = __importDefault(require("./rq-proxy"));
7
+ class RQProxyProvider {
8
+ }
9
+ RQProxyProvider.rqProxyInstance = null;
10
+ // TODO: rulesDataSource can be static here
11
+ RQProxyProvider.createInstance = (proxyConfig, rulesDataSource, loggerService) => {
12
+ RQProxyProvider.rqProxyInstance = new rq_proxy_1.default(proxyConfig, rulesDataSource, loggerService);
13
+ };
14
+ RQProxyProvider.getInstance = () => {
15
+ if (!RQProxyProvider.rqProxyInstance) {
16
+ console.error("Instance need to be created first");
17
+ }
18
+ return RQProxyProvider.rqProxyInstance;
19
+ };
20
+ exports.default = RQProxyProvider;
@@ -0,0 +1,15 @@
1
+ import IRulesDataSource from "./components/interfaces/rules-data-source";
2
+ import { ProxyConfig } from "./types";
3
+ import RulesHelper from "./utils/helpers/rules-helper";
4
+ import ProxyMiddlewareManager from "./components/proxy-middleware";
5
+ import ILoggerService from "./components/interfaces/logger-service";
6
+ declare class RQProxy {
7
+ proxy: any;
8
+ proxyMiddlewareManager: ProxyMiddlewareManager;
9
+ rulesHelper: RulesHelper;
10
+ loggerService: ILoggerService;
11
+ constructor(proxyConfig: ProxyConfig, rulesDataSource: IRulesDataSource, loggerService: ILoggerService);
12
+ initProxy: (proxyConfig: ProxyConfig) => void;
13
+ doSomething: () => void;
14
+ }
15
+ export default RQProxy;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const proxy_1 = __importDefault(require("./lib/proxy"));
7
+ const rules_helper_1 = __importDefault(require("./utils/helpers/rules-helper"));
8
+ const proxy_middleware_1 = __importDefault(require("./components/proxy-middleware"));
9
+ class RQProxy {
10
+ constructor(proxyConfig, rulesDataSource, loggerService) {
11
+ this.initProxy = (proxyConfig) => {
12
+ console.log("initProxy");
13
+ console.log(proxyConfig);
14
+ // @ts-ignore
15
+ this.proxy = new proxy_1.default();
16
+ // console.log(this.proxy);
17
+ this.proxy.listen({
18
+ port: proxyConfig.port,
19
+ sslCaDir: proxyConfig.certPath,
20
+ host: "0.0.0.0",
21
+ }, (err) => {
22
+ console.log("Proxy Listen");
23
+ if (err) {
24
+ console.log(err);
25
+ }
26
+ else {
27
+ console.log("Proxy Started");
28
+ this.proxyMiddlewareManager = new proxy_middleware_1.default(this.proxy, proxyConfig, this.rulesHelper, this.loggerService, null);
29
+ this.proxyMiddlewareManager.init();
30
+ }
31
+ });
32
+ // For Testing //
33
+ this.proxy.onRequest(function (ctx, callback) {
34
+ if (ctx.clientToProxyRequest.headers.host == 'example.com') {
35
+ ctx.use(proxy_1.default.gunzip);
36
+ ctx.onResponseData(function (ctx, chunk, callback) {
37
+ chunk = new Buffer("<h1>Hello There</h1>");
38
+ return callback(null, chunk);
39
+ });
40
+ }
41
+ return callback();
42
+ });
43
+ //
44
+ };
45
+ this.doSomething = () => {
46
+ console.log("do something");
47
+ };
48
+ this.initProxy(proxyConfig);
49
+ this.rulesHelper = new rules_helper_1.default(rulesDataSource);
50
+ this.loggerService = loggerService;
51
+ }
52
+ }
53
+ exports.default = RQProxy;
package/dist/test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/test.js ADDED
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const axios_1 = __importDefault(require("axios"));
16
+ const rq_proxy_provider_1 = __importDefault(require("./rq-proxy-provider"));
17
+ console.log("start");
18
+ const proxyConfig = {
19
+ port: 8281,
20
+ // @ts-ignore
21
+ certPath: "/Users/sahilgupta/Library/Application\\ Support/Electron/.requestly-certs-temp",
22
+ // TODO: MOVE THIS IN RQ PROXY
23
+ rootCertPath: "/Users/sahilgupta/Library/Application\\ Support/Electron/.requestly-certs-temp/certs/ca.pem"
24
+ };
25
+ class RulesDataSource {
26
+ constructor() {
27
+ this.getRules = (requestHeaders) => __awaiter(this, void 0, void 0, function* () {
28
+ return [
29
+ {
30
+ "creationDate": 1648800254537,
31
+ "description": "",
32
+ "groupId": "",
33
+ "id": "Headers_br050",
34
+ "isSample": false,
35
+ "name": "Test Header Rule",
36
+ "objectType": "rule",
37
+ "pairs": [
38
+ {
39
+ "header": "abc",
40
+ "value": "abc value",
41
+ "type": "Add",
42
+ "target": "Request",
43
+ "source": {
44
+ "filters": {},
45
+ "key": "Url",
46
+ "operator": "Contains",
47
+ "value": "example"
48
+ },
49
+ "id": "lussg"
50
+ },
51
+ {
52
+ "header": "abc",
53
+ "value": "bac value",
54
+ "type": "Add",
55
+ "target": "Response",
56
+ "source": {
57
+ "filters": {},
58
+ "key": "Url",
59
+ "operator": "Contains",
60
+ "value": "example"
61
+ },
62
+ "id": "be1k6"
63
+ }
64
+ ],
65
+ "ruleType": "Headers",
66
+ "status": "Active",
67
+ "createdBy": "9cxfwgyBXKQxj9lU14GiTO5KTNY2",
68
+ "currentOwner": "9cxfwgyBXKQxj9lU14GiTO5KTNY2",
69
+ "lastModifiedBy": "9cxfwgyBXKQxj9lU14GiTO5KTNY2",
70
+ "modificationDate": 1648800283699,
71
+ "lastModified": 1648800283699
72
+ }
73
+ ];
74
+ });
75
+ this.getGroups = (requestHeaders) => __awaiter(this, void 0, void 0, function* () {
76
+ return [
77
+ {
78
+ id: "1",
79
+ status: "Inactive"
80
+ }
81
+ ];
82
+ });
83
+ }
84
+ }
85
+ class LoggerService {
86
+ constructor() {
87
+ this.addLog = (log, requestHeaders) => {
88
+ console.log(JSON.stringify(log, null, 4));
89
+ const headers = {
90
+ "device_id": "test_device",
91
+ "sdk_id": "7jcFc1g5j7ozfSXe7lc6",
92
+ };
93
+ // TODO: Keeping this as Strong for now to avoid changes in UI
94
+ log.finalHar = JSON.stringify(log.finalHar);
95
+ (0, axios_1.default)({
96
+ method: "post",
97
+ url: "http://localhost:5001/requestly-dev/us-central1/addSdkLog",
98
+ headers,
99
+ data: log
100
+ }).then(() => {
101
+ console.log("Successfully added log");
102
+ }).catch(error => {
103
+ console.log(`Could not add Log`);
104
+ });
105
+ };
106
+ }
107
+ }
108
+ // RQProxyProvider.getInstance().doSomething();
109
+ rq_proxy_provider_1.default.createInstance(proxyConfig, new RulesDataSource(), new LoggerService());
110
+ rq_proxy_provider_1.default.getInstance().doSomething();
111
+ console.log("end");
@@ -0,0 +1,12 @@
1
+ export interface ProxyConfig {
2
+ port: Number;
3
+ certPath: String;
4
+ rootCertPath: String;
5
+ }
6
+ export interface Rule {
7
+ id: string;
8
+ }
9
+ export interface RuleGroup {
10
+ id: String;
11
+ status: String;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ declare const Queue: any;
2
+ export default Queue;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Queue = function (maxSize) {
4
+ this.reset = function () {
5
+ this.head = -1;
6
+ this.queue = [];
7
+ };
8
+ this.reset();
9
+ this.maxSize = maxSize || Queue.MAX_SIZE;
10
+ this.increment = function (number) {
11
+ return (number + 1) % this.maxSize;
12
+ };
13
+ };
14
+ Queue.MAX_SIZE = Math.pow(2, 53) - 1;
15
+ Queue.prototype.enQueue = function (record) {
16
+ this.head = this.increment(this.head);
17
+ this.queue[this.head] = record;
18
+ };
19
+ /**
20
+ * @param record Record to look for
21
+ * @returns Number Position of record in the queue otherwise -1
22
+ */
23
+ Queue.prototype.getElementIndex = function (record) {
24
+ return this.queue.indexOf(record);
25
+ };
26
+ Queue.prototype.print = function () {
27
+ for (var i = 0; i <= this.head; i++) {
28
+ console.log(this.queue[i]);
29
+ }
30
+ };
31
+ exports.default = Queue;
@@ -0,0 +1,11 @@
1
+ import IRulesDataSource from "../../components/interfaces/rules-data-source";
2
+ declare class RulesHelper {
3
+ rulesDataSource: IRulesDataSource;
4
+ constructor(rulesDataSource: IRulesDataSource);
5
+ is_group_active: (group: any) => boolean;
6
+ is_rule_active: (rule: any, active_group_ids?: any[]) => boolean;
7
+ get_groups: (is_active?: boolean, requestHeaders?: {}) => Promise<import("../../types").RuleGroup[]>;
8
+ get_group_ids: (is_active?: boolean, requestHeaders?: {}) => Promise<String[]>;
9
+ get_rules: (is_active?: boolean, requestHeaders?: {}) => Promise<import("../../types").Rule[]>;
10
+ }
11
+ export default RulesHelper;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ class RulesHelper {
13
+ // TODO: this can be static class too
14
+ constructor(rulesDataSource) {
15
+ this.is_group_active = (group) => {
16
+ if (!group) {
17
+ return false;
18
+ }
19
+ return group.status == "Active";
20
+ };
21
+ this.is_rule_active = (rule, active_group_ids = []) => {
22
+ if (!rule) {
23
+ return false;
24
+ }
25
+ let status = false;
26
+ status = rule.status == "Active";
27
+ // No group case || active group case
28
+ if (rule.groupId == "" || active_group_ids.includes(rule.groupId)) {
29
+ return status;
30
+ }
31
+ return false;
32
+ };
33
+ this.get_groups = (is_active = false, requestHeaders = {}) => __awaiter(this, void 0, void 0, function* () {
34
+ let groups = (yield this.rulesDataSource.getGroups(requestHeaders)) || [];
35
+ if (is_active === true) {
36
+ groups = groups.filter((group) => this.is_group_active(group));
37
+ }
38
+ return groups;
39
+ });
40
+ this.get_group_ids = (is_active = false, requestHeaders = {}) => __awaiter(this, void 0, void 0, function* () {
41
+ const groups = yield this.get_groups(is_active, requestHeaders);
42
+ return groups.map((group) => group.id);
43
+ });
44
+ this.get_rules = (is_active = false, requestHeaders = {}) => __awaiter(this, void 0, void 0, function* () {
45
+ let rules = (yield this.rulesDataSource.getRules(requestHeaders)) || [];
46
+ let active_group_ids = (yield this.get_group_ids(true, requestHeaders)) || [];
47
+ if (is_active === true) {
48
+ rules = rules.filter((rule) => this.is_rule_active(rule, active_group_ids));
49
+ }
50
+ // Sorting Rules By id asc
51
+ rules = rules.sort((rule1, rule2) => {
52
+ return ("" + rule1.id).localeCompare(rule2.id);
53
+ });
54
+ return rules;
55
+ });
56
+ this.rulesDataSource = rulesDataSource;
57
+ }
58
+ }
59
+ exports.default = RulesHelper;
File without changes
File without changes
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@requestly/requestly-proxy",
3
+ "version": "1.0.0",
4
+ "description": "Proxy that gives superpowers to all the Requestly clients",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "dev": "nodemon src/test.ts",
9
+ "build": "tsc"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/requestly/rq-proxy.git"
14
+ },
15
+ "author": "",
16
+ "license": "ISC",
17
+ "dependencies": {
18
+ "@requestly/requestly-core": "^1.0.0",
19
+ "@sentry/browser": "^6.19.2",
20
+ "async": "^3.2.1",
21
+ "axios": "^0.26.1",
22
+ "charset": "^1.0.1",
23
+ "debug": "^4.3.2",
24
+ "httpsnippet": "^2.0.0",
25
+ "lodash": "^4.17.21",
26
+ "mime-types": "^2.1.35",
27
+ "mkdirp": "^0.5.5",
28
+ "node-forge": "^1.3.0",
29
+ "semaphore": "^1.1.0",
30
+ "ua-parser-js": "^1.0.2",
31
+ "url": "^0.11.0",
32
+ "uuid": "^8.3.2",
33
+ "ws": "^8.5.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^17.0.23",
37
+ "nodemon": "^2.0.15",
38
+ "typescript": "^4.6.3"
39
+ },
40
+ "files": [
41
+ "dist"
42
+ ]
43
+ }