@fintekkers/ledger-models 0.4.30 → 0.4.31

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 (50) hide show
  1. package/node/wrappers/models/utils/requestcontext.auth.test.js +21 -6
  2. package/node/wrappers/models/utils/requestcontext.auth.test.js.map +1 -1
  3. package/node/wrappers/models/utils/requestcontext.auth.test.ts +24 -6
  4. package/node/wrappers/models/utils/requestcontext.d.ts +18 -12
  5. package/node/wrappers/models/utils/requestcontext.js +28 -28
  6. package/node/wrappers/models/utils/requestcontext.js.map +1 -1
  7. package/node/wrappers/models/utils/requestcontext.test.js +15 -3
  8. package/node/wrappers/models/utils/requestcontext.test.js.map +1 -1
  9. package/node/wrappers/models/utils/requestcontext.test.ts +17 -3
  10. package/node/wrappers/models/utils/requestcontext.ts +31 -29
  11. package/node/wrappers/services/apikey.credentials.test.d.ts +1 -1
  12. package/node/wrappers/services/apikey.credentials.test.js +14 -12
  13. package/node/wrappers/services/apikey.credentials.test.js.map +1 -1
  14. package/node/wrappers/services/apikey.credentials.test.ts +15 -13
  15. package/node/wrappers/services/apikey.test.js +1 -1
  16. package/node/wrappers/services/apikey.test.js.map +1 -1
  17. package/node/wrappers/services/apikey.test.ts +1 -1
  18. package/node/wrappers/services/portfolio-service/PortfolioService.d.ts +2 -1
  19. package/node/wrappers/services/portfolio-service/PortfolioService.js +8 -4
  20. package/node/wrappers/services/portfolio-service/PortfolioService.js.map +1 -1
  21. package/node/wrappers/services/portfolio-service/PortfolioService.ts +8 -4
  22. package/node/wrappers/services/position-service/PositionService.js +4 -3
  23. package/node/wrappers/services/position-service/PositionService.js.map +1 -1
  24. package/node/wrappers/services/position-service/PositionService.ts +4 -3
  25. package/node/wrappers/services/price-service/PriceService.js +4 -3
  26. package/node/wrappers/services/price-service/PriceService.js.map +1 -1
  27. package/node/wrappers/services/price-service/PriceService.ts +4 -3
  28. package/node/wrappers/services/security-service/SecurityService.js +4 -3
  29. package/node/wrappers/services/security-service/SecurityService.js.map +1 -1
  30. package/node/wrappers/services/security-service/SecurityService.ts +4 -3
  31. package/node/wrappers/services/serviceaddress.clients.test.d.ts +9 -0
  32. package/node/wrappers/services/serviceaddress.clients.test.js +181 -0
  33. package/node/wrappers/services/serviceaddress.clients.test.js.map +1 -0
  34. package/node/wrappers/services/serviceaddress.clients.test.ts +176 -0
  35. package/node/wrappers/services/transaction-service/TransactionService.js +4 -3
  36. package/node/wrappers/services/transaction-service/TransactionService.js.map +1 -1
  37. package/node/wrappers/services/transaction-service/TransactionService.ts +4 -3
  38. package/node/wrappers/util/link-resolver.d.ts +1 -1
  39. package/node/wrappers/util/link-resolver.js +10 -9
  40. package/node/wrappers/util/link-resolver.js.map +1 -1
  41. package/node/wrappers/util/link-resolver.ts +11 -10
  42. package/node/wrappers/util/serviceaddress.d.ts +47 -0
  43. package/node/wrappers/util/serviceaddress.js +132 -0
  44. package/node/wrappers/util/serviceaddress.js.map +1 -0
  45. package/node/wrappers/util/serviceaddress.test.d.ts +6 -0
  46. package/node/wrappers/util/serviceaddress.test.js +76 -0
  47. package/node/wrappers/util/serviceaddress.test.js.map +1 -0
  48. package/node/wrappers/util/serviceaddress.test.ts +83 -0
  49. package/node/wrappers/util/serviceaddress.ts +141 -0
  50. package/package.json +1 -1
@@ -33,6 +33,9 @@ const grpc = __importStar(require("@grpc/grpc-js"));
33
33
  const requestcontext_1 = __importStar(require("./requestcontext"));
34
34
  const savedApiUrl = process.env.API_URL;
