Skip to content

Commit b9c01ed

Browse files
authored
✨ (dmk) [DSDK-489]: Add WebSocket data source (#608)
2 parents 1c2a424 + 1153a78 commit b9c01ed

29 files changed

+576
-124
lines changed

.changeset/purple-ears-drop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ledgerhq/device-management-kit": minor
3+
---
4+
5+
Add WebSocket data source

packages/device-management-kit/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@
3737
"axios": "^1.7.9",
3838
"inversify": "^6.2.1",
3939
"inversify-logger-middleware": "^3.1.0",
40+
"isomorphic-ws": "^5.0.0",
4041
"purify-ts": "^2.1.0",
4142
"reflect-metadata": "^0.2.2",
4243
"semver": "^7.6.3",
4344
"uuid": "^11.0.3",
45+
"ws": "^8.18.0",
4446
"xstate": "^5.19.1"
4547
},
4648
"peerDependencies": {
@@ -54,6 +56,7 @@
5456
"@ledgerhq/tsconfig-dsdk": "workspace:*",
5557
"@types/semver": "^7.5.8",
5658
"@types/uuid": "^10.0.0",
59+
"@types/ws": "^8.5.13",
5760
"rxjs": "^7.8.1",
5861
"ts-node": "^10.9.2"
5962
}

packages/device-management-kit/src/api/DeviceManagementKit.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describe("DeviceManagementKit", () => {
2727
config: {
2828
managerApiUrl: "http://fake.url",
2929
mockUrl: "http://fake-mock.url",
30+
webSocketUrl: "http://fake-websocket.url",
3031
},
3132
});
3233
});
@@ -85,6 +86,7 @@ describe("DeviceManagementKit", () => {
8586
config: {
8687
managerApiUrl: "http://fake.url",
8788
mockUrl: "http://fake-mock.url",
89+
webSocketUrl: "http://fake-websocket.url",
8890
},
8991
});
9092
});

packages/device-management-kit/src/api/DeviceManagementKitBuilder.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
DEFAULT_MANAGER_API_BASE_URL,
33
DEFAULT_MOCK_SERVER_BASE_URL,
4+
DEFAULT_WEB_SOCKET_BASE_URL,
45
} from "@internal/manager-api/model/Const";
56

