@routr/processor 2.0.8-alpha.0 → 2.0.8-alpha.10

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.
@@ -2,9 +2,9 @@ import { MessageRequest, Route } from "@routr/common";
2
2
  export declare const updateRequestURI: (route: Route) => (request: MessageRequest) => MessageRequest;
3
3
  export declare const addSelfVia: (route: Route) => (request: MessageRequest) => MessageRequest;
4
4
  export declare const addRoute: (route: Route) => (request: MessageRequest) => MessageRequest;
5
- export declare const addRouteToListeningPoint: (route: Route) => (request: MessageRequest) => MessageRequest;
5
+ export declare const addRouteToPeerEdgePort: (route: Route) => (request: MessageRequest) => MessageRequest;
6
6
  export declare const applyXHeaders: (route: Route) => (request: MessageRequest) => MessageRequest;
7
- export declare const addSelfRecordRoute: (request: MessageRequest) => MessageRequest;
7
+ export declare const addSelfRecordRoute: (route: Route) => (request: MessageRequest) => MessageRequest;
8
8
  export declare const addXEdgePortRef: (request: MessageRequest) => MessageRequest;
9
9
  export declare const removeXEdgePortRef: (request: MessageRequest) => MessageRequest;
10
10
  export declare const removeAuthorization: (request: MessageRequest) => MessageRequest;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decreaseMaxForwards = exports.removeTopVia = exports.removeRoutes = exports.removeAuthorization = exports.removeXEdgePortRef = exports.addXEdgePortRef = exports.addSelfRecordRoute = exports.applyXHeaders = exports.addRouteToListeningPoint = exports.addRoute = exports.addSelfVia = exports.updateRequestURI = void 0;
3
+ exports.decreaseMaxForwards = exports.removeTopVia = exports.removeRoutes = exports.removeAuthorization = exports.removeXEdgePortRef = exports.addXEdgePortRef = exports.addSelfRecordRoute = exports.applyXHeaders = exports.addRouteToPeerEdgePort = exports.addRoute = exports.addSelfVia = exports.updateRequestURI = void 0;
4
4
  /*
5
5
  * Copyright (C) 2022 by Fonoster Inc (https://fonoster.com)
6
6
  * http://github.com/fonoster/routr
@@ -20,114 +20,136 @@ exports.decreaseMaxForwards = exports.removeTopVia = exports.removeRoutes = expo
20
20
  * limitations under the License.
21
21
  */
22
22
  const common_1 = require("@routr/common");
23
+ const helper_1 = require("./helper");
23
24
  // Q: Should we deprecate this method since we are not doing strict routing?