35
35
  const savedApiKey = process.env.API_KEY;
36
+ // Variables the lookup reads before API_URL; the host may set them.
37
+ const SHADOWING = ['BROKER_HOST', 'LEDGER_SERVICE_HOST', 'LEDGER_SERVICE_PORT'];
38
+ const savedShadowing = SHADOWING.map((k) => process.env[k]);
36
39
  function restoreEnv(name, value) {
37
40
  if (value === undefined) {
38
41
  delete process.env[name];
@@ -44,10 +47,12 @@ function restoreEnv(name, value) {
44
47
  beforeEach(() => {
45
48
  restoreEnv('API_URL', undefined);
46
49
  restoreEnv('API_KEY', undefined);
50
+ SHADOWING.forEach((k) => restoreEnv(k, undefined));
47
51
  });
48
52
  afterEach(() => {
49
53
  restoreEnv('API_URL', savedApiUrl);
50
54
  restoreEnv('API_KEY', savedApiKey);
55
+ SHADOWING.forEach((k, i) => restoreEnv(k, savedShadowing[i]));
51
56
  jest.restoreAllMocks();
52
57
  });
53
58
  describe('EnvConfig.apiURL', () => {
@@ -59,8 +64,8 @@ describe('EnvConfig.apiURL', () => {
59
64
  process.env.API_URL = 'localhost';
60
65
  expect(requestcontext_1.default.apiURL).toBe('localhost:8082');
61
66
  });
62
- test('defaults to api.fintekkers.org:8082 when API_URL is unset', () => {
63
- expect(requestcontext_1.default.apiURL).toBe('api.fintekkers.org:8082');
67
+ test('defaults to localhost:8082 when API_URL is unset', () => {
68
+ expect(requestcontext_1.default.apiURL).toBe('localhost:8082');
64
69
  });
65
70
  });
66
71
  describe('EnvConfig.apiKey', () => {
@@ -82,7 +87,15 @@ describe('EnvConfig.apiCredentials', () => {
82
87
  expect(insecure).toHaveBeenCalledTimes(1);
83
88
  expect(ssl).not.toHaveBeenCalled();
84
89
  });
85
- test('uses SSL credentials when API_URL is unset', () => {
90
+ test('uses insecure credentials when API_URL is unset (localhost:8082)', () => {
91
+ const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
92
+ const ssl = jest.spyOn(grpc.credentials, 'createSsl');
93
+ requestcontext_1.default.apiCredentials;
94
+ expect(insecure).toHaveBeenCalledTimes(1);
95
+ expect(ssl).not.toHaveBeenCalled();
96
+ });
97
+ test('uses SSL credentials for a remote API_URL', () => {
98
+ process.env.API_URL = 'myhost.example.com';
86
99
  const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
87
100
  const ssl = jest.spyOn(grpc.credentials, 'createSsl');
88
101
  requestcontext_1.default.apiCredentials;
@@ -92,13 +105,14 @@ describe('EnvConfig.apiCredentials', () => {
92
105
  });
93
106
  describe('EnvConfig.getAuthenticatedCredentials', () => {
94
107
  test('metadata generator injects x-api-key', () => {
108
+ process.env.API_URL = 'myhost.example.com';
95
109
  const generatorSpy = jest.spyOn(grpc.credentials, 'createFromMetadataGenerator');
96
110
  const creds = requestcontext_1.default.getAuthenticatedCredentials('k');
97
111
  expect(creds).toBeInstanceOf(grpc.ChannelCredentials);
98
112
  expect(generatorSpy).toHaveBeenCalledTimes(1);
99
113
  const generator = generatorSpy.mock.calls[0][0];
100
114
  const callback = jest.fn();
101
- generator({ service_url: 'https://api.fintekkers.org:8082' }, callback);
115
+ generator({ service_url: 'https://myhost.example.com:8082' }, callback);
102
116
  expect(callback).toHaveBeenCalledTimes(1);
103
117
  const [err, metadata] = callback.mock.calls[0];
104
118
  expect(err).toBeNull();
@@ -127,6 +141,7 @@ describe('EnvConfig.getAuthenticatedCredentials', () => {
127
141
  jest.spyOn(console, 'error').mockImplementation(() => { }),
128
142
  ];
129
143
  const generatorSpy = jest.spyOn(grpc.credentials, 'createFromMetadataGenerator');
144
+ process.env.API_URL = 'myhost.example.com';
130
145
  requestcontext_1.default.getAuthenticatedCredentials(secret);
131
146
  generatorSpy.mock.calls[0][0]({ service_url: '' }, () => { });
132
147
  process.env.API_URL = 'localhost:80';
@@ -148,8 +163,8 @@ describe('EnvConfig.getAuthenticatedClientOptions', () => {
148
163
  expect(ssl).not.toHaveBeenCalled();
149
164
  expect(interceptors).toHaveLength(1);
150
165
  });
151
- test('uses SSL channel for api.fintekkers.org', () => {
152
- process.env.API_URL = 'api.fintekkers.org';
166
+ test('uses SSL channel for a remote host', () => {
167
+ process.env.API_URL = 'myhost.example.com';
153
168
  const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
154
169
  const ssl = jest.spyOn(grpc.credentials, 'createSsl');
155
170
  const { interceptors } = requestcontext_1.default.getAuthenticatedClientOptions('k');
@@ -1 +1 @@
1
- {"version":3,"file":"requestcontext.auth.test.js","sourceRoot":"","sources":["requestcontext.auth.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestcontext.auth.test.js","sourceRoot":"","sources":["requestcontext.auth.test.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,9 @@ import EnvConfig, { InsecureChannelAuthError } from './requestcontext';
10
10
 
11
11
  const savedApiUrl = process.env.API_URL;
12
12
  const savedApiKey = process.env.API_KEY;
13
+ // Variables the lookup reads before API_URL; the host may set them.
14
+ const SHADOWING = ['BROKER_HOST', 'LEDGER_SERVICE_HOST', 'LEDGER_SERVICE_PORT'];
15
+ const savedShadowing = SHADOWING.map((k) => process.env[k]);
13
16
 
14
17
  function restoreEnv(name: string, value: string | undefined) {
15
18
  if (value === undefined) {
@@ -22,11 +25,13 @@ function restoreEnv(name: string, value: string | undefined) {
22
25
  beforeEach(() => {
23
26
  restoreEnv('API_URL', undefined);
24
27
  restoreEnv('API_KEY', undefined);
28
+ SHADOWING.forEach((k) => restoreEnv(k, undefined));
25
29
  });
26
30
 
27
31
  afterEach(() => {
28
32
  restoreEnv('API_URL', savedApiUrl);
29
33
  restoreEnv('API_KEY', savedApiKey);
34
+ SHADOWING.forEach((k, i) => restoreEnv(k, savedShadowing[i]));
30
35
  jest.restoreAllMocks();
31
36
  });
32
37
 
@@ -41,8 +46,8 @@ describe('EnvConfig.apiURL', () => {
41
46
  expect(EnvConfig.apiURL).toBe('localhost:8082');
42
47
  });
43
48
 
44
- test('defaults to api.fintekkers.org:8082 when API_URL is unset', () => {
45
- expect(EnvConfig.apiURL).toBe('api.fintekkers.org:8082');
49
+ test('defaults to localhost:8082 when API_URL is unset', () => {
50
+ expect(EnvConfig.apiURL).toBe('localhost:8082');
46
51
  });
47
52
  });
48
53
 
@@ -70,7 +75,18 @@ describe('EnvConfig.apiCredentials', () => {
70
75
  expect(ssl).not.toHaveBeenCalled();
71
76
  });
72
77
 
73
- test('uses SSL credentials when API_URL is unset', () => {
78
+ test('uses insecure credentials when API_URL is unset (localhost:8082)', () => {
79
+ const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
80
+ const ssl = jest.spyOn(grpc.credentials, 'createSsl');
81
+
82
+ EnvConfig.apiCredentials;
83
+
84
+ expect(insecure).toHaveBeenCalledTimes(1);
85
+ expect(ssl).not.toHaveBeenCalled();
86
+ });
87
+
88
+ test('uses SSL credentials for a remote API_URL', () => {
89
+ process.env.API_URL = 'myhost.example.com';
74
90
  const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
75
91
  const ssl = jest.spyOn(grpc.credentials, 'createSsl');
76
92
 
@@ -83,6 +99,7 @@ describe('EnvConfig.apiCredentials', () => {
83
99
 
84
100
  describe('EnvConfig.getAuthenticatedCredentials', () => {
85
101
  test('metadata generator injects x-api-key', () => {
102
+ process.env.API_URL = 'myhost.example.com';
86
103
  const generatorSpy = jest.spyOn(grpc.credentials, 'createFromMetadataGenerator');
87
104
 
88
105
  const creds = EnvConfig.getAuthenticatedCredentials('k');
@@ -92,7 +109,7 @@ describe('EnvConfig.getAuthenticatedCredentials', () => {
92
109
 
93
110
  const generator = generatorSpy.mock.calls[0][0];
94
111
  const callback = jest.fn();
95
- generator({ service_url: 'https://api.fintekkers.org:8082' }, callback);
112
+ generator({ service_url: 'https://myhost.example.com:8082' }, callback);
96
113
 
97
114
  expect(callback).toHaveBeenCalledTimes(1);
98
115
  const [err, metadata] = callback.mock.calls[0];
@@ -129,6 +146,7 @@ describe('EnvConfig.getAuthenticatedCredentials', () => {
129
146
  ];
130
147
  const generatorSpy = jest.spyOn(grpc.credentials, 'createFromMetadataGenerator');
131
148
 
149
+ process.env.API_URL = 'myhost.example.com';
132
150
  EnvConfig.getAuthenticatedCredentials(secret);
133
151
  generatorSpy.mock.calls[0][0]({ service_url: '' }, () => {});
134
152
  process.env.API_URL = 'localhost:80';
@@ -155,8 +173,8 @@ describe('EnvConfig.getAuthenticatedClientOptions', () => {
155
173
  expect(interceptors).toHaveLength(1);
156
174
  });
157
175
 
158
- test('uses SSL channel for api.fintekkers.org', () => {
159
- process.env.API_URL = 'api.fintekkers.org';
176
+ test('uses SSL channel for a remote host', () => {
177
+ process.env.API_URL = 'myhost.example.com';
160
178
  const insecure = jest.spyOn(grpc.credentials, 'createInsecure');
161
179
  const ssl = jest.spyOn(grpc.credentials, 'createSsl');
162
180
 
@@ -1,16 +1,21 @@
1
1
  import * as grpc from '@grpc/grpc-js';
2
+ import { Service } from '../../util/serviceaddress';
2
3
  declare class EnvConfig {
3
- private static getEnvVar;
4
4
  static get apiKey(): string | undefined;
5
5
  /**
6
- * Returns the URL for the backend GRPC service. It will default to
7
- * api.fintekkers.org:8082 if the environment variable is not set. If
8
- * API_URL already includes a port (e.g. localhost:8083), it is used as-is;
9
- * otherwise :8082 is appended for backward compatibility.
6
+ * Returns the `host:port` of the ledger service, found the same way as
7
+ * every other service: `BROKER_HOST`, then `LEDGER_SERVICE_HOST`/`_PORT`,
8
+ * then `API_URL` (with :8082 unless it carries a port), then
9
+ * localhost:8082. Clients should prefer {@link EnvConfig.urlFor}.
10
10
  */
11
11
  static get apiURL(): string;
12
- private static get isLocalURL();
12
+ /** Returns the `host:port` a client for `service` connects to. */
13
+ static urlFor(service: Service): string;
14
+ private static isPlaintext;
15
+ /** Channel credentials for {@link EnvConfig.apiURL}. */
13
16
  static get apiCredentials(): grpc.ChannelCredentials;
17
+ /** Insecure credentials for a loopback address, SSL otherwise. */
18
+ static credentialsFor(service: Service): grpc.ChannelCredentials;
14
19
  private static addApiKey;
15
20
  /**
16
21
  * Returns SSL channel credentials combined with per-call credentials that
@@ -21,22 +26,23 @@ declare class EnvConfig {
21
26
  * {@link EnvConfig.getAuthenticatedClientOptions}, which sends the key via
22
27
  * an interceptor instead.
23
28
  *
24
- * @throws {InsecureChannelAuthError} when apiURL is localhost / 127.0.0.1.
29
+ * @throws {InsecureChannelAuthError} when the address of `service` is
30
+ * localhost / 127.0.0.1.
25
31
  */
26
- static getAuthenticatedCredentials(apiKey: string): grpc.ChannelCredentials;
32
+ static getAuthenticatedCredentials(apiKey: string, service?: Service): grpc.ChannelCredentials;
27
33
  /**
28
- * Returns credentials and interceptors for authenticated calls.
34
+ * Returns credentials and interceptors for authenticated calls to `service`.
29
35
  * For local (insecure) channels, injects the API key via an interceptor.
30
36
  * For remote (SSL) channels, uses {@link EnvConfig.getAuthenticatedCredentials}.
31
37
  */
32
- static getAuthenticatedClientOptions(apiKey: string): {
38
+ static getAuthenticatedClientOptions(apiKey: string, service?: Service): {
33
39
  credentials: grpc.ChannelCredentials;
34
40
  interceptors: grpc.Interceptor[];
35
41
  };
36
42
  }
37
43
  /**
38
- * Thrown by EnvConfig.getAuthenticatedCredentials when API_URL points at an
39
- * insecure (local) channel. The message never includes the API key.
44
+ * Thrown by EnvConfig.getAuthenticatedCredentials when the service address is
45
+ * an insecure (local) channel. The message never includes the API key.
40
46
  */
41
47
  export declare class InsecureChannelAuthError extends Error {
42
48
  constructor();
@@ -27,35 +27,34 @@ exports.InsecureChannelAuthError = void 0;
27
27
  const dotenv = __importStar(require("dotenv"));
28
28
  dotenv.config();
29
29
  const grpc = __importStar(require("@grpc/grpc-js"));
30
+ const serviceaddress_1 = require("../../util/serviceaddress");
30
31
  class EnvConfig {
31
- static getEnvVar(key, defaultValue) {
32
- const value = process.env[key];
33
- if (value === undefined) {
34
- if (defaultValue === undefined) {
35
- throw new Error(`Environment variable ${key} is not set.`);
36
- }
37
- return defaultValue;
38
- }
39
- return value;
40
- }
41
32
  static get apiKey() {
42
33
  return process.env['API_KEY'];
43
34
  }
44
35
  /**
45
- * Returns the URL for the backend GRPC service. It will default to
46
- * api.fintekkers.org:8082 if the environment variable is not set. If
47
- * API_URL already includes a port (e.g. localhost:8083), it is used as-is;
48
- * otherwise :8082 is appended for backward compatibility.
36
+ * Returns the `host:port` of the ledger service, found the same way as
37
+ * every other service: `BROKER_HOST`, then `LEDGER_SERVICE_HOST`/`_PORT`,
38
+ * then `API_URL` (with :8082 unless it carries a port), then
39
+ * localhost:8082. Clients should prefer {@link EnvConfig.urlFor}.
49
40
  */
50
41
  static get apiURL() {
51
- const base = EnvConfig.getEnvVar('API_URL', 'api.fintekkers.org');
52
- return /:\d+$/.test(base) ? base : base + ':8082';
42
+ return EnvConfig.urlFor(serviceaddress_1.Service.SECURITY);
53
43
  }
54
- static get isLocalURL() {
55
- return /^localhost|^127\.0\.0\.1/.test(this.apiURL);
44
+ /** Returns the `host:port` a client for `service` connects to. */
45
+ static urlFor(service) {
46
+ return (0, serviceaddress_1.target)((0, serviceaddress_1.resolve)(service));
56
47
  }
48
+ static isPlaintext(service) {
49
+ return (0, serviceaddress_1.resolve)(service).plaintext;
50
+ }
51
+ /** Channel credentials for {@link EnvConfig.apiURL}. */
57
52
  static get apiCredentials() {
58
- if (this.isLocalURL) {
53
+ return EnvConfig.credentialsFor(serviceaddress_1.Service.SECURITY);
54
+ }
55
+ /** Insecure credentials for a loopback address, SSL otherwise. */
56
+ static credentialsFor(service) {
57
+ if (EnvConfig.isPlaintext(service)) {
59
58
  return grpc.credentials.createInsecure();
60
59
  }
61
60
  else {
@@ -74,10 +73,11 @@ class EnvConfig {
74
73
  * {@link EnvConfig.getAuthenticatedClientOptions}, which sends the key via
75
74
  * an interceptor instead.
76
75
  *
77
- * @throws {InsecureChannelAuthError} when apiURL is localhost / 127.0.0.1.
76
+ * @throws {InsecureChannelAuthError} when the address of `service` is
77
+ * localhost / 127.0.0.1.
78
78
  */
79
- static getAuthenticatedCredentials(apiKey) {
80
- if (this.isLocalURL) {
79
+ static getAuthenticatedCredentials(apiKey, service = serviceaddress_1.Service.SECURITY) {
80
+ if (EnvConfig.isPlaintext(service)) {
81
81
  throw new InsecureChannelAuthError();
82
82
  }
83
83
  const callCreds = grpc.credentials.createFromMetadataGenerator((_params, callback) => {
@@ -88,12 +88,12 @@ class EnvConfig {
88
88
  return grpc.credentials.combineChannelCredentials(grpc.credentials.createSsl(), callCreds);
89
89
  }
90
90
  /**
91
- * Returns credentials and interceptors for authenticated calls.
91
+ * Returns credentials and interceptors for authenticated calls to `service`.
92
92
  * For local (insecure) channels, injects the API key via an interceptor.
93
93
  * For remote (SSL) channels, uses {@link EnvConfig.getAuthenticatedCredentials}.
94
94
  */
95
- static getAuthenticatedClientOptions(apiKey) {
96
- if (this.isLocalURL) {
95
+ static getAuthenticatedClientOptions(apiKey, service = serviceaddress_1.Service.SECURITY) {
96
+ if (EnvConfig.isPlaintext(service)) {
97
97
  const interceptor = (_options, nextCall) => {
98
98
  return new grpc.InterceptingCall(nextCall(_options), {
99
99
  start(metadata, listener, next) {
@@ -105,14 +105,14 @@ class EnvConfig {
105
105
  return { credentials: grpc.credentials.createInsecure(), interceptors: [interceptor] };
106
106
  }
107
107
  return {
108
- credentials: EnvConfig.getAuthenticatedCredentials(apiKey),
108
+ credentials: EnvConfig.getAuthenticatedCredentials(apiKey, service),
109
109
  interceptors: []
110
110
  };
111
111
  }
112
112
  }
113
113
  /**
114
- * Thrown by EnvConfig.getAuthenticatedCredentials when API_URL points at an
115
- * insecure (local) channel. The message never includes the API key.
114
+ * Thrown by EnvConfig.getAuthenticatedCredentials when the service address is
115
+ * an insecure (local) channel. The message never includes the API key.
116
116
  */
117
117
  class InsecureChannelAuthError extends Error {
118
118
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"requestcontext.js","sourceRoot":"","sources":["requestcontext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestcontext.js","sourceRoot":"","sources":["requestcontext.ts"],"names":[],"mappings":"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"}
@@ -49,9 +49,16 @@ function setEnv(key, value) {
49
49
  env[key] = value;
50
50
  }
51
51
  }
52
+ // Variables the lookup reads before API_URL; the host may set them.
53
+ const SHADOWING = ['BROKER_HOST', 'LEDGER_SERVICE_HOST', 'LEDGER_SERVICE_PORT'];
52
54
  describe('EnvConfig.apiURL', () => {
53
55
  const original = env['API_URL'];
54
- afterEach(() => setEnv('API_URL', original));
56
+ const saved = SHADOWING.map((k) => env[k]);
57
+ beforeEach(() => SHADOWING.forEach((k) => setEnv(k, undefined)));
58
+ afterEach(() => {
59
+ setEnv('API_URL', original);
60
+ SHADOWING.forEach((k, i) => setEnv(k, saved[i]));
61
+ });
55
62
  test('appends :8082 when API_URL has no port', () => {
56
63
  setEnv('API_URL', 'myhost.example.com');
57
64
  expect(requestcontext_1.default.apiURL).toBe('myhost.example.com:8082');
@@ -60,9 +67,14 @@ describe('EnvConfig.apiURL', () => {
60
67
  setEnv('API_URL', 'localhost:8083');
61
68
  expect(requestcontext_1.default.apiURL).toBe('localhost:8083');
62
69
  });
63
- test('defaults to api.fintekkers.org:8082 when unset', () => {
70
+ test('defaults to localhost:8082 when unset', () => {
64
71
  setEnv('API_URL', undefined);
65
- expect(requestcontext_1.default.apiURL).toBe('api.fintekkers.org:8082');
72
+ expect(requestcontext_1.default.apiURL).toBe('localhost:8082');
73
+ });
74
+ test('is the broker when BROKER_HOST is set, whatever API_URL says', () => {
75
+ setEnv('API_URL', 'localhost');
76
+ setEnv('BROKER_HOST', '127.0.0.1:8085');
77
+ expect(requestcontext_1.default.apiURL).toBe('127.0.0.1:8085');
66
78
  });
67
79
  });
68
80
  describe('EnvConfig.apiKey', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"requestcontext.test.js","sourceRoot":"","sources":["requestcontext.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requestcontext.test.js","sourceRoot":"","sources":["requestcontext.test.ts"],"names":[],"mappings":"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"}
@@ -15,9 +15,17 @@ function setEnv(key: string, value: string | undefined): void {
15
15
  }
16
16
  }
17
17
 
18
+ // Variables the lookup reads before API_URL; the host may set them.
19
+ const SHADOWING = ['BROKER_HOST', 'LEDGER_SERVICE_HOST', 'LEDGER_SERVICE_PORT'];
20
+
18
21
  describe('EnvConfig.apiURL', () => {
19
22
  const original = env['API_URL'];
20
- afterEach(() => setEnv('API_URL', original));
23
+ const saved = SHADOWING.map((k) => env[k]);
24
+ beforeEach(() => SHADOWING.forEach((k) => setEnv(k, undefined)));
25
+ afterEach(() => {
26
+ setEnv('API_URL', original);
27
+ SHADOWING.forEach((k, i) => setEnv(k, saved[i]));
28
+ });
21
29
 
22
30
  test('appends :8082 when API_URL has no port', () => {
23
31
  setEnv('API_URL', 'myhost.example.com');
@@ -29,9 +37,15 @@ describe('EnvConfig.apiURL', () => {
29
37
  expect(EnvConfig.apiURL).toBe('localhost:8083');
30
38
  });
31
39
 
32
- test('defaults to api.fintekkers.org:8082 when unset', () => {
40
+ test('defaults to localhost:8082 when unset', () => {
33
41
  setEnv('API_URL', undefined);
34
- expect(EnvConfig.apiURL).toBe('api.fintekkers.org:8082');
42
+ expect(EnvConfig.apiURL).toBe('localhost:8082');
43
+ });
44
+
45
+ test('is the broker when BROKER_HOST is set, whatever API_URL says', () => {
46
+ setEnv('API_URL', 'localhost');
47
+ setEnv('BROKER_HOST', '127.0.0.1:8085');
48
+ expect(EnvConfig.apiURL).toBe('127.0.0.1:8085');
35
49
  });
36
50
  });
37
51
 
@@ -3,39 +3,40 @@ dotenv.config();
3
3
 
4
4
  import * as grpc from '@grpc/grpc-js';
5
5
 
6
- class EnvConfig {
7
- private static getEnvVar(key: string, defaultValue?: string): string {
8
- const value = process.env[key];
9
- if (value === undefined) {
10
- if (defaultValue === undefined) {
11
- throw new Error(`Environment variable ${key} is not set.`);
12
- }
13
- return defaultValue;
14
- }
15
- return value;
16
- }
6
+ import { Service, resolve, target } from '../../util/serviceaddress';
17
7
 
8
+ class EnvConfig {
18
9
  static get apiKey(): string | undefined {
19
10
  return process.env['API_KEY'];
20
11
  }
21
12
 
22
13
  /**
23
- * Returns the URL for the backend GRPC service. It will default to
24
- * api.fintekkers.org:8082 if the environment variable is not set. If
25
- * API_URL already includes a port (e.g. localhost:8083), it is used as-is;
26
- * otherwise :8082 is appended for backward compatibility.
14
+ * Returns the `host:port` of the ledger service, found the same way as
15
+ * every other service: `BROKER_HOST`, then `LEDGER_SERVICE_HOST`/`_PORT`,
16
+ * then `API_URL` (with :8082 unless it carries a port), then
17
+ * localhost:8082. Clients should prefer {@link EnvConfig.urlFor}.
27
18
  */
28
19
  static get apiURL(): string {
29
- const base = EnvConfig.getEnvVar('API_URL', 'api.fintekkers.org');
30
- return /:\d+$/.test(base) ? base : base + ':8082';
20
+ return EnvConfig.urlFor(Service.SECURITY);
31
21
  }
32
22
 
33
- private static get isLocalURL(): boolean {
34
- return /^localhost|^127\.0\.0\.1/.test(this.apiURL);
23
+ /** Returns the `host:port` a client for `service` connects to. */
24
+ static urlFor(service: Service): string {
25
+ return target(resolve(service));
35
26
  }
36
27
 
28
+ private static isPlaintext(service: Service): boolean {
29
+ return resolve(service).plaintext;
30
+ }
31
+
32
+ /** Channel credentials for {@link EnvConfig.apiURL}. */
37
33
  static get apiCredentials(): grpc.ChannelCredentials {
38
- if (this.isLocalURL) {
34
+ return EnvConfig.credentialsFor(Service.SECURITY);
35
+ }
36
+
37
+ /** Insecure credentials for a loopback address, SSL otherwise. */
38
+ static credentialsFor(service: Service): grpc.ChannelCredentials {
39
+ if (EnvConfig.isPlaintext(service)) {
39
40
  return grpc.credentials.createInsecure();
40
41
  }
41
42
  else {
@@ -56,10 +57,11 @@ class EnvConfig {
56
57
  * {@link EnvConfig.getAuthenticatedClientOptions}, which sends the key via
57
58
  * an interceptor instead.
58
59
  *
59
- * @throws {InsecureChannelAuthError} when apiURL is localhost / 127.0.0.1.
60
+ * @throws {InsecureChannelAuthError} when the address of `service` is
61
+ * localhost / 127.0.0.1.
60
62
  */
61
- static getAuthenticatedCredentials(apiKey: string): grpc.ChannelCredentials {
62
- if (this.isLocalURL) {
63
+ static getAuthenticatedCredentials(apiKey: string, service: Service = Service.SECURITY): grpc.ChannelCredentials {
64
+ if (EnvConfig.isPlaintext(service)) {
63
65
  throw new InsecureChannelAuthError();
64
66
  }
65
67
  const callCreds = grpc.credentials.createFromMetadataGenerator(
@@ -76,15 +78,15 @@ class EnvConfig {
76
78
  }
77
79
 
78
80
  /**
79
- * Returns credentials and interceptors for authenticated calls.
81
+ * Returns credentials and interceptors for authenticated calls to `service`.
80
82
  * For local (insecure) channels, injects the API key via an interceptor.
81
83
  * For remote (SSL) channels, uses {@link EnvConfig.getAuthenticatedCredentials}.
82
84
  */
83
- static getAuthenticatedClientOptions(apiKey: string): {
85
+ static getAuthenticatedClientOptions(apiKey: string, service: Service = Service.SECURITY): {
84
86
  credentials: grpc.ChannelCredentials;
85
87
  interceptors: grpc.Interceptor[];
86
88
  } {
87
- if (this.isLocalURL) {
89
+ if (EnvConfig.isPlaintext(service)) {
88
90
  const interceptor: grpc.Interceptor = (_options, nextCall) => {
89
91
  return new grpc.InterceptingCall(nextCall(_options), {
90
92
  start(metadata: grpc.Metadata, listener: grpc.Listener, next: Function) {
@@ -96,15 +98,15 @@ class EnvConfig {
96
98
  return { credentials: grpc.credentials.createInsecure(), interceptors: [interceptor] };
97
99
  }
98
100
  return {
99
- credentials: EnvConfig.getAuthenticatedCredentials(apiKey),
101
+ credentials: EnvConfig.getAuthenticatedCredentials(apiKey, service),
100
102
  interceptors: []
101
103
  };
102
104
  }
103
105
  }
104
106
 
105
107
  /**
106
- * Thrown by EnvConfig.getAuthenticatedCredentials when API_URL points at an
107
- * insecure (local) channel. The message never includes the API key.
108
+ * Thrown by EnvConfig.getAuthenticatedCredentials when the service address is
109
+ * an insecure (local) channel. The message never includes the API key.
108
110
  */
109
111
  export class InsecureChannelAuthError extends Error {
110
112
  constructor() {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Unit tests for Issue #114: each wrapper service hands the generated gRPC
3
3
  * client the authenticated credentials when given an apiKey, and
4
- * EnvConfig.apiCredentials otherwise.
4
+ * EnvConfig.credentialsFor(service) otherwise, for its own service (LM-287).
5
5
  *
6
6
  * The generated *_grpc_pb clients are mocked, so no channel is opened.
7
7
  */