@alwaysai/device-agent 1.3.0-1 → 1.3.1-1
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/lib/application-control/environment-variables.d.ts +1 -0
- package/lib/application-control/environment-variables.d.ts.map +1 -1
- package/lib/application-control/environment-variables.js +22 -20
- package/lib/application-control/environment-variables.js.map +1 -1
- package/lib/application-control/environment-variables.test.js +37 -2
- package/lib/application-control/environment-variables.test.js.map +1 -1
- package/lib/application-control/install.js +1 -1
- package/lib/application-control/install.js.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts +4 -3
- package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
- package/lib/cloud-connection/device-agent-cloud-connection.js +149 -113
- package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
- package/lib/cloud-connection/live-updates-handler.js +30 -25
- package/lib/cloud-connection/live-updates-handler.js.map +1 -1
- package/lib/cloud-connection/live-updates-handler.test.js +15 -0
- package/lib/cloud-connection/live-updates-handler.test.js.map +1 -1
- package/lib/cloud-connection/messages.d.ts +1 -3
- package/lib/cloud-connection/messages.d.ts.map +1 -1
- package/lib/cloud-connection/messages.js +1 -9
- package/lib/cloud-connection/messages.js.map +1 -1
- package/lib/cloud-connection/publisher.d.ts +1 -0
- package/lib/cloud-connection/publisher.d.ts.map +1 -1
- package/lib/cloud-connection/publisher.js +3 -0
- package/lib/cloud-connection/publisher.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.d.ts +12 -0
- package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
- package/lib/cloud-connection/shadow-handler.js +36 -22
- package/lib/cloud-connection/shadow-handler.js.map +1 -1
- package/lib/cloud-connection/shadow-handler.test.js +84 -40
- package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.d.ts +25 -9
- package/lib/cloud-connection/transaction-manager.d.ts.map +1 -1
- package/lib/cloud-connection/transaction-manager.js +97 -28
- package/lib/cloud-connection/transaction-manager.js.map +1 -1
- package/lib/cloud-connection/transaction-manager.test.js +169 -22
- package/lib/cloud-connection/transaction-manager.test.js.map +1 -1
- package/lib/secure-tunneling/secure-tunneling.d.ts +105 -0
- package/lib/secure-tunneling/secure-tunneling.d.ts.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.js +435 -0
- package/lib/secure-tunneling/secure-tunneling.js.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.test.d.ts +2 -0
- package/lib/secure-tunneling/secure-tunneling.test.d.ts.map +1 -0
- package/lib/secure-tunneling/secure-tunneling.test.js +1070 -0
- package/lib/secure-tunneling/secure-tunneling.test.js.map +1 -0
- package/lib/secure-tunneling/spawner-detached.d.ts +6 -0
- package/lib/secure-tunneling/spawner-detached.d.ts.map +1 -0
- package/lib/secure-tunneling/spawner-detached.js +90 -0
- package/lib/secure-tunneling/spawner-detached.js.map +1 -0
- package/lib/subcommands/app/analytics.d.ts +10 -0
- package/lib/subcommands/app/analytics.d.ts.map +1 -0
- package/lib/subcommands/app/analytics.js +83 -0
- package/lib/subcommands/app/analytics.js.map +1 -0
- package/lib/subcommands/app/index.d.ts.map +1 -1
- package/lib/subcommands/app/index.js +3 -1
- package/lib/subcommands/app/index.js.map +1 -1
- package/lib/subcommands/app/models.d.ts +0 -5
- package/lib/subcommands/app/models.d.ts.map +1 -1
- package/lib/subcommands/app/models.js +11 -47
- package/lib/subcommands/app/models.js.map +1 -1
- package/lib/subcommands/app/status.d.ts +1 -0
- package/lib/subcommands/app/status.d.ts.map +1 -1
- package/lib/subcommands/app/status.js +14 -3
- package/lib/subcommands/app/status.js.map +1 -1
- package/lib/subcommands/app/version.d.ts +2 -1
- package/lib/subcommands/app/version.d.ts.map +1 -1
- package/lib/subcommands/app/version.js +16 -3
- package/lib/subcommands/app/version.js.map +1 -1
- package/lib/util/cloud-mode-ready.d.ts +1 -0
- package/lib/util/cloud-mode-ready.d.ts.map +1 -1
- package/lib/util/cloud-mode-ready.js +36 -1
- package/lib/util/cloud-mode-ready.js.map +1 -1
- package/lib/util/parsing.d.ts +2 -0
- package/lib/util/parsing.d.ts.map +1 -0
- package/lib/util/parsing.js +17 -0
- package/lib/util/parsing.js.map +1 -0
- package/package.json +4 -6
- package/readme.md +146 -92
- package/src/application-control/environment-variables.test.ts +43 -3
- package/src/application-control/environment-variables.ts +29 -19
- package/src/application-control/install.ts +1 -1
- package/src/cloud-connection/device-agent-cloud-connection.ts +216 -172
- package/src/cloud-connection/live-updates-handler.test.ts +20 -0
- package/src/cloud-connection/live-updates-handler.ts +45 -52
- package/src/cloud-connection/messages.ts +1 -14
- package/src/cloud-connection/publisher.ts +4 -0
- package/src/cloud-connection/shadow-handler.test.ts +93 -41
- package/src/cloud-connection/shadow-handler.ts +57 -21
- package/src/cloud-connection/transaction-manager.test.ts +183 -27
- package/src/cloud-connection/transaction-manager.ts +167 -36
- package/src/secure-tunneling/secure-tunneling.test.ts +1239 -0
- package/src/secure-tunneling/secure-tunneling.ts +606 -0
- package/src/secure-tunneling/spawner-detached.ts +107 -0
- package/src/subcommands/app/analytics.ts +99 -0
- package/src/subcommands/app/index.ts +4 -3
- package/src/subcommands/app/models.ts +13 -49
- package/src/subcommands/app/status.ts +20 -3
- package/src/subcommands/app/version.ts +19 -4
- package/src/util/cloud-mode-ready.ts +36 -0
- package/src/util/parsing.ts +11 -0
- package/lib/cloud-connection/cmd-status.d.ts +0 -8
- package/lib/cloud-connection/cmd-status.d.ts.map +0 -1
- package/lib/cloud-connection/cmd-status.js +0 -62
- package/lib/cloud-connection/cmd-status.js.map +0 -1
- package/lib/cloud-connection/message-builder.d.ts +0 -7
- package/lib/cloud-connection/message-builder.d.ts.map +0 -1
- package/lib/cloud-connection/message-builder.js +0 -63
- package/lib/cloud-connection/message-builder.js.map +0 -1
- package/lib/secure-tunneling/index.d.ts +0 -5
- package/lib/secure-tunneling/index.d.ts.map +0 -1
- package/lib/secure-tunneling/index.js +0 -64
- package/lib/secure-tunneling/index.js.map +0 -1
- package/src/cloud-connection/cmd-status.ts +0 -71
- package/src/cloud-connection/message-builder.ts +0 -117
- package/src/secure-tunneling/index.ts +0 -74
|
@@ -1,14 +1,30 @@
|
|
|
1
|
+
import { LiveUpdatesHandler } from './live-updates-handler';
|
|
2
|
+
import { Publisher } from './publisher';
|
|
1
3
|
export declare class TransactionManager {
|
|
2
|
-
private
|
|
3
|
-
private
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
private detailsByTx;
|
|
5
|
+
private detailsByProject;
|
|
6
|
+
private liveUpdatesHandler;
|
|
7
|
+
private publisher;
|
|
8
|
+
private startTransaction;
|
|
9
|
+
private updateTransaction;
|
|
10
|
+
constructor(publisher: Publisher, liveUpdatesHandler: LiveUpdatesHandler);
|
|
11
|
+
Errors: {
|
|
12
|
+
TRANSACTION_ONGOING: "TRANSACTION_ONGOING";
|
|
13
|
+
PROJECT_ONGOING: "PROJECT_ONGOING";
|
|
14
|
+
TRANSACTION_NOT_ONGOING: "TRANSACTION_NOT_ONGOING";
|
|
8
15
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
runTransactionStep(props: {
|
|
17
|
+
func: () => Promise<boolean>;
|
|
18
|
+
projectId: string;
|
|
19
|
+
txId: string;
|
|
20
|
+
start: boolean;
|
|
21
|
+
stepName?: string;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
getTransactionFromProject(projectId: string): string | undefined;
|
|
24
|
+
isOngoingTransactionForProjectID(projectId: string): boolean;
|
|
25
|
+
isOngoingTransaction(txId: string): boolean;
|
|
26
|
+
isAnyOngoingTransaction(): boolean;
|
|
27
|
+
getProjectFromTransaction(txId: string): string | undefined;
|
|
12
28
|
completeTransaction(txId: string): void;
|
|
13
29
|
}
|
|
14
30
|
//# sourceMappingURL=transaction-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction-manager.d.ts","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAcxC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,gBAAgB;IA+CxB,OAAO,CAAC,iBAAiB;gBAab,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB;IAOjE,MAAM;;;;MAIV;IAEU,kBAAkB,CAAC,KAAK,EAAE;QACrC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IA4CM,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKhE,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5D,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C,uBAAuB,IAAI,OAAO;IAIlC,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3D,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAmB/C"}
|
|
@@ -1,52 +1,121 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TransactionManager = void 0;
|
|
4
|
+
const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
|
|
5
|
+
const logger_1 = require("../util/logger");
|
|
4
6
|
const util_1 = require("alwaysai/lib/util");
|
|
5
7
|
const coded_error_1 = require("@carnesen/coded-error");
|
|
6
8
|
class TransactionManager {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.
|
|
9
|
-
this.
|
|
10
|
-
this.
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
constructor(publisher, liveUpdatesHandler) {
|
|
10
|
+
this.detailsByTx = {};
|
|
11
|
+
this.detailsByProject = {};
|
|
12
|
+
this.Errors = (0, util_1.keyMirror)({
|
|
13
|
+
TRANSACTION_ONGOING: null,
|
|
14
|
+
PROJECT_ONGOING: null,
|
|
15
|
+
TRANSACTION_NOT_ONGOING: null
|
|
13
16
|
});
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
17
|
+
this.detailsByTx = {};
|
|
18
|
+
this.detailsByProject = {};
|
|
19
|
+
this.publisher = publisher;
|
|
20
|
+
this.liveUpdatesHandler = liveUpdatesHandler;
|
|
16
21
|
}
|
|
17
|
-
|
|
18
|
-
// Check if the
|
|
19
|
-
if (this.
|
|
20
|
-
const
|
|
21
|
-
throw new coded_error_1.CodedError(`Transaction
|
|
22
|
+
startTransaction(txId, projectId, stepName) {
|
|
23
|
+
// Check if the transaction already exists
|
|
24
|
+
if (this.detailsByTx[txId]) {
|
|
25
|
+
const txnDetails = this.detailsByTx[txId];
|
|
26
|
+
throw new coded_error_1.CodedError(`Transaction ${txId} already ongoing!\n${JSON.stringify(txnDetails, null, 2)}`, this.Errors.TRANSACTION_ONGOING);
|
|
27
|
+
}
|
|
28
|
+
// Check if there is any ongoing transactions for project
|
|
29
|
+
if (this.detailsByProject[projectId]) {
|
|
30
|
+
const txnDetails = this.detailsByProject[projectId];
|
|
31
|
+
throw new coded_error_1.CodedError(`Project ${projectId} already has an ongoing transaction!\n${JSON.stringify(txnDetails, null, 2)}`, this.Errors.PROJECT_ONGOING);
|
|
32
|
+
}
|
|
33
|
+
// Map the Transaction ID with Project ID
|
|
34
|
+
const txDetails = {
|
|
35
|
+
txId,
|
|
36
|
+
projectId,
|
|
37
|
+
stepName,
|
|
38
|
+
start: new Date().toLocaleString()
|
|
39
|
+
};
|
|
40
|
+
this.detailsByTx[txId] = txDetails;
|
|
41
|
+
this.detailsByProject[projectId] = txDetails;
|
|
42
|
+
logger_1.logger.info(`Started transaction:\n${JSON.stringify(txDetails, null, 2)}`);
|
|
43
|
+
// send live updates
|
|
44
|
+
void this.liveUpdatesHandler.enableTransactionStatus({
|
|
45
|
+
txId
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
updateTransaction(txId, stepName) {
|
|
49
|
+
const txDetails = this.detailsByTx[txId];
|
|
50
|
+
if (!txDetails) {
|
|
51
|
+
throw new coded_error_1.CodedError(`Cannot update transaction ${txId} since it doesn't exist!`, this.Errors.TRANSACTION_NOT_ONGOING);
|
|
52
|
+
}
|
|
53
|
+
txDetails.stepName = stepName;
|
|
54
|
+
txDetails.update = new Date().toLocaleString();
|
|
55
|
+
logger_1.logger.info(`Updated transaction:\n${JSON.stringify(txDetails, null, 2)}`);
|
|
56
|
+
}
|
|
57
|
+
async runTransactionStep(props) {
|
|
58
|
+
const { func, projectId, txId, start, stepName } = props;
|
|
59
|
+
if (start) {
|
|
60
|
+
this.startTransaction(txId, projectId, stepName);
|
|
22
61
|
}
|
|
23
62
|
else {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
63
|
+
this.updateTransaction(txId, stepName);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const completed = await func();
|
|
67
|
+
if (completed) {
|
|
68
|
+
this.completeTransaction(txId);
|
|
69
|
+
const successStatusResponsePayload = {
|
|
70
|
+
status: device_agent_schemas_1.keyMirrors.statusResponse.success
|
|
71
|
+
};
|
|
72
|
+
// Send final status message
|
|
73
|
+
const message = (0, device_agent_schemas_1.buildToClientStatusResponseMessage)(this.publisher.getClientId(), successStatusResponsePayload, txId);
|
|
74
|
+
this.publisher.publishToClient(message);
|
|
33
75
|
}
|
|
34
76
|
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
const message = e.message;
|
|
79
|
+
logger_1.logger.error(`Failed to execute cmd for ${projectId}:\n${message}\n${e.stack}`);
|
|
80
|
+
this.completeTransaction(txId);
|
|
81
|
+
const failureStatusResponsePayload = {
|
|
82
|
+
status: device_agent_schemas_1.keyMirrors.statusResponse.failure,
|
|
83
|
+
message
|
|
84
|
+
};
|
|
85
|
+
// Send final status message
|
|
86
|
+
const failureStatusResponseMessage = (0, device_agent_schemas_1.buildToClientStatusResponseMessage)(this.publisher.getClientId(), failureStatusResponsePayload, txId);
|
|
87
|
+
this.publisher.publishToClient(failureStatusResponseMessage);
|
|
88
|
+
}
|
|
35
89
|
}
|
|
36
90
|
getTransactionFromProject(projectId) {
|
|
37
|
-
const txnDetails = this.
|
|
91
|
+
const txnDetails = this.detailsByProject[projectId];
|
|
38
92
|
return txnDetails === null || txnDetails === void 0 ? void 0 : txnDetails.txId;
|
|
39
93
|
}
|
|
94
|
+
isOngoingTransactionForProjectID(projectId) {
|
|
95
|
+
return projectId in this.detailsByProject;
|
|
96
|
+
}
|
|
97
|
+
isOngoingTransaction(txId) {
|
|
98
|
+
return txId in this.detailsByTx;
|
|
99
|
+
}
|
|
100
|
+
isAnyOngoingTransaction() {
|
|
101
|
+
return Object.keys(this.detailsByTx).length > 0;
|
|
102
|
+
}
|
|
40
103
|
getProjectFromTransaction(txId) {
|
|
41
|
-
const txnDetails = this.
|
|
104
|
+
const txnDetails = this.detailsByTx[txId];
|
|
42
105
|
return txnDetails === null || txnDetails === void 0 ? void 0 : txnDetails.projectId;
|
|
43
106
|
}
|
|
44
107
|
completeTransaction(txId) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
delete this.projectToTx[txnDetails.projectId];
|
|
108
|
+
const txDetails = this.detailsByTx[txId];
|
|
109
|
+
if (txDetails === undefined) {
|
|
110
|
+
throw new coded_error_1.CodedError(`Cannot complete transaction ${txId} since it doesn't exist!`, this.Errors.TRANSACTION_NOT_ONGOING);
|
|
49
111
|
}
|
|
112
|
+
txDetails.stop = new Date().toLocaleString();
|
|
113
|
+
logger_1.logger.info(`Completed transaction:\n${JSON.stringify(txDetails, null, 2)}`);
|
|
114
|
+
delete this.detailsByTx[txId];
|
|
115
|
+
delete this.detailsByProject[txDetails.projectId];
|
|
116
|
+
void this.liveUpdatesHandler.disableTransactionStatus({
|
|
117
|
+
txId
|
|
118
|
+
});
|
|
50
119
|
}
|
|
51
120
|
}
|
|
52
121
|
exports.TransactionManager = TransactionManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAC9C,uDAAmD;
|
|
1
|
+
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,79 +3,226 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const device_agent_schemas_1 = require("@alwaysai/device-agent-schemas");
|
|
4
4
|
const transaction_manager_1 = require("./transaction-manager");
|
|
5
5
|
const uuid_1 = require("uuid");
|
|
6
|
+
const publisher_1 = require("./publisher");
|
|
7
|
+
const mockClient = {
|
|
8
|
+
publish: jest.fn()
|
|
9
|
+
};
|
|
10
|
+
const clientId = 'test-client';
|
|
11
|
+
const mockLiveUpdatesHandler = {
|
|
12
|
+
enableTransactionStatus: jest.fn(),
|
|
13
|
+
disableTransactionStatus: jest.fn()
|
|
14
|
+
};
|
|
6
15
|
describe('Test Transaction Manager', () => {
|
|
7
16
|
let txnMgr;
|
|
17
|
+
let publisher;
|
|
18
|
+
const func_complete = jest
|
|
19
|
+
.fn()
|
|
20
|
+
.mockResolvedValue(true);
|
|
21
|
+
const func_incomplete = jest
|
|
22
|
+
.fn()
|
|
23
|
+
.mockResolvedValue(false);
|
|
8
24
|
beforeEach(() => {
|
|
9
|
-
|
|
25
|
+
publisher = new publisher_1.Publisher(mockClient, clientId);
|
|
26
|
+
txnMgr = new transaction_manager_1.TransactionManager(publisher, mockLiveUpdatesHandler);
|
|
10
27
|
jest.clearAllMocks();
|
|
11
28
|
});
|
|
12
29
|
function generateRandomProjectId() {
|
|
13
30
|
return (0, uuid_1.v4)();
|
|
14
31
|
}
|
|
15
|
-
test('
|
|
32
|
+
test('Start a new transaction', async () => {
|
|
16
33
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
17
34
|
const projectId = generateRandomProjectId();
|
|
18
|
-
txnMgr.
|
|
35
|
+
await txnMgr.runTransactionStep({
|
|
36
|
+
func: func_incomplete,
|
|
37
|
+
projectId,
|
|
38
|
+
txId,
|
|
39
|
+
start: true
|
|
40
|
+
});
|
|
19
41
|
expect(txnMgr.getProjectFromTransaction(txId)).toEqual(projectId);
|
|
20
42
|
expect(txnMgr.getTransactionFromProject(projectId)).toEqual(txId);
|
|
43
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(true);
|
|
44
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(true);
|
|
45
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
test('Start a new transaction which completes in one step', async () => {
|
|
48
|
+
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
49
|
+
const projectId = generateRandomProjectId();
|
|
50
|
+
await txnMgr.runTransactionStep({
|
|
51
|
+
func: func_complete,
|
|
52
|
+
projectId,
|
|
53
|
+
txId,
|
|
54
|
+
start: true
|
|
55
|
+
});
|
|
56
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(false);
|
|
57
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(false);
|
|
58
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(false);
|
|
59
|
+
const msg = JSON.parse(mockClient.publish.mock.calls[0][1]);
|
|
60
|
+
expect(msg.payload.status).toBe(device_agent_schemas_1.keyMirrors.statusResponse.success);
|
|
61
|
+
});
|
|
62
|
+
test('Start a new transaction and complete in second step', async () => {
|
|
63
|
+
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
64
|
+
const projectId = generateRandomProjectId();
|
|
65
|
+
await txnMgr.runTransactionStep({
|
|
66
|
+
func: func_incomplete,
|
|
67
|
+
projectId,
|
|
68
|
+
txId,
|
|
69
|
+
start: true,
|
|
70
|
+
stepName: 'step1'
|
|
71
|
+
});
|
|
72
|
+
await txnMgr.runTransactionStep({
|
|
73
|
+
func: func_complete,
|
|
74
|
+
projectId,
|
|
75
|
+
txId,
|
|
76
|
+
start: false,
|
|
77
|
+
stepName: 'step2'
|
|
78
|
+
});
|
|
79
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(false);
|
|
80
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(false);
|
|
81
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(false);
|
|
21
82
|
});
|
|
22
|
-
test('
|
|
83
|
+
test('Start multiple transactions for different projects', async () => {
|
|
23
84
|
const numTransactions = 3;
|
|
24
85
|
const projectTxIdList = [];
|
|
25
86
|
for (let i = 0; i < numTransactions; i++) {
|
|
26
87
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
27
88
|
const projectId = generateRandomProjectId();
|
|
28
|
-
txnMgr.
|
|
89
|
+
await txnMgr.runTransactionStep({
|
|
90
|
+
func: func_incomplete,
|
|
91
|
+
projectId,
|
|
92
|
+
txId,
|
|
93
|
+
start: true
|
|
94
|
+
});
|
|
29
95
|
projectTxIdList.push({ projectId, txId });
|
|
30
96
|
}
|
|
31
97
|
projectTxIdList.forEach(({ txId, projectId }) => {
|
|
32
98
|
expect(txnMgr.getProjectFromTransaction(txId)).toEqual(projectId);
|
|
33
99
|
expect(txnMgr.getTransactionFromProject(projectId)).toEqual(txId);
|
|
100
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(true);
|
|
101
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(true);
|
|
102
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(true);
|
|
34
103
|
});
|
|
35
104
|
});
|
|
36
|
-
test('Attempt to
|
|
105
|
+
test('Attempt to start an ongoing transaction, results in failure', async () => {
|
|
37
106
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
38
107
|
const projectId = generateRandomProjectId();
|
|
39
|
-
txnMgr.
|
|
108
|
+
await txnMgr.runTransactionStep({
|
|
109
|
+
func: func_incomplete,
|
|
110
|
+
projectId,
|
|
111
|
+
txId,
|
|
112
|
+
start: true,
|
|
113
|
+
stepName: 'step1'
|
|
114
|
+
});
|
|
40
115
|
try {
|
|
41
|
-
txnMgr.
|
|
42
|
-
|
|
116
|
+
await txnMgr.runTransactionStep({
|
|
117
|
+
func: func_incomplete,
|
|
118
|
+
projectId,
|
|
119
|
+
txId,
|
|
120
|
+
start: true,
|
|
121
|
+
stepName: 'step2'
|
|
122
|
+
});
|
|
123
|
+
throw new Error('Expected starting transaction to fail!');
|
|
43
124
|
}
|
|
44
|
-
catch (
|
|
45
|
-
console.log(
|
|
46
|
-
expect(
|
|
125
|
+
catch (e) {
|
|
126
|
+
console.log(e);
|
|
127
|
+
expect(e.code).toBe(txnMgr.Errors.TRANSACTION_ONGOING);
|
|
47
128
|
}
|
|
48
129
|
expect(txnMgr.getTransactionFromProject(projectId)).toEqual(txId);
|
|
49
130
|
expect(txnMgr.getProjectFromTransaction(txId)).toEqual(projectId);
|
|
50
131
|
});
|
|
51
|
-
test('Attempt to
|
|
132
|
+
test('Attempt to continue a transaction that is not ongoing', async () => {
|
|
133
|
+
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
134
|
+
const projectId = generateRandomProjectId();
|
|
135
|
+
try {
|
|
136
|
+
await txnMgr.runTransactionStep({
|
|
137
|
+
func: func_incomplete,
|
|
138
|
+
projectId,
|
|
139
|
+
txId,
|
|
140
|
+
start: false,
|
|
141
|
+
stepName: 'step1'
|
|
142
|
+
});
|
|
143
|
+
throw new Error('Expected continue transaction to fail!');
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
console.log(e);
|
|
147
|
+
expect(e.code).toBe(txnMgr.Errors.TRANSACTION_NOT_ONGOING);
|
|
148
|
+
}
|
|
149
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(false);
|
|
150
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(false);
|
|
151
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
test('Attempt to start a transaction for a project with an ongoing transaction, results in failure', async () => {
|
|
52
154
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
53
155
|
const txId2 = (0, device_agent_schemas_1.generateTxId)();
|
|
54
156
|
const projectId = generateRandomProjectId();
|
|
55
|
-
txnMgr.
|
|
157
|
+
await txnMgr.runTransactionStep({
|
|
158
|
+
func: func_incomplete,
|
|
159
|
+
projectId,
|
|
160
|
+
txId,
|
|
161
|
+
start: true,
|
|
162
|
+
stepName: 'step1'
|
|
163
|
+
});
|
|
56
164
|
try {
|
|
57
|
-
txnMgr.
|
|
58
|
-
|
|
165
|
+
await txnMgr.runTransactionStep({
|
|
166
|
+
func: func_incomplete,
|
|
167
|
+
projectId,
|
|
168
|
+
txId: txId2,
|
|
169
|
+
start: true,
|
|
170
|
+
stepName: 'step2'
|
|
171
|
+
});
|
|
172
|
+
throw new Error('Expected start transaction to fail!');
|
|
59
173
|
}
|
|
60
|
-
catch (
|
|
61
|
-
console.log(
|
|
62
|
-
expect(
|
|
174
|
+
catch (e) {
|
|
175
|
+
console.log(e);
|
|
176
|
+
expect(e.code).toBe(txnMgr.Errors.PROJECT_ONGOING);
|
|
63
177
|
}
|
|
64
178
|
expect(txnMgr.getTransactionFromProject(projectId)).toEqual(txId);
|
|
65
179
|
expect(txnMgr.getProjectFromTransaction(txId)).toEqual(projectId);
|
|
66
180
|
expect(txnMgr.getProjectFromTransaction(txId2)).toBeUndefined();
|
|
67
181
|
});
|
|
68
|
-
test('
|
|
182
|
+
test('Handle error in step function', async () => {
|
|
69
183
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
70
184
|
const projectId = generateRandomProjectId();
|
|
71
|
-
txnMgr.
|
|
185
|
+
await txnMgr.runTransactionStep({
|
|
186
|
+
func: jest.fn().mockImplementation(() => {
|
|
187
|
+
throw new Error('Test error!');
|
|
188
|
+
}),
|
|
189
|
+
projectId,
|
|
190
|
+
txId,
|
|
191
|
+
start: true,
|
|
192
|
+
stepName: 'step1'
|
|
193
|
+
});
|
|
194
|
+
expect(txnMgr.isOngoingTransaction(txId)).toBe(false);
|
|
195
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(false);
|
|
196
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(false);
|
|
197
|
+
const msg = JSON.parse(mockClient.publish.mock.calls[0][1]);
|
|
198
|
+
expect(msg.payload.status).toBe(device_agent_schemas_1.keyMirrors.statusResponse.failure);
|
|
199
|
+
});
|
|
200
|
+
test('Complete ongoing transaction', async () => {
|
|
201
|
+
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
202
|
+
const projectId = generateRandomProjectId();
|
|
203
|
+
await txnMgr.runTransactionStep({
|
|
204
|
+
func: func_incomplete,
|
|
205
|
+
projectId,
|
|
206
|
+
txId,
|
|
207
|
+
start: true,
|
|
208
|
+
stepName: 'step1'
|
|
209
|
+
});
|
|
72
210
|
txnMgr.completeTransaction(txId);
|
|
73
211
|
expect(txnMgr.getTransactionFromProject(projectId)).toBeUndefined();
|
|
74
212
|
expect(txnMgr.getProjectFromTransaction(txId)).toBeUndefined();
|
|
213
|
+
expect(txnMgr.isOngoingTransactionForProjectID(projectId)).toBe(false);
|
|
214
|
+
expect(txnMgr.isAnyOngoingTransaction()).toBe(false);
|
|
75
215
|
});
|
|
76
216
|
test('Test remove non-existing transaction from queue', async () => {
|
|
77
217
|
const txId = (0, device_agent_schemas_1.generateTxId)();
|
|
78
|
-
|
|
218
|
+
try {
|
|
219
|
+
txnMgr.completeTransaction(txId);
|
|
220
|
+
throw new Error('Expected completTransaction to fail!');
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
console.log(e);
|
|
224
|
+
expect(e.code).toBe(txnMgr.Errors.TRANSACTION_NOT_ONGOING);
|
|
225
|
+
}
|
|
79
226
|
expect(txnMgr.getProjectFromTransaction(txId)).toBeUndefined();
|
|
80
227
|
});
|
|
81
228
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.test.js","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.test.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"transaction-manager.test.js","sourceRoot":"","sources":["../../src/cloud-connection/transaction-manager.test.ts"],"names":[],"mappings":";;AAAA,yEAIwC;AACxC,+DAA2D;AAC3D,+BAAoC;AACpC,2CAAwC;AAGxC,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;CACnB,CAAC;AACF,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B,MAAM,sBAAsB,GAAG;IAC7B,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE;IAClC,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE;CACP,CAAC;AAE/B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,MAA0B,CAAC;IAC/B,IAAI,SAAoB,CAAC;IACzB,MAAM,aAAa,GAA2B,IAAI;SAC/C,EAAE,EAAE;SACJ,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,eAAe,GAA2B,IAAI;SACjD,EAAE,EAAE;SACJ,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,IAAI,qBAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,IAAI,wCAAkB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;QACnE,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,uBAAuB;QAC9B,OAAO,IAAA,SAAM,GAAE,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,eAAe;YACrB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,GAAG,GAAkC,IAAI,CAAC,KAAK,CACnD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpC,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,eAAe;YACrB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,aAAa;YACnB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,eAAe,GAAG,CAAC,CAAC;QAC1B,MAAM,eAAe,GAAQ,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;YAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,IAAI;gBACJ,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SAC3C;QACD,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;YAC9C,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,eAAe;YACrB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI;YACF,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,IAAI;gBACJ,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;SAC3D;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;SACxD;QACD,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,IAAI;YACF,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,IAAI;gBACJ,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;SAC3D;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;SAC5D;QACD,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC9G,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,eAAe;YACrB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI;YACF,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SACxD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;SACpD;QACD,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC,CAAC;YACF,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,GAAG,GAAkC,IAAI,CAAC,KAAK,CACnD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpC,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iCAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;QAC5C,MAAM,MAAM,CAAC,kBAAkB,CAAC;YAC9B,IAAI,EAAE,eAAe;YACrB,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,IAAI,GAAG,IAAA,mCAAY,GAAE,CAAC;QAC5B,IAAI;YACF,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;SACzD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;SAC5D;QAED,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export declare type SecureTunnelPortInfo = {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
type: string;
|
|
4
|
+
ip: string;
|
|
5
|
+
port: number;
|
|
6
|
+
};
|
|
7
|
+
export declare type SecureTunnelShadowDesRep = {
|
|
8
|
+
st_ports: SecureTunnelPortInfo[];
|
|
9
|
+
};
|
|
10
|
+
export declare type SecureTunnelShadowState = {
|
|
11
|
+
reported?: SecureTunnelShadowDesRep;
|
|
12
|
+
desired?: SecureTunnelShadowDesRep;
|
|
13
|
+
};
|
|
14
|
+
export declare type SecureTunnelShadowUpdateDelta = {
|
|
15
|
+
version: number;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
state: SecureTunnelShadowDesRep;
|
|
18
|
+
metadata?: any;
|
|
19
|
+
};
|
|
20
|
+
export declare type SecureTunnelShadowUpdate = {
|
|
21
|
+
version: number;
|
|
22
|
+
state: SecureTunnelShadowState;
|
|
23
|
+
};
|
|
24
|
+
declare type SecureTunnelNotificationType = {
|
|
25
|
+
clientAccessToken: string;
|
|
26
|
+
region: string;
|
|
27
|
+
services: string[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Handles Secure Tunnel Shadow State
|
|
31
|
+
*/
|
|
32
|
+
export declare class SecureTunnelHandlerSingleton {
|
|
33
|
+
private static instance;
|
|
34
|
+
private reported;
|
|
35
|
+
private httpProxyMap;
|
|
36
|
+
private localproxyInfo;
|
|
37
|
+
/**
|
|
38
|
+
* Initializes private variables of SecureTunnel handler.
|
|
39
|
+
* private constructor to prevent instantiation from outside
|
|
40
|
+
*/
|
|
41
|
+
private constructor();
|
|
42
|
+
/**
|
|
43
|
+
* Implements the Singleton of the SecureTunnel
|
|
44
|
+
*/
|
|
45
|
+
static getInstance(): SecureTunnelHandlerSingleton;
|
|
46
|
+
/**
|
|
47
|
+
* Stops all proxies started before
|
|
48
|
+
*/
|
|
49
|
+
destroy(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Returns current state of SecureTunnel shadow
|
|
52
|
+
* @returns {SecureTunnelShadowDesRep} - reported state of the SecureTunnel shadow
|
|
53
|
+
*/
|
|
54
|
+
getSecureTunnelShadow(): SecureTunnelShadowDesRep;
|
|
55
|
+
/**
|
|
56
|
+
* Updates current state of SecureTunnel shadow
|
|
57
|
+
* @param {SecureTunnelShadowUpdateDelta} deltaMsg - delta message, which includes desired state of the SecureTunnel shadow
|
|
58
|
+
* @return {SecureTunnelShadowDesRep} update reported message to send back to AWS IoT device shadow
|
|
59
|
+
*/
|
|
60
|
+
syncShadowToDeviceState(deltaMsg: SecureTunnelShadowUpdateDelta): Promise<SecureTunnelShadowDesRep>;
|
|
61
|
+
/**
|
|
62
|
+
* Starts SecureTunnel
|
|
63
|
+
* @param {SecureTunnelNotificationType} message - AWS notification received
|
|
64
|
+
*/
|
|
65
|
+
secureTunnelNotifyHandler(message: SecureTunnelNotificationType): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Removes reported ports which are do not exist in desired
|
|
68
|
+
* @param {SecureTunnelPortInfo[]} desiredPorts - desired port config
|
|
69
|
+
*/
|
|
70
|
+
private CleanupReportedPorts;
|
|
71
|
+
/**
|
|
72
|
+
* Starts port proxy mapping process
|
|
73
|
+
* @param {SecureTunnelPortInfo} portInfo - port info to start the port mapping process for
|
|
74
|
+
*/
|
|
75
|
+
private startProxyMapping;
|
|
76
|
+
/**
|
|
77
|
+
* Stops port proxy mapping process
|
|
78
|
+
* @param {SecureTunnelPortInfo} portInfo - port info to stop the port mapping process for
|
|
79
|
+
*/
|
|
80
|
+
private stopProxyMapping;
|
|
81
|
+
/**
|
|
82
|
+
* Starts SecureTunnel localproxy process
|
|
83
|
+
*/
|
|
84
|
+
private startLocalproxy;
|
|
85
|
+
/**
|
|
86
|
+
* Stops SecureTunnel localproxy process
|
|
87
|
+
*/
|
|
88
|
+
private stopLocalproxy;
|
|
89
|
+
/**
|
|
90
|
+
* processes and validate notify message
|
|
91
|
+
* @param {string[]} message - message, which contains: clientAccessToken, region, services
|
|
92
|
+
*/
|
|
93
|
+
private processNotifyMessage;
|
|
94
|
+
/**
|
|
95
|
+
* Downloads SecureTunnel localproxy, if it was not downloaded before
|
|
96
|
+
*/
|
|
97
|
+
private downloadSecureTunnel;
|
|
98
|
+
/**
|
|
99
|
+
* Gets next available localhost port
|
|
100
|
+
*/
|
|
101
|
+
private getNextAvailablePort;
|
|
102
|
+
private sortPorts;
|
|
103
|
+
}
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=secure-tunneling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-tunneling.d.ts","sourceRoot":"","sources":["../../src/secure-tunneling/secure-tunneling.ts"],"names":[],"mappings":"AAsBA,oBAAY,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,oBAAY,wBAAwB,GAAG;IACrC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC,CAAC;AAEF,oBAAY,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC,CAAC;AAEF,oBAAY,6BAA6B,GAAG;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,wBAAwB,CAAC;IAChC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB,CAAC;AAEF,oBAAY,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAsBF,aAAK,4BAA4B,GAAG;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAMF;;GAEG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;OAGG;IACH,OAAO;IAqBP;;OAEG;WACW,WAAW,IAAI,4BAA4B;IAUzD;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrC;;;OAGG;IACI,qBAAqB,IAAI,wBAAwB;IAOxD;;;;OAIG;IACU,uBAAuB,CAClC,QAAQ,EAAE,6BAA6B,GACtC,OAAO,CAAC,wBAAwB,CAAC;IA0DpC;;;OAGG;IACU,yBAAyB,CACpC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC;IAmBhB;;;OAGG;YACW,oBAAoB;IAkClC;;;OAGG;YACW,iBAAiB;IA+C/B;;;OAGG;YACW,gBAAgB;IA2C9B;;OAEG;YACW,eAAe;IAuB7B;;OAEG;YACW,cAAc;IA4B5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmF5B;;OAEG;YACW,oBAAoB;IA8BlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,SAAS;CAmBlB"}
|