@toa.io/extensions.origins 0.20.0-dev.21 → 0.20.0-dev.23
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.
- package/package.json +6 -6
- package/transpiled/annotation.d.ts +9 -0
- package/transpiled/annotation.js +15 -0
- package/transpiled/annotation.js.map +1 -0
- package/transpiled/constants.d.ts +1 -0
- package/transpiled/constants.js +3 -0
- package/transpiled/constants.js.map +1 -0
- package/transpiled/env.d.ts +5 -0
- package/transpiled/env.js +40 -0
- package/transpiled/env.js.map +1 -0
- package/transpiled/extension.d.ts +7 -0
- package/transpiled/extension.js +13 -0
- package/transpiled/extension.js.map +1 -0
- package/transpiled/factory.d.ts +9 -0
- package/transpiled/factory.js +36 -0
- package/transpiled/factory.js.map +1 -0
- package/transpiled/factory.test.d.ts +1 -0
- package/transpiled/factory.test.js +107 -0
- package/transpiled/factory.test.js.map +1 -0
- package/transpiled/index.d.ts +3 -0
- package/transpiled/index.js +8 -0
- package/transpiled/index.js.map +1 -0
- package/transpiled/manifest.d.ts +1 -0
- package/transpiled/manifest.js +5 -0
- package/transpiled/manifest.js.map +1 -0
- package/transpiled/manifest.test.d.ts +1 -0
- package/transpiled/manifest.test.js +53 -0
- package/transpiled/manifest.test.js.map +1 -0
- package/transpiled/protocols/amqp/.test/aspect.fixtures.d.ts +1 -0
- package/transpiled/protocols/amqp/.test/aspect.fixtures.js +11 -0
- package/transpiled/protocols/amqp/.test/aspect.fixtures.js.map +1 -0
- package/transpiled/protocols/amqp/.test/mock.comq.d.ts +7 -0
- package/transpiled/protocols/amqp/.test/mock.comq.js +11 -0
- package/transpiled/protocols/amqp/.test/mock.comq.js.map +1 -0
- package/transpiled/protocols/amqp/aspect.d.ts +18 -0
- package/transpiled/protocols/amqp/aspect.js +61 -0
- package/transpiled/protocols/amqp/aspect.js.map +1 -0
- package/transpiled/protocols/amqp/aspect.test.d.ts +1 -0
- package/transpiled/protocols/amqp/aspect.test.js +84 -0
- package/transpiled/protocols/amqp/aspect.test.js.map +1 -0
- package/transpiled/protocols/amqp/deployment.d.ts +5 -0
- package/transpiled/protocols/amqp/deployment.js +55 -0
- package/transpiled/protocols/amqp/deployment.js.map +1 -0
- package/transpiled/protocols/amqp/id.d.ts +1 -0
- package/transpiled/protocols/amqp/id.js +3 -0
- package/transpiled/protocols/amqp/id.js.map +1 -0
- package/transpiled/protocols/amqp/index.d.ts +5 -0
- package/transpiled/protocols/amqp/index.js +10 -0
- package/transpiled/protocols/amqp/index.js.map +1 -0
- package/transpiled/protocols/amqp/protocols.d.ts +2 -0
- package/transpiled/protocols/amqp/protocols.js +3 -0
- package/transpiled/protocols/amqp/protocols.js.map +1 -0
- package/transpiled/protocols/http/.aspect/permissions.d.ts +11 -0
- package/transpiled/protocols/http/.aspect/permissions.js +52 -0
- package/transpiled/protocols/http/.aspect/permissions.js.map +1 -0
- package/transpiled/protocols/http/.test/aspect.fixtures.d.ts +10 -0
- package/transpiled/protocols/http/.test/aspect.fixtures.js +27 -0
- package/transpiled/protocols/http/.test/aspect.fixtures.js.map +1 -0
- package/transpiled/protocols/http/aspect.d.ts +18 -0
- package/transpiled/protocols/http/aspect.js +97 -0
- package/transpiled/protocols/http/aspect.js.map +1 -0
- package/transpiled/protocols/http/aspect.test.d.ts +1 -0
- package/transpiled/protocols/http/aspect.test.js +155 -0
- package/transpiled/protocols/http/aspect.test.js.map +1 -0
- package/transpiled/protocols/http/id.d.ts +1 -0
- package/transpiled/protocols/http/id.js +3 -0
- package/transpiled/protocols/http/id.js.map +1 -0
- package/transpiled/protocols/http/index.d.ts +4 -0
- package/transpiled/protocols/http/index.js +8 -0
- package/transpiled/protocols/http/index.js.map +1 -0
- package/transpiled/protocols/http/protocols.d.ts +2 -0
- package/transpiled/protocols/http/protocols.js +3 -0
- package/transpiled/protocols/http/protocols.js.map +1 -0
- package/transpiled/protocols/index.d.ts +4 -0
- package/transpiled/protocols/index.js +5 -0
- package/transpiled/protocols/index.js.map +1 -0
- package/transpiled/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { generate } = require('randomstring');
|
|
3
|
+
const { Connector } = require('@toa.io/core');
|
|
4
|
+
const { sample } = require('@toa.io/generic');
|
|
5
|
+
const comq = require('./.test/mock.comq');
|
|
6
|
+
const mock = { comq };
|
|
7
|
+
jest.mock('comq', () => mock.comq);
|
|
8
|
+
const fixtures = require('./.test/aspect.fixtures');
|
|
9
|
+
const { create } = require('./aspect');
|
|
10
|
+
it('should be', async () => {
|
|
11
|
+
expect(create).toBeInstanceOf(Function);
|
|
12
|
+
});
|
|
13
|
+
/** @type {toa.origins.amqp.Aspect} */
|
|
14
|
+
let aspect;
|
|
15
|
+
/** @type {toa.origins.Manifest} */
|
|
16
|
+
let manifest;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
jest.clearAllMocks();
|
|
19
|
+
manifest = fixtures.manifest;
|
|
20
|
+
aspect = create(manifest);
|
|
21
|
+
});
|
|
22
|
+
it('should be instance of Connector', async () => {
|
|
23
|
+
expect(aspect).toBeInstanceOf(Connector);
|
|
24
|
+
});
|
|
25
|
+
it('should expose name', async () => {
|
|
26
|
+
expect(aspect.name).toStrictEqual('amqp');
|
|
27
|
+
});
|
|
28
|
+
it('should connect', async () => {
|
|
29
|
+
await aspect.open();
|
|
30
|
+
for (const reference of Object.values(manifest)) {
|
|
31
|
+
expect(comq.assert).toHaveBeenCalledWith(reference);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it('should connect to shards', async () => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
manifest = {
|
|
37
|
+
test: 'amqps://host{0-2}.domain.com'
|
|
38
|
+
};
|
|
39
|
+
aspect = create(manifest);
|
|
40
|
+
const shards = [];
|
|
41
|
+
for (let i = 0; i < 3; i++)
|
|
42
|
+
shards.push(`amqps://host${i}.domain.com`);
|
|
43
|
+
await aspect.open();
|
|
44
|
+
expect(comq.assert).toHaveBeenCalledWith(...shards);
|
|
45
|
+
});
|
|
46
|
+
it('should disconnect', async () => {
|
|
47
|
+
await aspect.open();
|
|
48
|
+
await aspect.close();
|
|
49
|
+
for (const reference of Object.values(manifest)) {
|
|
50
|
+
const index = comq.assert.mock.calls.findIndex((call) => call[0] === reference);
|
|
51
|
+
const io = await comq.assert.mock.results[index].value;
|
|
52
|
+
expect(io.close).toHaveBeenCalled();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
describe('invoke', () => {
|
|
56
|
+
/** @type {jest.MockedObject<comq.IO>} */
|
|
57
|
+
let io;
|
|
58
|
+
/** @type {string} */
|
|
59
|
+
let origin;
|
|
60
|
+
let args;
|
|
61
|
+
beforeEach(async () => {
|
|
62
|
+
await aspect.open();
|
|
63
|
+
const origins = Object.keys(manifest);
|
|
64
|
+
origin = sample(origins);
|
|
65
|
+
const reference = manifest[origin];
|
|
66
|
+
const index = comq.assert.mock.calls.findIndex((call) => call[0] === reference);
|
|
67
|
+
io = await comq.assert.mock.results[index].value;
|
|
68
|
+
args = [generate(), generate(), generate()];
|
|
69
|
+
});
|
|
70
|
+
it('should be', async () => {
|
|
71
|
+
expect(aspect.invoke).toBeInstanceOf(Function);
|
|
72
|
+
});
|
|
73
|
+
it.each(['emit', 'request'])('should %s', async (method) => {
|
|
74
|
+
await aspect.invoke(origin, method, ...args);
|
|
75
|
+
expect(io[method]).toHaveBeenCalledWith(...args);
|
|
76
|
+
});
|
|
77
|
+
it.each(['reply', 'consume', generate()])('should not expose %s', async (method) => {
|
|
78
|
+
await expect(aspect.invoke(origin, method)).rejects.toThrow();
|
|
79
|
+
});
|
|
80
|
+
it('should throw if unknown origin', async () => {
|
|
81
|
+
await expect(aspect.invoke(generate(), 'emit')).rejects.toThrow();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=aspect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspect.test.js","sourceRoot":"","sources":["../../../source/protocols/amqp/aspect.test.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AACzC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAA;AAErB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;AACnD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAEtC,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IACzB,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;AACzC,CAAC,CAAC,CAAA;AAEF,sCAAsC;AACtC,IAAI,MAAM,CAAA;AAEV,mCAAmC;AACnC,IAAI,QAAQ,CAAA;AAEZ,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,CAAC,aAAa,EAAE,CAAA;IAEpB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;IAC5B,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;IAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;IAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;AAC3C,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAEnB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;KACpD;AACH,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IACxC,IAAI,CAAC,aAAa,EAAE,CAAA;IAEpB,QAAQ,GAAG;QACT,IAAI,EAAE,8BAA8B;KACrC,CAAA;IAED,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAA;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;IAEtE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAEnB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAA;AACrD,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;IACjC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IACnB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IAEpB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;QAC/E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAA;QAEtD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;KACpC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,yCAAyC;IACzC,IAAI,EAAE,CAAA;IAEN,qBAAqB;IACrB,IAAI,MAAM,CAAA;IAEV,IAAI,IAAI,CAAA;IAER,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAEnB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAErC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;QAE/E,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAA;QAChD,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;QAE5C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,sBAAsB,EAC9D,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEJ,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;IACnE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { letters: { up } } = require('@toa.io/generic');
|
|
3
|
+
const protocols = require('./protocols');
|
|
4
|
+
/**
|
|
5
|
+
* @param {toa.norm.context.dependencies.Instance[]} instances
|
|
6
|
+
* @returns {toa.deployment.dependency.Variables}
|
|
7
|
+
*/
|
|
8
|
+
function deployment(instances) {
|
|
9
|
+
/** @type {toa.deployment.dependency.Variables} */
|
|
10
|
+
const variables = {};
|
|
11
|
+
for (const { locator, manifest } of instances) {
|
|
12
|
+
const secrets = [];
|
|
13
|
+
for (const [origin, reference] of Object.entries(manifest)) {
|
|
14
|
+
let protocol;
|
|
15
|
+
const match = reference.match(RX);
|
|
16
|
+
if (match !== null)
|
|
17
|
+
protocol = match.groups.protocol;
|
|
18
|
+
if (protocols.includes(protocol)) {
|
|
19
|
+
const originSecrets = createSecrets(locator, origin);
|
|
20
|
+
secrets.push(...originSecrets);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
variables[locator.label] = secrets;
|
|
24
|
+
}
|
|
25
|
+
return variables;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @param {toa.core.Locator} locator
|
|
29
|
+
* @param {string} origin
|
|
30
|
+
* @return {toa.deployment.dependency.Variable[]}
|
|
31
|
+
*/
|
|
32
|
+
function createSecrets(locator, origin) {
|
|
33
|
+
const properties = ['username', 'password'];
|
|
34
|
+
return properties.map((property) => createSecret(locator, origin, property));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @param {toa.core.Locator} locator
|
|
38
|
+
* @param {string} origin
|
|
39
|
+
* @param {string} property
|
|
40
|
+
* @return {toa.deployment.dependency.Variable}
|
|
41
|
+
*/
|
|
42
|
+
function createSecret(locator, origin, property) {
|
|
43
|
+
const variable = `TOA_ORIGINS_${locator.uppercase}_${up(origin)}_${up(property)}`;
|
|
44
|
+
const secret = `toa-origins-${locator.label}-${origin}`;
|
|
45
|
+
return {
|
|
46
|
+
name: variable,
|
|
47
|
+
secret: {
|
|
48
|
+
name: secret,
|
|
49
|
+
key: property
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const RX = /^(?<protocol>\w{1,12}:)/;
|
|
54
|
+
exports.deployment = deployment;
|
|
55
|
+
//# sourceMappingURL=deployment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../source/protocols/amqp/deployment.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AACtD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;AAExC;;;GAGG;AACH,SAAS,UAAU,CAAE,SAAS;IAC5B,kDAAkD;IAClD,MAAM,SAAS,GAAG,EAAE,CAAA;IAEpB,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE;QAC7C,MAAM,OAAO,GAAG,EAAE,CAAA;QAElB,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC1D,IAAI,QAAQ,CAAA;YAEZ,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAEjC,IAAI,KAAK,KAAK,IAAI;gBAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAA;YAEpD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAChC,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAEpD,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAA;aAC/B;SACF;QAED,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAA;KACnC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAE,OAAO,EAAE,MAAM;IACrC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAE3C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAE,OAAO,EAAE,MAAM,EAAE,QAAQ;IAC9C,MAAM,QAAQ,GAAG,eAAe,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAA;IACjF,MAAM,MAAM,GAAG,eAAe,OAAO,CAAC,KAAK,IAAI,MAAM,EAAE,CAAA;IAEvD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,QAAQ;SACd;KACF,CAAA;AACH,CAAC;AAED,MAAM,EAAE,GAAG,yBAAyB,CAAA;AAEpC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const id: "amqp";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../../source/protocols/amqp/id.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,CAAC,EAAE,GAAG,MAAM,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const protocols = require('./protocols');
|
|
3
|
+
const { id } = require('./id');
|
|
4
|
+
const { create } = require('./aspect');
|
|
5
|
+
const { deployment } = require('./deployment');
|
|
6
|
+
exports.protocols = protocols;
|
|
7
|
+
exports.id = id;
|
|
8
|
+
exports.create = create;
|
|
9
|
+
exports.deployment = deployment;
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/protocols/amqp/index.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;AACxC,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AACtC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAE9C,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;AAC7B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;AACf,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;AACvB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocols.js","sourceRoot":"","sources":["../../../source/protocols/amqp/protocols.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @implements {toa.origins.http.Permissions}
|
|
3
|
+
*/
|
|
4
|
+
export class Permissions implements toa.origins.http.Permissions {
|
|
5
|
+
/**
|
|
6
|
+
* @param {toa.origins.http.Properties} properties
|
|
7
|
+
*/
|
|
8
|
+
constructor(properties: toa.origins.http.Properties);
|
|
9
|
+
test(url: any): boolean;
|
|
10
|
+
#private;
|
|
11
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { echo } = require('@toa.io/generic');
|
|
3
|
+
/**
|
|
4
|
+
* @implements {toa.origins.http.Permissions}
|
|
5
|
+
*/
|
|
6
|
+
class Permissions {
|
|
7
|
+
#default = process.env.TOA_DEV === '1';
|
|
8
|
+
/** @type {RegExp[]} */
|
|
9
|
+
#allowances = [];
|
|
10
|
+
/** @type {RegExp[]} */
|
|
11
|
+
#denials = [];
|
|
12
|
+
/**
|
|
13
|
+
* @param {toa.origins.http.Properties} properties
|
|
14
|
+
*/
|
|
15
|
+
constructor(properties) {
|
|
16
|
+
if (properties !== undefined)
|
|
17
|
+
this.#parse(properties);
|
|
18
|
+
}
|
|
19
|
+
test(url) {
|
|
20
|
+
const denial = this.#denials.findIndex((regexp) => regexp.test(url));
|
|
21
|
+
if (denial !== -1)
|
|
22
|
+
return false;
|
|
23
|
+
const allowance = this.#allowances.findIndex((regexp) => regexp.test(url));
|
|
24
|
+
return allowance !== -1;
|
|
25
|
+
}
|
|
26
|
+
#parse(properties) {
|
|
27
|
+
if ('null' in properties) {
|
|
28
|
+
const always = /** @type {RegExp} */ { test: () => true };
|
|
29
|
+
this.#addRule(always, properties.null);
|
|
30
|
+
delete properties.null;
|
|
31
|
+
}
|
|
32
|
+
for (const [key, rule] of Object.entries(properties)) {
|
|
33
|
+
const match = key.match(EXPRESSION);
|
|
34
|
+
if (match === null)
|
|
35
|
+
throw new Error(`'${key}' is not a regular expression`);
|
|
36
|
+
const expression = echo(match.groups.expression);
|
|
37
|
+
const regex = new RegExp(expression);
|
|
38
|
+
this.#addRule(regex, rule);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param {RegExp} regex
|
|
43
|
+
* @param {boolean} rule
|
|
44
|
+
*/
|
|
45
|
+
#addRule(regex, rule) {
|
|
46
|
+
const rules = rule ? this.#allowances : this.#denials;
|
|
47
|
+
rules.push(regex);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const EXPRESSION = /^\/(?<expression>.+)\/$/;
|
|
51
|
+
exports.Permissions = Permissions;
|
|
52
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../../source/protocols/http/.aspect/permissions.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE3C;;GAEG;AACH,MAAM,WAAW;IACf,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,GAAG,CAAA;IAEtC,uBAAuB;IACvB,WAAW,GAAG,EAAE,CAAA;IAEhB,uBAAuB;IACvB,QAAQ,GAAG,EAAE,CAAA;IAEb;;OAEG;IACH,YAAa,UAAU;QACrB,IAAI,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,CAAE,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAEpE,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAE1E,OAAO,SAAS,KAAK,CAAC,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,CAAE,UAAU;QAChB,IAAI,MAAM,IAAI,UAAU,EAAE;YACxB,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;YAEzD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;YACtC,OAAO,UAAU,CAAC,IAAI,CAAA;SACvB;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YACpD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAEnC,IAAI,KAAK,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,+BAA+B,CAAC,CAAA;YAE3E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAChD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAA;YAEpC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;SAC3B;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAE,KAAK,EAAE,IAAI;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAErD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;CACF;AAED,MAAM,UAAU,GAAG,yBAAyB,CAAA;AAE5C,OAAO,CAAC,WAAW,GAAG,WAAW,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { generate } = require('randomstring');
|
|
3
|
+
/** @type {toa.origins.Manifest} */
|
|
4
|
+
const manifest = {
|
|
5
|
+
foo: 'https://' + generate().toLowerCase(),
|
|
6
|
+
amazon: 'https://*.*.amazon.com:*',
|
|
7
|
+
deep: 'http://www.domain.com/some/path/'
|
|
8
|
+
};
|
|
9
|
+
const responses = [];
|
|
10
|
+
const fetch = jest.fn(async () => {
|
|
11
|
+
const response = responses.shift();
|
|
12
|
+
if (response === undefined)
|
|
13
|
+
throw new Error('Response is not mocked');
|
|
14
|
+
return {
|
|
15
|
+
status: response.status,
|
|
16
|
+
json: () => response.body
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
fetch.respond = (status, body) => {
|
|
20
|
+
responses.push({ status, body });
|
|
21
|
+
};
|
|
22
|
+
fetch.reset = () => {
|
|
23
|
+
responses.length = 0;
|
|
24
|
+
};
|
|
25
|
+
exports.manifest = manifest;
|
|
26
|
+
exports.mock = { fetch };
|
|
27
|
+
//# sourceMappingURL=aspect.fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspect.fixtures.js","sourceRoot":"","sources":["../../../../source/protocols/http/.test/aspect.fixtures.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAE5C,mCAAmC;AACnC,MAAM,QAAQ,GAAG;IACf,GAAG,EAAE,UAAU,GAAG,QAAQ,EAAE,CAAC,WAAW,EAAE;IAC1C,MAAM,EAAE,0BAA0B;IAClC,IAAI,EAAE,kCAAkC;CACzC,CAAA;AAED,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,CAAA;IAElC,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAErE,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI;KAC1B,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IAC/B,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE;IACjB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;AAC3B,OAAO,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {toa.origins.Manifest} manifest
|
|
3
|
+
* @param {toa.origins.http.Properties} [properties]
|
|
4
|
+
*/
|
|
5
|
+
export function create(manifest: toa.origins.Manifest, properties?: any): Aspect;
|
|
6
|
+
declare class Aspect extends Connector {
|
|
7
|
+
/**
|
|
8
|
+
* @param {toa.origins.Manifest} manifest
|
|
9
|
+
* @param {toa.origins.http.Permissions} permissions
|
|
10
|
+
*/
|
|
11
|
+
constructor(manifest: toa.origins.Manifest, permissions: toa.origins.http.Permissions);
|
|
12
|
+
/** @readonly */
|
|
13
|
+
readonly name: "http";
|
|
14
|
+
invoke(name: any, path: any, request: any, options: any): Promise<any>;
|
|
15
|
+
#private;
|
|
16
|
+
}
|
|
17
|
+
import { Connector } from "@toa.io/core";
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const fetch = require('node-fetch');
|
|
3
|
+
const { Connector } = require('@toa.io/core');
|
|
4
|
+
const { retry } = require('@toa.io/generic');
|
|
5
|
+
const { Permissions } = require('./.aspect/permissions');
|
|
6
|
+
const { id } = require('./id');
|
|
7
|
+
const protocols = require('./protocols');
|
|
8
|
+
class Aspect extends Connector {
|
|
9
|
+
/** @readonly */
|
|
10
|
+
name = id;
|
|
11
|
+
/** @type {toa.origins.Manifest} */
|
|
12
|
+
#origins;
|
|
13
|
+
/** @type {toa.origins.http.Permissions} */
|
|
14
|
+
#permissions;
|
|
15
|
+
/**
|
|
16
|
+
* @param {toa.origins.Manifest} manifest
|
|
17
|
+
* @param {toa.origins.http.Permissions} permissions
|
|
18
|
+
*/
|
|
19
|
+
constructor(manifest, permissions) {
|
|
20
|
+
super();
|
|
21
|
+
this.#origins = manifest;
|
|
22
|
+
this.#permissions = permissions;
|
|
23
|
+
}
|
|
24
|
+
async invoke(name, path, request, options) {
|
|
25
|
+
let origin = this.#origins[name];
|
|
26
|
+
if (origin === undefined) {
|
|
27
|
+
if (isAbsoluteURL(name))
|
|
28
|
+
return this.#invokeURL(name, /** @type {Request} */ path);
|
|
29
|
+
else
|
|
30
|
+
throw new Error(`Origin '${name}' is not defined`);
|
|
31
|
+
}
|
|
32
|
+
// absolute urls are forbidden when using origins
|
|
33
|
+
if (typeof path === 'string' && isAbsoluteURL(path))
|
|
34
|
+
throw new Error(`Absolute URLs are forbidden (${path})`);
|
|
35
|
+
if (options?.substitutions !== undefined)
|
|
36
|
+
origin = substitute(origin, options.substitutions);
|
|
37
|
+
const url = path === undefined ? new URL(origin) : new URL(path, origin);
|
|
38
|
+
return this.#request(url.href, request, options?.retry);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @param {string} url
|
|
42
|
+
* @param {Request} request
|
|
43
|
+
* @return {Promise<Response>}
|
|
44
|
+
*/
|
|
45
|
+
async #invokeURL(url, request) {
|
|
46
|
+
if (this.#permissions.test(url) === false)
|
|
47
|
+
throw new Error(`URL '${url}' is not allowed`);
|
|
48
|
+
return this.#request(url, request);
|
|
49
|
+
}
|
|
50
|
+
async #request(url, request, options) {
|
|
51
|
+
const call = () => fetch(url, request);
|
|
52
|
+
if (options === undefined)
|
|
53
|
+
return call();
|
|
54
|
+
else
|
|
55
|
+
return this.#retry(call, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* @param {Function} call
|
|
59
|
+
* @param {toa.generic.retry.Options} options
|
|
60
|
+
* @return {any}
|
|
61
|
+
*/
|
|
62
|
+
#retry(call, options) {
|
|
63
|
+
return retry(async (retry) => {
|
|
64
|
+
const response = await call();
|
|
65
|
+
if (Math.floor(response.status / 100) !== 2)
|
|
66
|
+
return retry();
|
|
67
|
+
return response;
|
|
68
|
+
}, options);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* @param {string} origin
|
|
73
|
+
* @param {string[]} substitutions
|
|
74
|
+
* @returns {string}
|
|
75
|
+
*/
|
|
76
|
+
function substitute(origin, substitutions) {
|
|
77
|
+
const replace = () => substitutions.shift();
|
|
78
|
+
return origin.replace(PLACEHOLDER, replace);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @param {string} path
|
|
82
|
+
* @returns {boolean}
|
|
83
|
+
*/
|
|
84
|
+
function isAbsoluteURL(path) {
|
|
85
|
+
return protocols.findIndex((protocol) => path.indexOf(protocol) === 0) !== -1;
|
|
86
|
+
}
|
|
87
|
+
const PLACEHOLDER = /\*/g;
|
|
88
|
+
/**
|
|
89
|
+
* @param {toa.origins.Manifest} manifest
|
|
90
|
+
* @param {toa.origins.http.Properties} [properties]
|
|
91
|
+
*/
|
|
92
|
+
function create(manifest, properties) {
|
|
93
|
+
const permissions = new Permissions(properties);
|
|
94
|
+
return new Aspect(manifest, permissions);
|
|
95
|
+
}
|
|
96
|
+
exports.create = create;
|
|
97
|
+
//# sourceMappingURL=aspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspect.js","sourceRoot":"","sources":["../../../source/protocols/http/aspect.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const clone = require('clone-deep');
|
|
3
|
+
const { generate } = require('randomstring');
|
|
4
|
+
const { random } = require('@toa.io/generic');
|
|
5
|
+
const { Connector } = require('@toa.io/core');
|
|
6
|
+
/** @type {string[]} */
|
|
7
|
+
const protocols = require('../http/protocols');
|
|
8
|
+
const fixtures = require('./.test/aspect.fixtures');
|
|
9
|
+
const mock = fixtures.mock;
|
|
10
|
+
jest.mock('node-fetch', () => mock.fetch);
|
|
11
|
+
const { create } = require('./aspect');
|
|
12
|
+
/** @type {toa.origins.http.Aspect} */ let aspect;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
aspect = create(fixtures.manifest);
|
|
16
|
+
});
|
|
17
|
+
it('should be instance of core.Connector', () => {
|
|
18
|
+
expect(aspect).toBeInstanceOf(Connector);
|
|
19
|
+
});
|
|
20
|
+
it('should have name \'origins\'', () => {
|
|
21
|
+
expect(aspect.name).toStrictEqual('http');
|
|
22
|
+
});
|
|
23
|
+
describe('invoke', () => {
|
|
24
|
+
const path = '/' + generate();
|
|
25
|
+
const headers = { [generate().toLowerCase()]: generate() };
|
|
26
|
+
const body = generate();
|
|
27
|
+
/** @type {import('node-fetch').RequestInit} */
|
|
28
|
+
const request = { method: 'PATCH', headers, body };
|
|
29
|
+
const name = 'foo';
|
|
30
|
+
const response = { [generate()]: generate() };
|
|
31
|
+
let call;
|
|
32
|
+
let args;
|
|
33
|
+
let result;
|
|
34
|
+
beforeEach(async () => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
mock.fetch.reset();
|
|
37
|
+
mock.fetch.respond(200, response);
|
|
38
|
+
result = await aspect.invoke(name, path, clone(request));
|
|
39
|
+
call = mock.fetch.mock.calls[0];
|
|
40
|
+
args = call?.[1];
|
|
41
|
+
});
|
|
42
|
+
it('should throw on unknown origin', async () => {
|
|
43
|
+
await expect(() => aspect.invoke('bar', path, request)).rejects.toThrow(/is not defined/);
|
|
44
|
+
});
|
|
45
|
+
it('should resolve URL', async () => {
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
mock.fetch.respond(200, response);
|
|
48
|
+
const path = 'ok';
|
|
49
|
+
await aspect.invoke('deep', path, clone(request));
|
|
50
|
+
expect(mock.fetch.mock.calls[0][0]).toStrictEqual(fixtures.manifest.deep + path);
|
|
51
|
+
});
|
|
52
|
+
it.each(protocols)('should throw on absolute URL (%s)', async (protocol) => {
|
|
53
|
+
jest.clearAllMocks();
|
|
54
|
+
mock.fetch.respond(200, response);
|
|
55
|
+
await expect(aspect.invoke('deep', protocol + '//api.domain.com', clone(request)))
|
|
56
|
+
.rejects.toThrow('Absolute URLs are forbidden');
|
|
57
|
+
});
|
|
58
|
+
it('should substitute wildcards', async () => {
|
|
59
|
+
jest.clearAllMocks();
|
|
60
|
+
mock.fetch.respond(200, response);
|
|
61
|
+
const substitutions = ['foo', 'bar', 443];
|
|
62
|
+
await aspect.invoke('amazon', path, clone(request), { substitutions });
|
|
63
|
+
const url = mock.fetch.mock.calls[0][0];
|
|
64
|
+
expect(url).toStrictEqual('https://foo.bar.amazon.com' + path);
|
|
65
|
+
});
|
|
66
|
+
it('should not lose query string', async () => {
|
|
67
|
+
jest.clearAllMocks();
|
|
68
|
+
mock.fetch.respond(200, response);
|
|
69
|
+
const path = generate() + '?foo=' + generate();
|
|
70
|
+
await aspect.invoke(name, path);
|
|
71
|
+
const url = mock.fetch.mock.calls[0][0];
|
|
72
|
+
expect(url).toStrictEqual(fixtures.manifest.foo + '/' + path);
|
|
73
|
+
});
|
|
74
|
+
it('should not throw if path is not defined', async () => {
|
|
75
|
+
jest.clearAllMocks();
|
|
76
|
+
mock.fetch.respond(200, response);
|
|
77
|
+
// noinspection JSCheckFunctionSignatures
|
|
78
|
+
expect(() => aspect.invoke(name)).not.toThrow();
|
|
79
|
+
});
|
|
80
|
+
describe('fetch', () => {
|
|
81
|
+
it('should fetch', async () => {
|
|
82
|
+
expect(mock.fetch).toHaveBeenCalledTimes(1);
|
|
83
|
+
});
|
|
84
|
+
it('should pass url', () => {
|
|
85
|
+
expect(call[0]).toStrictEqual(fixtures.manifest.foo + path);
|
|
86
|
+
});
|
|
87
|
+
it('should pass request', () => {
|
|
88
|
+
expect(args).toStrictEqual(request);
|
|
89
|
+
});
|
|
90
|
+
it('should return response', async () => {
|
|
91
|
+
const body = await result.json();
|
|
92
|
+
expect(body).toStrictEqual(response);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('retry', () => {
|
|
96
|
+
it('should retry', async () => {
|
|
97
|
+
jest.clearAllMocks();
|
|
98
|
+
const attempts = random(5) + 2;
|
|
99
|
+
for (let i = 1; i < attempts; i++)
|
|
100
|
+
mock.fetch.respond(500);
|
|
101
|
+
mock.fetch.respond(200, response);
|
|
102
|
+
/** @type {toa.origins.http.invocation.Options} */
|
|
103
|
+
const options = {
|
|
104
|
+
retry: { base: 0, retries: attempts }
|
|
105
|
+
};
|
|
106
|
+
await aspect.invoke(name, path, clone(request), options);
|
|
107
|
+
expect(mock.fetch).toHaveBeenCalledTimes(attempts);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe.each(protocols)('absolute URL', (protocol) => {
|
|
112
|
+
const response = { [generate()]: generate() };
|
|
113
|
+
it('should request absolute URL', async () => {
|
|
114
|
+
mock.fetch.respond(200, response);
|
|
115
|
+
const properties = { null: true };
|
|
116
|
+
const url = protocol + '//' + generate();
|
|
117
|
+
const request = { method: 'POST' };
|
|
118
|
+
aspect = create(fixtures.manifest, properties);
|
|
119
|
+
await aspect.invoke(url, request);
|
|
120
|
+
expect(mock.fetch).toHaveBeenCalledWith(url, request);
|
|
121
|
+
});
|
|
122
|
+
it('should throw if URL not allowed', async () => {
|
|
123
|
+
mock.fetch.respond(200, response);
|
|
124
|
+
const properties = {};
|
|
125
|
+
aspect = create(fixtures.manifest, properties);
|
|
126
|
+
const url = protocol + '//' + generate();
|
|
127
|
+
const request = { method: 'POST' };
|
|
128
|
+
await expect(aspect.invoke(url, request)).rejects.toThrow('is not allowed');
|
|
129
|
+
});
|
|
130
|
+
it.each([
|
|
131
|
+
[String.raw `/^${protocol}\/\/api.\S+.com/`, `${protocol}//api.${generate()}.com/path/to`],
|
|
132
|
+
[String.raw `/${protocol}\/\/api.\S+.com/`, `${protocol}//api.${generate()}.com/path/to`]
|
|
133
|
+
])('should allow requests %s', async (expression, url) => {
|
|
134
|
+
mock.fetch.respond(200, response);
|
|
135
|
+
const properties = { [expression]: true };
|
|
136
|
+
aspect = create(fixtures.manifest, properties);
|
|
137
|
+
await expect(aspect.invoke(url)).resolves.not.toThrow();
|
|
138
|
+
});
|
|
139
|
+
it.each([
|
|
140
|
+
[String.raw `/^${protocol}\/\/api.\S+.com/`, `${protocol}//api.${generate()}.com/path/to`],
|
|
141
|
+
[String.raw `/${protocol}\/\/api.\S+.com/`, `${protocol}//api.${generate()}.com/path/to`]
|
|
142
|
+
])('should allow requests except %s', async (expression, url) => {
|
|
143
|
+
mock.fetch.respond(200, response);
|
|
144
|
+
const properties = { null: true, [expression]: false };
|
|
145
|
+
aspect = create(fixtures.manifest, properties);
|
|
146
|
+
await expect(aspect.invoke(url)).rejects.toThrow('is not allowed');
|
|
147
|
+
});
|
|
148
|
+
it.each([
|
|
149
|
+
['starts', 'expression/'],
|
|
150
|
+
['ends', '/expression']
|
|
151
|
+
])('should throw if rule does not %s with /', async (_, expression) => {
|
|
152
|
+
expect(() => create(fixtures.manifest, { [expression]: true })).toThrow('is not a regular expression');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=aspect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aspect.test.js","sourceRoot":"","sources":["../../../source/protocols/http/aspect.test.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const id: "http";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../../source/protocols/http/id.js"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,CAAC,EAAE,GAAG,MAAM,CAAA"}
|