67
import { type LoggerSubscriberService } from "./logger-subscriber/service/LoggerSubscriberService";
@@ -28,6 +29,7 @@ export class DeviceManagementKitBuilder {
2829
private config: DmkConfig = {
2930
managerApiUrl: DEFAULT_MANAGER_API_BASE_URL,
3031
mockUrl: DEFAULT_MOCK_SERVER_BASE_URL,
32+
webSocketUrl: DEFAULT_WEB_SOCKET_BASE_URL,
3133
};
3234

3335
build(): DeviceManagementKit {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export type DmkConfig = {
22
mockUrl: string;
33
managerApiUrl: string;
4+
webSocketUrl: string;
45
};

packages/device-management-kit/src/api/command/use-case/SendCommandUseCase.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Left } from "purify-ts";
22

33
import { type Command } from "@api/command/Command";
44
import { CommandResultStatus } from "@api/command/model/CommandResult";
5+
import { type DmkConfig } from "@api/DmkConfig";
56
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
67
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
78
import { DefaultDeviceSessionService } from "@internal/device-session/service/DefaultDeviceSessionService";
@@ -25,10 +26,7 @@ describe("SendCommandUseCase", () => {
2526
beforeEach(() => {
2627
logger = new DefaultLoggerPublisherService([], "send-command-use-case");
2728
sessionService = new DefaultDeviceSessionService(() => logger);
28-
managerApiDataSource = new AxiosManagerApiDataSource({
29-
managerApiUrl: "http://fake.url",
30-
mockUrl: "http://fake-mock.url",
31-
});
29+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
3230
managerApi = new DefaultManagerApiService(managerApiDataSource);
3331
command = {
3432
getApdu: jest.fn(),

packages/device-management-kit/src/api/device-session/use-case/ToggleDeviceSessionRefresher.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type DmkConfig } from "@api/DmkConfig";
12
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
23
import { type DeviceSession } from "@internal/device-session/model/DeviceSession";
34
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
@@ -24,10 +25,7 @@ describe("ToggleDeviceSessionRefresherUseCase", () => {
2425
);
2526
sessionService = new DefaultDeviceSessionService(() => logger);
2627
managerApi = new DefaultManagerApiService(
27-
new AxiosManagerApiDataSource({
28-
managerApiUrl: "http://fake.url",
29-
mockUrl: "http://fake-mock.url",
30-
}),
28+
new AxiosManagerApiDataSource({} as DmkConfig),
3129
);
3230
});
3331

packages/device-management-kit/src/di.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { managerApiModuleFactory } from "@internal/manager-api/di/managerApiModu
1616
import {
1717
DEFAULT_MANAGER_API_BASE_URL,
1818
DEFAULT_MOCK_SERVER_BASE_URL,
19+
DEFAULT_WEB_SOCKET_BASE_URL,
1920
} from "@internal/manager-api/model/Const";
2021
import { sendModuleFactory } from "@internal/send/di/sendModule";
2122
import { transportModuleFactory } from "@internal/transport//di/transportModule";
@@ -35,8 +36,9 @@ export const makeContainer = ({
3536
transports = [],
3637
loggers = [],
3738
config = {
38-
managerApiUrl: DEFAULT_MANAGER_API_BASE_URL,
3939
mockUrl: DEFAULT_MOCK_SERVER_BASE_URL,
40+
managerApiUrl: DEFAULT_MANAGER_API_BASE_URL,
41+
webSocketUrl: DEFAULT_WEB_SOCKET_BASE_URL,
4042
},
4143
}: Partial<MakeContainerProps>) => {
4244
const container = new Container();

packages/device-management-kit/src/internal/device-session/service/DefaultDeviceSessionService.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Either, Left } from "purify-ts";
22
import { Observable } from "rxjs";
33

4+
import { type DmkConfig } from "@api/DmkConfig";
45
import { type DeviceSession } from "@internal/device-session/model/DeviceSession";
56
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
67
import { DeviceSessionNotFound } from "@internal/device-session/model/Errors";
@@ -25,10 +26,7 @@ describe("DefaultDeviceSessionService", () => {
2526
jest.restoreAllMocks();
2627
loggerService = new DefaultLoggerPublisherService([], "deviceSession");
2728
sessionService = new DefaultDeviceSessionService(() => loggerService);
28-
managerApiDataSource = new AxiosManagerApiDataSource({
29-
managerApiUrl: "http://fake.url",
30-
mockUrl: "http://fake-mock.url",
31-
});
29+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
3230
managerApi = new DefaultManagerApiService(managerApiDataSource);
3331

3432
deviceSession = deviceSessionStubBuilder(

packages/device-management-kit/src/internal/device-session/use-case/CloseSessionsUseCase.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type DmkConfig } from "@api/DmkConfig";
12
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
23
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
34
import { DefaultDeviceSessionService } from "@internal/device-session/service/DefaultDeviceSessionService";
@@ -20,10 +21,7 @@ describe("CloseSessionsUseCase", () => {
2021
[],
2122
"close-sessions-use-case-test",
2223
);
23-
managerApiDataSource = new AxiosManagerApiDataSource({
24-
managerApiUrl: "http://fake.url",
25-
mockUrl: "http://fake-mock.url",
26-
});
24+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
2725
managerApi = new DefaultManagerApiService(managerApiDataSource);
2826
sessionService = new DefaultDeviceSessionService(() => logger);
2927
});

packages/device-management-kit/src/internal/device-session/use-case/GetDeviceSessionStateUseCase.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type DmkConfig } from "@api/DmkConfig";
12
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
23
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
34
import { DeviceSessionNotFound } from "@internal/device-session/model/Errors";
@@ -26,10 +27,7 @@ describe("GetDeviceSessionStateUseCase", () => {
2627
[],
2728
"get-connected-device-use-case-test",
2829
);
29-
managerApiDataSource = new AxiosManagerApiDataSource({
30-
managerApiUrl: "http://fake.url",
31-
mockUrl: "http://fake-mock.url",
32-
});
30+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
3331
managerApi = new DefaultManagerApiService(managerApiDataSource);
3432
sessionService = new DefaultDeviceSessionService(() => logger);
3533
});

packages/device-management-kit/src/internal/discovery/di/discoveryModule.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ describe("discoveryModuleFactory", () => {
3939
config: {
4040
managerApiUrl: "http://fake.url",
4141
mockUrl: "http://fake-mock.url",
42+
webSocketUrl: "http://fake-websocket.url",
4243
},
4344
}),
4445
);

packages/device-management-kit/src/internal/discovery/use-case/ConnectUseCase.test.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { TransportMock } from "@api/transport/model/__mocks__/TransportMock";
66
import { type DiscoveredDevice } from "@api/transport/model/DiscoveredDevice";
77
import { UnknownDeviceError } from "@api/transport/model/Errors";
88
import { connectedDeviceStubBuilder } from "@api/transport/model/TransportConnectedDevice.stub";
9-
import { type Transport } from "@api/types";
9+
import type { DmkConfig, Transport } from "@api/types";
1010
import { DefaultDeviceSessionService } from "@internal/device-session/service/DefaultDeviceSessionService";
1111
import { type DeviceSessionService } from "@internal/device-session/service/DeviceSessionService";
1212
import { DefaultLoggerPublisherService } from "@internal/logger-publisher/service/DefaultLoggerPublisherService";
@@ -48,10 +48,7 @@ describe("ConnectUseCase", () => {
4848
logger = new DefaultLoggerPublisherService([], tag);
4949
transport = new TransportMock();
5050
sessionService = new DefaultDeviceSessionService(() => logger);
51-
managerApiDataSource = new AxiosManagerApiDataSource({
52-
managerApiUrl: "http://fake.url",
53-
mockUrl: "http://fake-mock.url",
54-
});
51+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
5552
managerApi = new DefaultManagerApiService(managerApiDataSource);
5653
// @ts-expect-error mock
5754
transportService = new DefaultTransportService();

packages/device-management-kit/src/internal/discovery/use-case/DisconnectUseCase.test.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Left, Maybe, Right } from "purify-ts";
33
import { TransportMock } from "@api/transport/model/__mocks__/TransportMock";
44
import { DisconnectError } from "@api/transport/model/Errors";
55
import { connectedDeviceStubBuilder } from "@api/transport/model/TransportConnectedDevice.stub";
6-
import { type Transport } from "@api/types";
6+
import type { DmkConfig, Transport } from "@api/types";
77
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
88
import { DeviceSessionNotFound } from "@internal/device-session/model/Errors";
99
import { DefaultDeviceSessionService } from "@internal/device-session/service/DefaultDeviceSessionService";
@@ -49,10 +49,7 @@ describe("DisconnectUseCase", () => {
4949
it("should disconnect from a device", async () => {
5050
// Given
5151
const connectedDevice = connectedDeviceStubBuilder();
52-
managerApiDataSource = new AxiosManagerApiDataSource({
53-
managerApiUrl: "http://fake.url",
54-
mockUrl: "http://fake-mock.url",
55-
});
52+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
5653
managerApi = new DefaultManagerApiService(managerApiDataSource);
5754
const deviceSession = deviceSessionStubBuilder(
5855
{

packages/device-management-kit/src/internal/discovery/use-case/GetConnectedDeviceUseCase.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type DmkConfig } from "@api/DmkConfig";
12
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
23
import { ConnectedDevice } from "@api/transport/model/ConnectedDevice";
34
import { deviceSessionStubBuilder } from "@internal/device-session/model/DeviceSession.stub";
@@ -26,10 +27,7 @@ describe("GetConnectedDevice", () => {
2627
[],
2728
"get-connected-device-use-case",
2829
);
29-
managerApiDataSource = new AxiosManagerApiDataSource({
30-
managerApiUrl: "http://fake.url",
31-
mockUrl: "http://fake-mock.url",
32-
});
30+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
3331
managerApi = new DefaultManagerApiService(managerApiDataSource);
3432
sessionService = new DefaultDeviceSessionService(() => logger);
3533
});

packages/device-management-kit/src/internal/discovery/use-case/ListConnectedDevicesUseCase.test.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { AxiosManagerApiDataSource } from "@internal/manager-api/data/AxiosManag
88
import { type ManagerApiDataSource } from "@internal/manager-api/data/ManagerApiDataSource";
99
import { DefaultManagerApiService } from "@internal/manager-api/service/DefaultManagerApiService";
1010
import { type ManagerApiService } from "@internal/manager-api/service/ManagerApiService";
11-
import { ConnectedDevice } from "@root/src";
11+
import { ConnectedDevice, type DmkConfig } from "@root/src";
1212

1313
let logger: LoggerPublisherService;
1414
let sessionService: DeviceSessionService;
@@ -21,10 +21,7 @@ describe("ListDeviceSessionsUseCase", () => {
2121
[],
2222
"list-device-sessions-use-case-test",
2323
);
24-
managerApiDataSource = new AxiosManagerApiDataSource({
25-
managerApiUrl: "http://fake.url",
26-
mockUrl: "http://fake-mock.url",
27-
});
24+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
2825
managerApi = new DefaultManagerApiService(managerApiDataSource);
2926
sessionService = new DefaultDeviceSessionService(() => logger);
3027
});

packages/device-management-kit/src/internal/discovery/use-case/ListenToConnectedDeviceUseCase.test.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type DmkConfig } from "@api/DmkConfig";
12
import { type LoggerPublisherService } from "@api/logger-publisher/service/LoggerPublisherService";
23
import { ConnectedDevice } from "@api/transport/model/ConnectedDevice";
34
import { connectedDeviceStubBuilder } from "@api/transport/model/TransportConnectedDevice.stub";
@@ -26,10 +27,7 @@ describe("ListenToConnectedDevice", () => {
2627
[],
2728
"listen-to-connected-device-use-case",
2829
);
29-
managerApiDataSource = new AxiosManagerApiDataSource({
30-
managerApiUrl: "http://fake.url",
31-
mockUrl: "http://fake-mock.url",
32-
});
30+
managerApiDataSource = new AxiosManagerApiDataSource({} as DmkConfig);
3331
managerApi = new DefaultManagerApiService(managerApiDataSource);
3432
sessionService = new DefaultDeviceSessionService(() => logger);
3533
});

0 commit comments

Comments
 (0)