24
- const updateRequestURI = (route) => {
25
- return (request) => {
26
- const req = common_1.Helper.deepCopy(request);
27
- if (route.user) {
28
- req.message.requestUri.user = route.user;
29
- }
30
- else {
31
- req.message.requestUri.user = null;
32
- }
33
- req.message.requestUri.host = route.host;
34
- req.message.requestUri.port = route.port;
35
- req.message.requestUri.transportParam = route.transport;
36
- return req;
37
- };
25
+ const updateRequestURI = (route) => (request) => {
26
+ const req = common_1.Helper.deepCopy(request);
27
+ if (route.user) {
28
+ req.message.requestUri.user = route.user;
29
+ }
30
+ else {
31
+ req.message.requestUri.user = null;
32
+ }
33
+ req.message.requestUri.host = route.host;
34
+ req.message.requestUri.port = route.port;
35
+ req.message.requestUri.transportParam = route.transport;
36
+ return req;
38
37
  };
39
38
  exports.updateRequestURI = updateRequestURI;
40
- const addSelfVia = (route) => {
41
- return (request) => {
42
- var _a;
43
- const req = common_1.Helper.deepCopy(request);
44
- // If is comming from a different edgeport we use the listening point instead
45
- // of the endpoint to ensure connectivity.
46
- const nextHopHost = request.edgePortRef === route.edgePortRef
47
- ? route.host
48
- : route.listeningPoint.host;
49
- // If the nextHopHost host is local, then use use lp to construct via
50
- // otherwise, we use the first external ip available.
51
- const via = common_1.IpUtils.isLocalnet(req.localnets, nextHopHost)
52
- ? route.listeningPoint
53
- : {
54
- // fallback to lp host if there is no external ips
55
- host: (_a = req.externalAddrs[0]) !== null && _a !== void 0 ? _a : req.listeningPoint.host,
56
- port: req.listeningPoint.port,
57
- transport: req.listeningPoint.transport
58
- };
59
- req.message.via = [via, ...req.message.via];
60
- return req;
61
- };
39
+ const addSelfVia = (route) => (request) => {
40
+ const req = common_1.Helper.deepCopy(request);
41
+ const routingObjects = request.edgePortRef === route.edgePortRef ? request : route;
42
+ const targetIntf = (0, helper_1.getEdgeInterface)(Object.assign(Object.assign({}, routingObjects), { endpointIntf: route }));
43
+ req.message.via = [Object.assign({}, targetIntf), ...req.message.via];
44
+ return req;
62
45
  };
63
46
  exports.addSelfVia = addSelfVia;
64
- const addRoute = (route) => {
65
- return (request) => {
66
- const req = common_1.Helper.deepCopy(request);
67
- const r = {
68
- address: {
69
- uri: {
70
- host: route.host,
71
- port: route.port,
72
- transportParam: route.transport,
73
- lrParam: true
74
- }
47
+ const addRoute = (route) => (request) => {
48
+ const req = common_1.Helper.deepCopy(request);
49
+ const r = {
50
+ address: {
51
+ uri: {
52
+ host: route.host,
53
+ port: route.port,
54
+ transportParam: route.transport,
55
+ lrParam: true
75
56
  }
76
- };
77
- req.message.route = [r, ...req.message.route];
78
- return req;
57
+ }
79
58
  };
59
+ req.message.route = [r, ...req.message.route];
60
+ return req;
80
61
  };
81
62
  exports.addRoute = addRoute;
82
- const addRouteToListeningPoint = (route) => {
83
- return (request) => {
84
- const req = common_1.Helper.deepCopy(request);
85
- const r = {
86
- address: {
87
- uri: {
88
- host: route.listeningPoint.host,
89
- port: route.listeningPoint.port,
90
- transportParam: route.listeningPoint.transport,
91
- lrParam: true
92
- }
63
+ const addRouteToPeerEdgePort = (route) => (request) => {
64
+ const req = common_1.Helper.deepCopy(request);
65
+ const targetIntf = (0, helper_1.getEdgeInterface)({
66
+ listeningPoints: route.listeningPoints,
67
+ localnets: route.localnets,
68
+ externalAddrs: route.externalAddrs,
69
+ endpointIntf: route
70
+ });
71
+ const r = {
72
+ address: {
73
+ uri: {
74
+ host: targetIntf.host,
75
+ port: targetIntf.port,
76
+ transportParam: targetIntf.transport,
77
+ lrParam: true
93
78
  }
94
- };
95
- req.message.route = [r, ...req.message.route];
96
- return req;
97
- };
98
- };
99
- exports.addRouteToListeningPoint = addRouteToListeningPoint;
100
- const applyXHeaders = (route) => {
101
- return (request) => {
102
- const req = common_1.Helper.deepCopy(request);
103
- if (route.headers && route.headers.length > 0) {
104
- const headersToRemove = route.headers
105
- .filter((h) => h.action === "remove")
106
- .map((h) => h.name);
107
- const headersToAdd = route.headers.filter((h) => h.action !== "remove");
108
- req.message.extensions = req.message.extensions.filter((h) => !headersToRemove.includes(h.name.toLowerCase()));
109
- headersToAdd.forEach((h) => {
110
- req.message.extensions.push({ name: h.name, value: h.value });
111
- });
112
79
  }
113
- return req;
114
80
  };
81
+ req.message.route = [r, ...req.message.route];
82
+ return req;
83
+ };
84
+ exports.addRouteToPeerEdgePort = addRouteToPeerEdgePort;
85
+ const applyXHeaders = (route) => (request) => {
86
+ const req = common_1.Helper.deepCopy(request);
87
+ if (route.headers && route.headers.length > 0) {
88
+ const headersToRemove = route.headers
89
+ .filter((h) => h.action === common_1.CommonTypes.HeaderModifierAction.REMOVE)
90
+ .map((h) => h.name);
91
+ const headersToAdd = route.headers.filter((h) => h.action !== common_1.CommonTypes.HeaderModifierAction.REMOVE);
92
+ req.message.extensions = req.message.extensions.filter((h) => !headersToRemove.includes(h.name.toLowerCase()));
93
+ headersToAdd.forEach((h) => {
94
+ req.message.extensions.push({ name: h.name, value: h.value });
95
+ });
96
+ }
97
+ return req;
115
98
  };
116
99
  exports.applyXHeaders = applyXHeaders;
117
- const addSelfRecordRoute = (request) => {
100
+ const addSelfRecordRoute = (route) => (request) => {
118
101
  const req = common_1.Helper.deepCopy(request);
119
- const lp = req.listeningPoint;
120
- const r = {
102
+ const originIntf = (0, helper_1.getEdgeInterface)({
103
+ listeningPoints: request.listeningPoints,
104
+ localnets: request.localnets,
105
+ externalAddrs: request.externalAddrs,
106
+ endpointIntf: request.sender
107
+ });
108
+ const targetIntf = (0, helper_1.getEdgeInterface)({
109
+ listeningPoints: request.listeningPoints,
110
+ localnets: request.localnets,
111
+ externalAddrs: request.externalAddrs,
112
+ endpointIntf: route
113
+ });
114
+ const originRoute = {
121
115
  address: {
122
116
  uri: {
123
- host: lp.host,
124
- port: lp.port,
125
- transportParam: lp.transport,
117
+ host: originIntf.host,
118
+ port: originIntf.port,
119
+ transportParam: originIntf.transport,
126
120
  lrParam: true
127
121
  }
128
122
  }
129
123
  };
130
- req.message.recordRoute = [r, ...req.message.recordRoute];
124
+ if (originIntf.host !== targetIntf.host ||
125
+ originIntf.port !== targetIntf.port ||
126
+ originIntf.transport !== targetIntf.transport) {
127
+ const targetRoute = {
128
+ address: {
129
+ uri: {
130
+ host: targetIntf.host,
131
+ port: targetIntf.port,
132
+ transportParam: targetIntf.transport,
133
+ lrParam: true
134
+ }
135
+ },
136
+ parameters: {
137
+ r2: "on"
138
+ }
139
+ };
140
+ // Add r2 on to origin route
141
+ originRoute.parameters = {
142
+ r2: "on"
143
+ };
144
+ req.message.recordRoute = [
145
+ targetRoute,
146
+ originRoute,
147
+ ...req.message.recordRoute
148
+ ];
149
+ }
150
+ else {
151
+ req.message.recordRoute = [originRoute, ...req.message.recordRoute];
152
+ }
131
153
  return req;
132
154
  };
133
155
  exports.addSelfRecordRoute = addSelfRecordRoute;
@@ -155,11 +177,15 @@ const removeAuthorization = (request) => {
155
177
  exports.removeAuthorization = removeAuthorization;
156
178
  const removeRoutes = (request) => {
157
179
  const req = common_1.Helper.deepCopy(request);
180
+ const localIps = request.localnets.map((ln) => ln.split("/")[0]);
158
181
  req.message.route = req.message.route.filter((r) => {
159
- const lp = request.listeningPoint;
160
- const route = r.address.uri;
161
- return !((route.host === lp.host || request.externalAddrs.includes(route.host)) &&
162
- route.port === lp.port);
182
+ var _a;
183
+ const lp = common_1.Helper.getListeningPoint(request.listeningPoints, ((_a = r.address.uri.transportParam) === null || _a === void 0 ? void 0 : _a.toLowerCase()) ||
184
+ common_1.Transport.UDP);
185
+ const routeUri = r.address.uri;
186
+ return !((localIps.includes(routeUri.host) ||
187
+ request.externalAddrs.includes(routeUri.host)) &&
188
+ routeUri.port === lp.port);
163
189
  });
164
190
  return req;
165
191
  };
package/dist/helper.d.ts CHANGED
@@ -1,6 +1,12 @@
1
- import { MessageRequest, Route } from "@routr/common";
1
+ import { MessageRequest, Route, NetInterface } from "@routr/common";
2
2
  export declare const isTypeResponse: (request: MessageRequest) => boolean;
3
3
  export declare const isTypeRequest: (request: MessageRequest) => boolean;
4
+ export declare const getEdgeInterface: (nets: {
5
+ listeningPoints: NetInterface[];
6
+ endpointIntf: NetInterface;
7
+ localnets: string[];
8
+ externalAddrs: string[];
9
+ }) => NetInterface;
4
10
  /**
5
11
  * A request traversing a second EdgePort would have an updated the requestUri.
6
12
  * Therefore, we are able to re-construct the Route from the request.
package/dist/helper.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRouteFromLastMessage = exports.isTypeRequest = exports.isTypeResponse = void 0;
3
+ exports.createRouteFromLastMessage = exports.getEdgeInterface = exports.isTypeRequest = exports.isTypeResponse = void 0;
4
4
  /*
5
5
  * Copyright (C) 2022 by Fonoster Inc (https://fonoster.com)
6
6
  * http://github.com/fonoster/routr
@@ -20,11 +20,30 @@ exports.createRouteFromLastMessage = exports.isTypeRequest = exports.isTypeRespo
20
20
  * limitations under the License.
21
21
  */
22
22
  const common_1 = require("@routr/common");
23
+ const common_2 = require("@routr/common");
23
24
  const index_1 = require("./index");
24
25
  const isTypeResponse = (request) => request.message.messageType === common_1.CommonTypes.MessageType.RESPONSE;
25
26
  exports.isTypeResponse = isTypeResponse;
26
27
  const isTypeRequest = (request) => !(0, exports.isTypeResponse)(request);
27
28
  exports.isTypeRequest = isTypeRequest;
29
+ const getEdgeInterface = (nets) => {
30
+ const { listeningPoints, endpointIntf, localnets, externalAddrs } = nets;
31
+ const localnetIp = common_2.IpUtils.getLocalnetIp(localnets, endpointIntf.host);
32
+ const host = localnetIp !== null && localnetIp !== void 0 ? localnetIp : externalAddrs[0];
33
+ const lp = common_1.Helper.getListeningPoint(listeningPoints, endpointIntf.transport);
34
+ if (!localnetIp && externalAddrs.length === 0) {
35
+ throw new Error(`unable to find a valid interface for host ${endpointIntf.host} and transport ${lp.transport}`);
36
+ }
37
+ if (localnetIp && lp.host !== "0.0.0.0" && lp.host !== host) {
38
+ throw new Error(`listening point host ${lp.host} does not match interface host ${host}`);
39
+ }
40
+ return {
41
+ host,
42
+ port: lp.port,
43
+ transport: lp.transport
44
+ };
45
+ };
46
+ exports.getEdgeInterface = getEdgeInterface;
28
47
  /**
29
48
  * A request traversing a second EdgePort would have an updated the requestUri.
30
49
  * Therefore, we are able to re-construct the Route from the request.
@@ -42,11 +61,13 @@ function createRouteFromLastMessage(request) {
42
61
  user: uri.user,
43
62
  host: uri.host,
44
63
  port: uri.port,
45
- transport: uri.transportParam,
64
+ transport: uri.transportParam.toLowerCase(),
46
65
  registeredOn: Date.now(),
47
66
  sessionCount,
48
67
  expires: index_1.Target.getTargetExpires(request),
49
- listeningPoint: request.listeningPoint
68
+ listeningPoints: request.listeningPoints,
69
+ localnets: request.localnets,
70
+ externalAddrs: request.externalAddrs
50
71
  };
51
72
  }
52
73
  exports.createRouteFromLastMessage = createRouteFromLastMessage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routr/processor",
3
- "version": "2.0.8-alpha.0",
3
+ "version": "2.0.8-alpha.10",
4
4
  "description": "Processor server and API",
5
5
  "author": "Pedro Sanders <psanders@fonoster.com>",
6
6
  "homepage": "https://github.com/fonoster/routr#readme",
@@ -23,7 +23,7 @@
23
23
  "@opentelemetry/sdk-trace-base": "^1.0.4",
24
24
  "@opentelemetry/sdk-trace-node": "^1.0.4",
25
25
  "@opentelemetry/semantic-conventions": "^1.0.4",
26
- "@routr/common": "^2.0.8-alpha.0",
26
+ "@routr/common": "^2.0.8-alpha.10",
27
27
  "fp-ts": "^2.11.8"
28
28
  },
29
29
  "directories": {
@@ -43,5 +43,5 @@
43
43
  "bugs": {
44
44
  "url": "https://github.com/fonoster/routr/issues"
45
45
  },
46
- "gitHead": "69c60f113c27bc00cbadb62dbdbbb70960ef0f4d"
46
+ "gitHead": "5082233fb155ddb8535f934550fa4013da87468e"
47
47
  }