@usarral/century-link-ts 0.1.0
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/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/CenturyLink.d.ts +53 -0
- package/dist/CenturyLink.d.ts.map +1 -0
- package/dist/CenturyLink.js +103 -0
- package/dist/CenturyLink.js.map +1 -0
- package/dist/application/result/ElegooError.d.ts +7 -0
- package/dist/application/result/ElegooError.d.ts.map +1 -0
- package/dist/application/result/ElegooError.js +11 -0
- package/dist/application/result/ElegooError.js.map +1 -0
- package/dist/application/result/Result.d.ts +12 -0
- package/dist/application/result/Result.d.ts.map +1 -0
- package/dist/application/result/Result.js +12 -0
- package/dist/application/result/Result.js.map +1 -0
- package/dist/application/result/Result.test.d.ts +2 -0
- package/dist/application/result/Result.test.d.ts.map +1 -0
- package/dist/application/result/Result.test.js +46 -0
- package/dist/application/result/Result.test.js.map +1 -0
- package/dist/application/use-cases/ConnectPrinterUseCase.d.ts +9 -0
- package/dist/application/use-cases/ConnectPrinterUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/ConnectPrinterUseCase.js +10 -0
- package/dist/application/use-cases/ConnectPrinterUseCase.js.map +1 -0
- package/dist/application/use-cases/DiscoverPrintersUseCase.d.ts +8 -0
- package/dist/application/use-cases/DiscoverPrintersUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/DiscoverPrintersUseCase.js +36 -0
- package/dist/application/use-cases/DiscoverPrintersUseCase.js.map +1 -0
- package/dist/application/use-cases/GetFileListUseCase.d.ts +9 -0
- package/dist/application/use-cases/GetFileListUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/GetFileListUseCase.js +10 -0
- package/dist/application/use-cases/GetFileListUseCase.js.map +1 -0
- package/dist/application/use-cases/GetPrinterStatusUseCase.d.ts +9 -0
- package/dist/application/use-cases/GetPrinterStatusUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/GetPrinterStatusUseCase.js +10 -0
- package/dist/application/use-cases/GetPrinterStatusUseCase.js.map +1 -0
- package/dist/application/use-cases/PausePrintUseCase.d.ts +8 -0
- package/dist/application/use-cases/PausePrintUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/PausePrintUseCase.js +10 -0
- package/dist/application/use-cases/PausePrintUseCase.js.map +1 -0
- package/dist/application/use-cases/ResumePrintUseCase.d.ts +8 -0
- package/dist/application/use-cases/ResumePrintUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/ResumePrintUseCase.js +10 -0
- package/dist/application/use-cases/ResumePrintUseCase.js.map +1 -0
- package/dist/application/use-cases/StartPrintUseCase.d.ts +8 -0
- package/dist/application/use-cases/StartPrintUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/StartPrintUseCase.js +10 -0
- package/dist/application/use-cases/StartPrintUseCase.js.map +1 -0
- package/dist/application/use-cases/StopPrintUseCase.d.ts +8 -0
- package/dist/application/use-cases/StopPrintUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/StopPrintUseCase.js +10 -0
- package/dist/application/use-cases/StopPrintUseCase.js.map +1 -0
- package/dist/application/use-cases/UploadFileUseCase.d.ts +8 -0
- package/dist/application/use-cases/UploadFileUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/UploadFileUseCase.js +10 -0
- package/dist/application/use-cases/UploadFileUseCase.js.map +1 -0
- package/dist/domain/entities/DiscoveredPrinter.d.ts +14 -0
- package/dist/domain/entities/DiscoveredPrinter.d.ts.map +1 -0
- package/dist/domain/entities/DiscoveredPrinter.js +2 -0
- package/dist/domain/entities/DiscoveredPrinter.js.map +1 -0
- package/dist/domain/entities/FileInfo.d.ts +26 -0
- package/dist/domain/entities/FileInfo.d.ts.map +1 -0
- package/dist/domain/entities/FileInfo.js +2 -0
- package/dist/domain/entities/FileInfo.js.map +1 -0
- package/dist/domain/entities/PrintTask.d.ts +17 -0
- package/dist/domain/entities/PrintTask.d.ts.map +1 -0
- package/dist/domain/entities/PrintTask.js +2 -0
- package/dist/domain/entities/PrintTask.js.map +1 -0
- package/dist/domain/entities/PrinterAttributes.d.ts +44 -0
- package/dist/domain/entities/PrinterAttributes.d.ts.map +1 -0
- package/dist/domain/entities/PrinterAttributes.js +2 -0
- package/dist/domain/entities/PrinterAttributes.js.map +1 -0
- package/dist/domain/entities/PrinterInfo.d.ts +16 -0
- package/dist/domain/entities/PrinterInfo.d.ts.map +1 -0
- package/dist/domain/entities/PrinterInfo.js +2 -0
- package/dist/domain/entities/PrinterInfo.js.map +1 -0
- package/dist/domain/entities/PrinterStatus.d.ts +86 -0
- package/dist/domain/entities/PrinterStatus.d.ts.map +1 -0
- package/dist/domain/entities/PrinterStatus.js +2 -0
- package/dist/domain/entities/PrinterStatus.js.map +1 -0
- package/dist/domain/events/PrinterAttributesEvent.d.ts +7 -0
- package/dist/domain/events/PrinterAttributesEvent.d.ts.map +1 -0
- package/dist/domain/events/PrinterAttributesEvent.js +2 -0
- package/dist/domain/events/PrinterAttributesEvent.js.map +1 -0
- package/dist/domain/events/PrinterConnectionEvent.d.ts +6 -0
- package/dist/domain/events/PrinterConnectionEvent.d.ts.map +1 -0
- package/dist/domain/events/PrinterConnectionEvent.js +2 -0
- package/dist/domain/events/PrinterConnectionEvent.js.map +1 -0
- package/dist/domain/events/PrinterStatusEvent.d.ts +7 -0
- package/dist/domain/events/PrinterStatusEvent.d.ts.map +1 -0
- package/dist/domain/events/PrinterStatusEvent.js +2 -0
- package/dist/domain/events/PrinterStatusEvent.js.map +1 -0
- package/dist/domain/ports/DiscoveryAdapter.d.ts +10 -0
- package/dist/domain/ports/DiscoveryAdapter.d.ts.map +1 -0
- package/dist/domain/ports/DiscoveryAdapter.js +2 -0
- package/dist/domain/ports/DiscoveryAdapter.js.map +1 -0
- package/dist/domain/ports/EventBus.d.ts +8 -0
- package/dist/domain/ports/EventBus.d.ts.map +1 -0
- package/dist/domain/ports/EventBus.js +2 -0
- package/dist/domain/ports/EventBus.js.map +1 -0
- package/dist/domain/ports/FileAdapter.d.ts +26 -0
- package/dist/domain/ports/FileAdapter.d.ts.map +1 -0
- package/dist/domain/ports/FileAdapter.js +2 -0
- package/dist/domain/ports/FileAdapter.js.map +1 -0
- package/dist/domain/ports/PrinterAdapter.d.ts +74 -0
- package/dist/domain/ports/PrinterAdapter.d.ts.map +1 -0
- package/dist/domain/ports/PrinterAdapter.js +2 -0
- package/dist/domain/ports/PrinterAdapter.js.map +1 -0
- package/dist/domain/types/ErrorCode.d.ts +43 -0
- package/dist/domain/types/ErrorCode.d.ts.map +1 -0
- package/dist/domain/types/ErrorCode.js +49 -0
- package/dist/domain/types/ErrorCode.js.map +1 -0
- package/dist/domain/types/PrinterState.d.ts +24 -0
- package/dist/domain/types/PrinterState.d.ts.map +1 -0
- package/dist/domain/types/PrinterState.js +25 -0
- package/dist/domain/types/PrinterState.js.map +1 -0
- package/dist/domain/types/PrinterSubState.d.ts +59 -0
- package/dist/domain/types/PrinterSubState.d.ts.map +1 -0
- package/dist/domain/types/PrinterSubState.js +73 -0
- package/dist/domain/types/PrinterSubState.js.map +1 -0
- package/dist/domain/types/PrinterType.d.ts +8 -0
- package/dist/domain/types/PrinterType.d.ts.map +1 -0
- package/dist/domain/types/PrinterType.js +9 -0
- package/dist/domain/types/PrinterType.js.map +1 -0
- package/dist/domain/value-objects/PrinterId.d.ts +7 -0
- package/dist/domain/value-objects/PrinterId.d.ts.map +1 -0
- package/dist/domain/value-objects/PrinterId.js +6 -0
- package/dist/domain/value-objects/PrinterId.js.map +1 -0
- package/dist/domain/value-objects/Progress.d.ts +9 -0
- package/dist/domain/value-objects/Progress.d.ts.map +1 -0
- package/dist/domain/value-objects/Progress.js +4 -0
- package/dist/domain/value-objects/Progress.js.map +1 -0
- package/dist/domain/value-objects/Temperature.d.ts +8 -0
- package/dist/domain/value-objects/Temperature.d.ts.map +1 -0
- package/dist/domain/value-objects/Temperature.js +4 -0
- package/dist/domain/value-objects/Temperature.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.d.ts +6 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.js +39 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.d.ts +16 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.js +87 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.d.ts +47 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.js +332 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.d.ts +36 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.js +59 -0
- package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.d.ts +6 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.js +41 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.d.ts +16 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.js +117 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.d.ts +50 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.js +410 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.d.ts +81 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.js +116 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.js.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.d.ts +2 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.d.ts.map +1 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.js +59 -0
- package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.js.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.d.ts +16 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.js +137 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.d.ts +52 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.js +303 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.d.ts +37 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.d.ts.map +1 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.js +84 -0
- package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.js.map +1 -0
- package/dist/infrastructure/factory/PrinterAdapterFactory.d.ts +12 -0
- package/dist/infrastructure/factory/PrinterAdapterFactory.d.ts.map +1 -0
- package/dist/infrastructure/factory/PrinterAdapterFactory.js +42 -0
- package/dist/infrastructure/factory/PrinterAdapterFactory.js.map +1 -0
- package/dist/infrastructure/transport/Transport.d.ts +19 -0
- package/dist/infrastructure/transport/Transport.d.ts.map +1 -0
- package/dist/infrastructure/transport/Transport.js +2 -0
- package/dist/infrastructure/transport/Transport.js.map +1 -0
- package/dist/infrastructure/transport/http/HttpClient.d.ts +23 -0
- package/dist/infrastructure/transport/http/HttpClient.d.ts.map +1 -0
- package/dist/infrastructure/transport/http/HttpClient.js +73 -0
- package/dist/infrastructure/transport/http/HttpClient.js.map +1 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.d.ts +46 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.d.ts.map +1 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.js +41 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.js.map +1 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.test.d.ts +2 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.test.d.ts.map +1 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.test.js +48 -0
- package/dist/infrastructure/transport/mqtt/CcV2Codec.test.js.map +1 -0
- package/dist/infrastructure/transport/mqtt/MqttTransport.d.ts +26 -0
- package/dist/infrastructure/transport/mqtt/MqttTransport.d.ts.map +1 -0
- package/dist/infrastructure/transport/mqtt/MqttTransport.js +188 -0
- package/dist/infrastructure/transport/mqtt/MqttTransport.js.map +1 -0
- package/dist/infrastructure/transport/udp/UdpSocket.d.ts +13 -0
- package/dist/infrastructure/transport/udp/UdpSocket.d.ts.map +1 -0
- package/dist/infrastructure/transport/udp/UdpSocket.js +37 -0
- package/dist/infrastructure/transport/udp/UdpSocket.js.map +1 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.d.ts +33 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.d.ts.map +1 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.js +51 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.js.map +1 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.test.d.ts +2 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.test.d.ts.map +1 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.test.js +79 -0
- package/dist/infrastructure/transport/websocket/CcV1Codec.test.js.map +1 -0
- package/dist/infrastructure/transport/websocket/WebSocketTransport.d.ts +13 -0
- package/dist/infrastructure/transport/websocket/WebSocketTransport.d.ts.map +1 -0
- package/dist/infrastructure/transport/websocket/WebSocketTransport.js +71 -0
- package/dist/infrastructure/transport/websocket/WebSocketTransport.js.map +1 -0
- package/docs/cc2-protocol.md +244 -0
- package/package.json +59 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { mapStatus } from "./CcV2StatusMapper.js";
|
|
3
|
+
import { PrinterState } from "../../../domain/types/PrinterState.js";
|
|
4
|
+
import { PrinterSubState } from "../../../domain/types/PrinterSubState.js";
|
|
5
|
+
describe("CcV2StatusMapper.mapStatus", () => {
|
|
6
|
+
it("maps basic status fields", () => {
|
|
7
|
+
const result = mapStatus("printer-1", {
|
|
8
|
+
current_status: PrinterState.PRINTING,
|
|
9
|
+
sub_status: PrinterSubState.P_PRINTING,
|
|
10
|
+
progress: 42,
|
|
11
|
+
exception_codes: [101],
|
|
12
|
+
});
|
|
13
|
+
expect(result.printerId).toBe("printer-1");
|
|
14
|
+
expect(result.printer.state).toBe(PrinterState.PRINTING);
|
|
15
|
+
expect(result.printer.subState).toBe(PrinterSubState.P_PRINTING);
|
|
16
|
+
expect(result.printer.progress).toBe(42);
|
|
17
|
+
expect(result.printer.exceptionCodes).toEqual([101]);
|
|
18
|
+
});
|
|
19
|
+
it("maps temperature fields", () => {
|
|
20
|
+
const result = mapStatus("printer-1", {
|
|
21
|
+
temperatures: {
|
|
22
|
+
extruder: { current_temp: 210, target_temp: 215, highest_temp: 216, lowest_temp: 22 },
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const extruder = result.temperatures["extruder"];
|
|
26
|
+
expect(extruder?.current).toBe(210);
|
|
27
|
+
expect(extruder?.target).toBe(215);
|
|
28
|
+
});
|
|
29
|
+
it("maps print job when present", () => {
|
|
30
|
+
const result = mapStatus("printer-1", {
|
|
31
|
+
current_print_task: {
|
|
32
|
+
task_id: "task-abc",
|
|
33
|
+
file_name: "model.gcode",
|
|
34
|
+
total_time: 3600,
|
|
35
|
+
current_time: 1800,
|
|
36
|
+
total_layer: 100,
|
|
37
|
+
current_layer: 50,
|
|
38
|
+
progress: 50,
|
|
39
|
+
print_speed_mode: 1,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
expect(result.job).toBeDefined();
|
|
43
|
+
expect(result.job?.taskId).toBe("task-abc");
|
|
44
|
+
expect(result.job?.fileName).toBe("model.gcode");
|
|
45
|
+
expect(result.job?.totalLayers).toBe(100);
|
|
46
|
+
});
|
|
47
|
+
it("sets job to undefined when no print task", () => {
|
|
48
|
+
const result = mapStatus("printer-1", {});
|
|
49
|
+
expect(result.job).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
it("uses defaults for missing fields", () => {
|
|
52
|
+
const result = mapStatus("printer-1", {});
|
|
53
|
+
expect(result.printer.state).toBe(PrinterState.UNKNOWN);
|
|
54
|
+
expect(result.printer.subState).toBe(PrinterSubState.NONE);
|
|
55
|
+
expect(result.printer.progress).toBe(0);
|
|
56
|
+
expect(result.externalDevices.usbConnected).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=CcV2StatusMapper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CcV2StatusMapper.test.js","sourceRoot":"","sources":["../../../../src/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FileAdapter, FileListParams, FileDetailParams, FileUploadParams, ProgressCallback } from "../../../domain/ports/FileAdapter.js";
|
|
2
|
+
import type { FileDetail, FileListData } from "../../../domain/entities/FileInfo.js";
|
|
3
|
+
import type { PrintTaskListData } from "../../../domain/entities/PrintTask.js";
|
|
4
|
+
import type { Result } from "../../../application/result/Result.js";
|
|
5
|
+
export declare class MoonrakerFileAdapter implements FileAdapter {
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
private activeUploadController;
|
|
8
|
+
constructor(host: string, port?: number);
|
|
9
|
+
getFileList(params?: FileListParams): Promise<Result<FileListData>>;
|
|
10
|
+
getFileDetail(params: FileDetailParams): Promise<Result<FileDetail>>;
|
|
11
|
+
upload(params: FileUploadParams, onProgress?: ProgressCallback): Promise<Result<void>>;
|
|
12
|
+
cancelUpload(): Promise<Result<void>>;
|
|
13
|
+
getPrintTaskList(_page?: number, _pageSize?: number): Promise<Result<PrintTaskListData>>;
|
|
14
|
+
deletePrintTasks(_taskIds: readonly string[]): Promise<Result<void>>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=MoonrakerFileAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoonrakerFileAdapter.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/adapters/moonraker/MoonrakerFileAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC9I,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAqBpE,qBAAa,oBAAqB,YAAW,WAAW;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,sBAAsB,CAAgC;gBAElD,IAAI,EAAE,MAAM,EAAE,IAAI,SAAO;IAI/B,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAyBnE,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAmBpE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAqCtF,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKrC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAIxF,gBAAgB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAG3E"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { ok, err } from "../../../application/result/Result.js";
|
|
2
|
+
import { ElegooError } from "../../../application/result/ElegooError.js";
|
|
3
|
+
import { ErrorCode } from "../../../domain/types/ErrorCode.js";
|
|
4
|
+
import { readFile } from "fs/promises";
|
|
5
|
+
export class MoonrakerFileAdapter {
|
|
6
|
+
baseUrl;
|
|
7
|
+
activeUploadController = null;
|
|
8
|
+
constructor(host, port = 7125) {
|
|
9
|
+
this.baseUrl = `http://${host}:${port}`;
|
|
10
|
+
}
|
|
11
|
+
async getFileList(params) {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch(`${this.baseUrl}/server/files/list?root=gcodes`, {
|
|
14
|
+
signal: AbortSignal.timeout(15_000),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok)
|
|
17
|
+
throw new Error(`HTTP ${response.status}`);
|
|
18
|
+
const data = (await response.json());
|
|
19
|
+
const entries = data.result ?? [];
|
|
20
|
+
const page = params?.page ?? 1;
|
|
21
|
+
const pageSize = params?.pageSize ?? 50;
|
|
22
|
+
const start = (page - 1) * pageSize;
|
|
23
|
+
const slice = entries.slice(start, start + pageSize);
|
|
24
|
+
return ok({
|
|
25
|
+
files: slice.map(mapEntry),
|
|
26
|
+
total: entries.length,
|
|
27
|
+
page,
|
|
28
|
+
pageSize,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (cause) {
|
|
32
|
+
return err(new ElegooError(ErrorCode.NETWORK_ERROR, "Failed to fetch file list from Moonraker", cause));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getFileDetail(params) {
|
|
36
|
+
try {
|
|
37
|
+
const encoded = encodeURIComponent(params.fileName);
|
|
38
|
+
const response = await fetch(`${this.baseUrl}/server/files/metadata?filename=${encoded}`, {
|
|
39
|
+
signal: AbortSignal.timeout(10_000),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
if (response.status === 404)
|
|
43
|
+
return err(new ElegooError(ErrorCode.FILE_NOT_FOUND, `File not found: ${params.fileName}`));
|
|
44
|
+
throw new Error(`HTTP ${response.status}`);
|
|
45
|
+
}
|
|
46
|
+
const data = (await response.json());
|
|
47
|
+
if (!data.result)
|
|
48
|
+
return err(new ElegooError(ErrorCode.FILE_NOT_FOUND, `File not found: ${params.fileName}`));
|
|
49
|
+
return ok(mapMetadata(data.result));
|
|
50
|
+
}
|
|
51
|
+
catch (cause) {
|
|
52
|
+
if (cause instanceof ElegooError)
|
|
53
|
+
return err(cause);
|
|
54
|
+
return err(new ElegooError(ErrorCode.NETWORK_ERROR, "Failed to fetch file metadata from Moonraker", cause));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async upload(params, onProgress) {
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
this.activeUploadController = controller;
|
|
60
|
+
try {
|
|
61
|
+
const fileData = await readFile(params.localFilePath);
|
|
62
|
+
const totalBytes = fileData.byteLength;
|
|
63
|
+
const form = new FormData();
|
|
64
|
+
form.append("root", params.storageLocation || "gcodes");
|
|
65
|
+
form.append("file", new Blob([fileData]), params.fileName);
|
|
66
|
+
if (onProgress) {
|
|
67
|
+
const shouldContinue = onProgress(0, totalBytes);
|
|
68
|
+
if (!shouldContinue)
|
|
69
|
+
return err(new ElegooError(ErrorCode.OPERATION_CANCELLED, "Upload cancelled"));
|
|
70
|
+
}
|
|
71
|
+
const signal = AbortSignal.any([controller.signal, AbortSignal.timeout(300_000)]);
|
|
72
|
+
const response = await fetch(`${this.baseUrl}/server/files/upload`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
body: form,
|
|
75
|
+
signal,
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok)
|
|
78
|
+
throw new Error(`Upload failed: HTTP ${response.status}`);
|
|
79
|
+
if (onProgress)
|
|
80
|
+
onProgress(totalBytes, totalBytes);
|
|
81
|
+
return ok(undefined);
|
|
82
|
+
}
|
|
83
|
+
catch (cause) {
|
|
84
|
+
if (controller.signal.aborted) {
|
|
85
|
+
return err(new ElegooError(ErrorCode.OPERATION_CANCELLED, "Upload cancelled"));
|
|
86
|
+
}
|
|
87
|
+
return err(new ElegooError(ErrorCode.FILE_TRANSFER_FAILED, "Upload failed", cause));
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
this.activeUploadController = null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async cancelUpload() {
|
|
94
|
+
this.activeUploadController?.abort();
|
|
95
|
+
return ok(undefined);
|
|
96
|
+
}
|
|
97
|
+
async getPrintTaskList(_page, _pageSize) {
|
|
98
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "Print task history not supported on Moonraker"));
|
|
99
|
+
}
|
|
100
|
+
async deletePrintTasks(_taskIds) {
|
|
101
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "deletePrintTasks not supported on Moonraker"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function mapEntry(entry) {
|
|
105
|
+
return {
|
|
106
|
+
fileName: entry.path ?? "",
|
|
107
|
+
printTimeSeconds: 0,
|
|
108
|
+
layers: 0,
|
|
109
|
+
layerHeightMm: 0,
|
|
110
|
+
thumbnailUrl: "",
|
|
111
|
+
sizeBytes: entry.size ?? 0,
|
|
112
|
+
createdAt: entry.modified ? Math.round(entry.modified) : 0,
|
|
113
|
+
filamentUsedGrams: 0,
|
|
114
|
+
filamentUsedMm: 0,
|
|
115
|
+
totalPrintTimes: 0,
|
|
116
|
+
lastPrintAt: 0,
|
|
117
|
+
colorMapping: [],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function mapMetadata(meta) {
|
|
121
|
+
const thumbnail = (meta.thumbnails ?? []).find((t) => (t.width ?? 0) >= 32);
|
|
122
|
+
return {
|
|
123
|
+
fileName: meta.filename ?? "",
|
|
124
|
+
printTimeSeconds: Math.round(meta.estimated_time ?? 0),
|
|
125
|
+
layers: meta.layer_count ?? 0,
|
|
126
|
+
layerHeightMm: meta.layer_height ?? 0,
|
|
127
|
+
thumbnailUrl: thumbnail?.relative_url ?? "",
|
|
128
|
+
sizeBytes: meta.size ?? 0,
|
|
129
|
+
createdAt: meta.modified ? Math.round(meta.modified) : 0,
|
|
130
|
+
filamentUsedGrams: meta.filament_weight_total ?? 0,
|
|
131
|
+
filamentUsedMm: meta.filament_total ?? 0,
|
|
132
|
+
totalPrintTimes: 0,
|
|
133
|
+
lastPrintAt: 0,
|
|
134
|
+
colorMapping: [],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=MoonrakerFileAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoonrakerFileAdapter.js","sourceRoot":"","sources":["../../../../src/infrastructure/adapters/moonraker/MoonrakerFileAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,uCAAuC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyBvC,MAAM,OAAO,oBAAoB;IACd,OAAO,CAAS;IACzB,sBAAsB,GAA2B,IAAI,CAAC;IAE9D,YAAY,IAAY,EAAE,IAAI,GAAG,IAAI;QACnC,IAAI,CAAC,OAAO,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAuB;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,gCAAgC,EAAE;gBAC5E,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsC,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;YAElC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;YACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;YAErD,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC1B,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,IAAI;gBACJ,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAwB;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mCAAmC,OAAO,EAAE,EAAE;gBACxF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACzH,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;YACvE,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC9G,OAAO,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,WAAW;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACpD,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,8CAA8C,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAwB,EAAE,UAA6B;QAClE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YAEvC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,IAAI,QAAQ,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3D,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBACjD,IAAI,CAAC,cAAc;oBAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACtG,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE;gBAClE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAE5E,IAAI,UAAU;gBAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,oBAAoB,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;QACtF,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAAc,EAAE,SAAkB;QACvD,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,yBAAyB,EAAE,+CAA+C,CAAC,CAAC,CAAC;IACpH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAA2B;QAChD,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,yBAAyB,EAAE,6CAA6C,CAAC,CAAC,CAAC;IAClH,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAyB;IACzC,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QAC1B,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;QAC1B,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,iBAAiB,EAAE,CAAC;QACpB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAuB;IAC1C,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACtD,MAAM,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;QAC7B,aAAa,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;QACrC,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,EAAE;QAC3C,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QACzB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,IAAI,CAAC;QAClD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC;QACxC,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PrinterType } from "../../../domain/types/PrinterType.js";
|
|
2
|
+
import type { PrinterAdapter, ConnectParams, StartPrintParams, FileDownloadTriggerParams, Unsubscribe } from "../../../domain/ports/PrinterAdapter.js";
|
|
3
|
+
import type { PrinterInfo } from "../../../domain/entities/PrinterInfo.js";
|
|
4
|
+
import type { PrinterStatusData, CanvasStatus } from "../../../domain/entities/PrinterStatus.js";
|
|
5
|
+
import type { PrinterAttributes } from "../../../domain/entities/PrinterAttributes.js";
|
|
6
|
+
import type { PrintTaskListData } from "../../../domain/entities/PrintTask.js";
|
|
7
|
+
import type { Result } from "../../../application/result/Result.js";
|
|
8
|
+
export declare class MoonrakerPrinterAdapter implements PrinterAdapter {
|
|
9
|
+
private readonly type;
|
|
10
|
+
private readonly transport;
|
|
11
|
+
private printerInfo;
|
|
12
|
+
private nextId;
|
|
13
|
+
private pending;
|
|
14
|
+
private cachedStatus;
|
|
15
|
+
private hasFullStatus;
|
|
16
|
+
private statusHandlers;
|
|
17
|
+
private attributesHandlers;
|
|
18
|
+
private connectionHandlers;
|
|
19
|
+
private unsubscribeTransport;
|
|
20
|
+
constructor(type?: PrinterType);
|
|
21
|
+
connect(params: ConnectParams): Promise<Result<PrinterInfo>>;
|
|
22
|
+
disconnect(): Promise<void>;
|
|
23
|
+
getStatus(timeoutMs?: number): Promise<Result<PrinterStatusData>>;
|
|
24
|
+
getAttributes(timeoutMs?: number): Promise<Result<PrinterAttributes>>;
|
|
25
|
+
startPrint(params: StartPrintParams): Promise<Result<void>>;
|
|
26
|
+
pausePrint(): Promise<Result<void>>;
|
|
27
|
+
resumePrint(): Promise<Result<void>>;
|
|
28
|
+
stopPrint(): Promise<Result<void>>;
|
|
29
|
+
homeAxis(axes: string): Promise<Result<void>>;
|
|
30
|
+
moveAxis(axes: string, distanceMm: number): Promise<Result<void>>;
|
|
31
|
+
setTemperature(targets: Readonly<Record<string, number>>): Promise<Result<void>>;
|
|
32
|
+
setFanSpeed(speeds: Readonly<Record<string, number>>): Promise<Result<void>>;
|
|
33
|
+
setPrintSpeed(_mode: 0 | 1 | 2 | 3): Promise<Result<void>>;
|
|
34
|
+
getCanvasStatus(_timeoutMs?: number): Promise<Result<CanvasStatus>>;
|
|
35
|
+
setAutoRefill(_enable: boolean): Promise<Result<void>>;
|
|
36
|
+
updatePrinterName(_name: string): Promise<Result<void>>;
|
|
37
|
+
getPrintTaskList(_page?: number, _pageSize?: number): Promise<Result<PrintTaskListData>>;
|
|
38
|
+
deletePrintTasks(_taskIds: readonly string[]): Promise<Result<void>>;
|
|
39
|
+
triggerFileDownload(_params: FileDownloadTriggerParams): Promise<Result<void>>;
|
|
40
|
+
cancelFileDownload(_taskId: string): Promise<Result<void>>;
|
|
41
|
+
refreshPrinterStatus(): Promise<Result<void>>;
|
|
42
|
+
refreshPrinterAttributes(): Promise<Result<void>>;
|
|
43
|
+
getStatusRaw(timeoutMs?: number): Promise<Result<string>>;
|
|
44
|
+
onStatus(handler: (s: PrinterStatusData) => void): Unsubscribe;
|
|
45
|
+
onAttributes(handler: (a: PrinterAttributes) => void): Unsubscribe;
|
|
46
|
+
onConnection(handler: (c: boolean) => void): Unsubscribe;
|
|
47
|
+
private runGCode;
|
|
48
|
+
private sendCommand;
|
|
49
|
+
private sendRequest;
|
|
50
|
+
private onMessage;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=MoonrakerPrinterAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoonrakerPrinterAdapter.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { WebSocketTransport } from "../../transport/websocket/WebSocketTransport.js";
|
|
2
|
+
import { mapMoonrakerStatus, mergeDelta } from "./MoonrakerStatusMapper.js";
|
|
3
|
+
import { ErrorCode } from "../../../domain/types/ErrorCode.js";
|
|
4
|
+
import { PrinterType } from "../../../domain/types/PrinterType.js";
|
|
5
|
+
import { ok, err } from "../../../application/result/Result.js";
|
|
6
|
+
import { ElegooError } from "../../../application/result/ElegooError.js";
|
|
7
|
+
const MOONRAKER_DEFAULT_PORT = 7125;
|
|
8
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
9
|
+
const SUBSCRIBE_OBJECTS = {
|
|
10
|
+
gcode_move: null,
|
|
11
|
+
toolhead: null,
|
|
12
|
+
display_status: null,
|
|
13
|
+
idle_timeout: null,
|
|
14
|
+
print_stats: null,
|
|
15
|
+
heater_bed: null,
|
|
16
|
+
pause_resume: null,
|
|
17
|
+
extruder: null,
|
|
18
|
+
virtual_sdcard: null,
|
|
19
|
+
};
|
|
20
|
+
export class MoonrakerPrinterAdapter {
|
|
21
|
+
type;
|
|
22
|
+
transport = new WebSocketTransport();
|
|
23
|
+
printerInfo = null;
|
|
24
|
+
nextId = 1;
|
|
25
|
+
pending = new Map();
|
|
26
|
+
cachedStatus = {};
|
|
27
|
+
hasFullStatus = false;
|
|
28
|
+
statusHandlers = new Set();
|
|
29
|
+
attributesHandlers = new Set();
|
|
30
|
+
connectionHandlers = new Set();
|
|
31
|
+
unsubscribeTransport = null;
|
|
32
|
+
constructor(type = PrinterType.GENERIC_FDM_KLIPPER) {
|
|
33
|
+
this.type = type;
|
|
34
|
+
}
|
|
35
|
+
async connect(params) {
|
|
36
|
+
const port = params.port ?? MOONRAKER_DEFAULT_PORT;
|
|
37
|
+
try {
|
|
38
|
+
await this.transport.connect({ host: params.host, port, timeoutMs: params.connectionTimeoutMs, username: undefined, password: undefined });
|
|
39
|
+
}
|
|
40
|
+
catch (cause) {
|
|
41
|
+
return err(new ElegooError(ErrorCode.PRINTER_CONNECTION_ERROR, `Failed to connect to ${params.host}:${port}`, cause));
|
|
42
|
+
}
|
|
43
|
+
this.unsubscribeTransport = this.transport.subscribe((raw) => this.onMessage(raw));
|
|
44
|
+
// Get system info for mainboard ID
|
|
45
|
+
const sysResult = await this.sendRequest("machine.system_info", {});
|
|
46
|
+
const mainboardId = sysResult.ok
|
|
47
|
+
? (sysResult.value.result?.system_info?.network?.wlan0?.mac_address ?? params.serialNumber ?? "")
|
|
48
|
+
: (params.serialNumber ?? "");
|
|
49
|
+
// Subscribe to printer objects — also returns current full state
|
|
50
|
+
const subResult = await this.sendRequest("printer.objects.subscribe", { objects: SUBSCRIBE_OBJECTS });
|
|
51
|
+
if (!subResult.ok) {
|
|
52
|
+
await this.transport.disconnect();
|
|
53
|
+
return subResult;
|
|
54
|
+
}
|
|
55
|
+
if (subResult.value.result?.status) {
|
|
56
|
+
this.cachedStatus = subResult.value.result.status;
|
|
57
|
+
this.hasFullStatus = true;
|
|
58
|
+
}
|
|
59
|
+
const brand = this.type === PrinterType.ELEGOO_FDM_KLIPPER ? "Elegoo" : "Generic";
|
|
60
|
+
this.printerInfo = {
|
|
61
|
+
printerId: `moonraker_${mainboardId || params.host}`,
|
|
62
|
+
printerType: this.type,
|
|
63
|
+
brand,
|
|
64
|
+
name: params.name ?? "Klipper Printer",
|
|
65
|
+
model: params.model,
|
|
66
|
+
firmwareVersion: "",
|
|
67
|
+
mainboardId,
|
|
68
|
+
serialNumber: params.serialNumber ?? mainboardId,
|
|
69
|
+
host: params.host,
|
|
70
|
+
authMode: params.authMode ?? "",
|
|
71
|
+
};
|
|
72
|
+
if (this.hasFullStatus) {
|
|
73
|
+
const status = mapMoonrakerStatus(this.printerInfo.printerId, this.cachedStatus);
|
|
74
|
+
for (const h of this.statusHandlers)
|
|
75
|
+
h(status);
|
|
76
|
+
}
|
|
77
|
+
for (const h of this.connectionHandlers)
|
|
78
|
+
h(true);
|
|
79
|
+
return ok(this.printerInfo);
|
|
80
|
+
}
|
|
81
|
+
async disconnect() {
|
|
82
|
+
this.unsubscribeTransport?.();
|
|
83
|
+
await this.transport.disconnect();
|
|
84
|
+
for (const h of this.connectionHandlers)
|
|
85
|
+
h(false);
|
|
86
|
+
}
|
|
87
|
+
async getStatus(timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
88
|
+
const result = await this.sendRequest("printer.objects.query", { objects: SUBSCRIBE_OBJECTS }, timeoutMs);
|
|
89
|
+
if (!result.ok)
|
|
90
|
+
return result;
|
|
91
|
+
const raw = result.value.result?.status ?? {};
|
|
92
|
+
this.cachedStatus = mergeDelta(this.cachedStatus, raw);
|
|
93
|
+
this.hasFullStatus = true;
|
|
94
|
+
return ok(mapMoonrakerStatus(this.printerInfo?.printerId ?? "", this.cachedStatus));
|
|
95
|
+
}
|
|
96
|
+
async getAttributes(timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
97
|
+
const result = await this.sendRequest("machine.system_info", {}, timeoutMs);
|
|
98
|
+
if (!result.ok)
|
|
99
|
+
return result;
|
|
100
|
+
const info = this.printerInfo;
|
|
101
|
+
const sysInfo = result.value.result?.system_info;
|
|
102
|
+
const mainboardId = sysInfo?.network?.wlan0?.mac_address ?? info?.mainboardId ?? "";
|
|
103
|
+
return ok({
|
|
104
|
+
printerId: info?.printerId ?? "",
|
|
105
|
+
printerType: this.type,
|
|
106
|
+
brand: info?.brand ?? "Generic",
|
|
107
|
+
name: info?.name ?? "Klipper Printer",
|
|
108
|
+
model: info?.model ?? "",
|
|
109
|
+
firmwareVersion: info?.firmwareVersion ?? "",
|
|
110
|
+
mainboardId,
|
|
111
|
+
serialNumber: info?.serialNumber ?? mainboardId,
|
|
112
|
+
host: info?.host ?? "",
|
|
113
|
+
authMode: (info?.authMode ?? ""),
|
|
114
|
+
capabilities: {
|
|
115
|
+
storage: [
|
|
116
|
+
{ name: "local", removable: false },
|
|
117
|
+
{ name: "udisk", removable: true },
|
|
118
|
+
{ name: "sdcard", removable: true },
|
|
119
|
+
],
|
|
120
|
+
fans: [{ name: "model", controllable: true, minSpeed: 0, maxSpeed: 100, supportsRpmReading: false }],
|
|
121
|
+
temperatures: [
|
|
122
|
+
{ name: "extruder", controllable: true, supportsReading: true, minTemperature: 0, maxTemperature: 300 },
|
|
123
|
+
{ name: "heatedBed", controllable: true, supportsReading: true, minTemperature: 0, maxTemperature: 120 },
|
|
124
|
+
],
|
|
125
|
+
lights: [],
|
|
126
|
+
supportsCamera: false,
|
|
127
|
+
supportsTimeLapse: false,
|
|
128
|
+
canSetPrinterName: false,
|
|
129
|
+
canGetDiskInfo: false,
|
|
130
|
+
supportsMultiFilament: false,
|
|
131
|
+
supportsAutoBedLeveling: true,
|
|
132
|
+
supportsHeatedBedSwitching: false,
|
|
133
|
+
supportsFilamentMapping: false,
|
|
134
|
+
supportsAutoRefill: false,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async startPrint(params) {
|
|
139
|
+
return this.sendCommand("printer.print.start", { filename: params.fileName });
|
|
140
|
+
}
|
|
141
|
+
async pausePrint() {
|
|
142
|
+
return this.sendCommand("printer.print.pause", {});
|
|
143
|
+
}
|
|
144
|
+
async resumePrint() {
|
|
145
|
+
return this.sendCommand("printer.print.resume", {});
|
|
146
|
+
}
|
|
147
|
+
async stopPrint() {
|
|
148
|
+
return this.sendCommand("printer.print.cancel", {});
|
|
149
|
+
}
|
|
150
|
+
async homeAxis(axes) {
|
|
151
|
+
const axesUpper = axes.toUpperCase().split("").join(" ");
|
|
152
|
+
const script = axesUpper ? `G28 ${axesUpper}` : "G28";
|
|
153
|
+
return this.runGCode(script);
|
|
154
|
+
}
|
|
155
|
+
async moveAxis(axes, distanceMm) {
|
|
156
|
+
const axis = axes.toUpperCase();
|
|
157
|
+
const script = `G91\nG1 ${axis}${distanceMm} F3000\nG90`;
|
|
158
|
+
return this.runGCode(script);
|
|
159
|
+
}
|
|
160
|
+
async setTemperature(targets) {
|
|
161
|
+
const lines = [];
|
|
162
|
+
for (const [name, temp] of Object.entries(targets)) {
|
|
163
|
+
if (name === "extruder")
|
|
164
|
+
lines.push(`M104 S${temp}`);
|
|
165
|
+
else if (name === "heatedBed")
|
|
166
|
+
lines.push(`M140 S${temp}`);
|
|
167
|
+
}
|
|
168
|
+
if (!lines.length)
|
|
169
|
+
return ok(undefined);
|
|
170
|
+
return this.runGCode(lines.join("\n"));
|
|
171
|
+
}
|
|
172
|
+
async setFanSpeed(speeds) {
|
|
173
|
+
const modelSpeed = speeds["model"] ?? speeds["fan"];
|
|
174
|
+
if (modelSpeed === undefined)
|
|
175
|
+
return ok(undefined);
|
|
176
|
+
const s = Math.round(Math.max(0, Math.min(100, modelSpeed)) * 2.55);
|
|
177
|
+
return this.runGCode(`M106 S${s}`);
|
|
178
|
+
}
|
|
179
|
+
async setPrintSpeed(_mode) {
|
|
180
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "setPrintSpeed not supported on Moonraker"));
|
|
181
|
+
}
|
|
182
|
+
async getCanvasStatus(_timeoutMs) {
|
|
183
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "getCanvasStatus not supported on Moonraker"));
|
|
184
|
+
}
|
|
185
|
+
async setAutoRefill(_enable) {
|
|
186
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "setAutoRefill not supported on Moonraker"));
|
|
187
|
+
}
|
|
188
|
+
async updatePrinterName(_name) {
|
|
189
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "updatePrinterName not supported on Moonraker"));
|
|
190
|
+
}
|
|
191
|
+
async getPrintTaskList(_page, _pageSize) {
|
|
192
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "getPrintTaskList not supported on Moonraker"));
|
|
193
|
+
}
|
|
194
|
+
async deletePrintTasks(_taskIds) {
|
|
195
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "deletePrintTasks not supported on Moonraker"));
|
|
196
|
+
}
|
|
197
|
+
async triggerFileDownload(_params) {
|
|
198
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "triggerFileDownload not supported on Moonraker"));
|
|
199
|
+
}
|
|
200
|
+
async cancelFileDownload(_taskId) {
|
|
201
|
+
return err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "cancelFileDownload not supported on Moonraker"));
|
|
202
|
+
}
|
|
203
|
+
async refreshPrinterStatus() {
|
|
204
|
+
void this.getStatus().then((result) => {
|
|
205
|
+
if (result.ok)
|
|
206
|
+
for (const h of this.statusHandlers)
|
|
207
|
+
h(result.value);
|
|
208
|
+
});
|
|
209
|
+
return ok(undefined);
|
|
210
|
+
}
|
|
211
|
+
async refreshPrinterAttributes() {
|
|
212
|
+
void this.getAttributes().then((result) => {
|
|
213
|
+
if (result.ok)
|
|
214
|
+
for (const h of this.attributesHandlers)
|
|
215
|
+
h(result.value);
|
|
216
|
+
});
|
|
217
|
+
return ok(undefined);
|
|
218
|
+
}
|
|
219
|
+
async getStatusRaw(timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
220
|
+
const result = await this.sendRequest("printer.objects.query", { objects: SUBSCRIBE_OBJECTS }, timeoutMs);
|
|
221
|
+
if (!result.ok)
|
|
222
|
+
return result;
|
|
223
|
+
return ok(JSON.stringify(result.value));
|
|
224
|
+
}
|
|
225
|
+
onStatus(handler) {
|
|
226
|
+
this.statusHandlers.add(handler);
|
|
227
|
+
return () => this.statusHandlers.delete(handler);
|
|
228
|
+
}
|
|
229
|
+
onAttributes(handler) {
|
|
230
|
+
this.attributesHandlers.add(handler);
|
|
231
|
+
return () => this.attributesHandlers.delete(handler);
|
|
232
|
+
}
|
|
233
|
+
onConnection(handler) {
|
|
234
|
+
this.connectionHandlers.add(handler);
|
|
235
|
+
return () => this.connectionHandlers.delete(handler);
|
|
236
|
+
}
|
|
237
|
+
async runGCode(script) {
|
|
238
|
+
return this.sendCommand("printer.gcode.script", { script });
|
|
239
|
+
}
|
|
240
|
+
async sendCommand(method, params) {
|
|
241
|
+
const result = await this.sendRequest(method, params);
|
|
242
|
+
if (!result.ok)
|
|
243
|
+
return result;
|
|
244
|
+
if (result.value.error) {
|
|
245
|
+
return err(new ElegooError(ErrorCode.PRINTER_COMMAND_FAILED, result.value.error.message ?? "Moonraker error"));
|
|
246
|
+
}
|
|
247
|
+
return ok(undefined);
|
|
248
|
+
}
|
|
249
|
+
sendRequest(method, params, timeoutMs = REQUEST_TIMEOUT_MS) {
|
|
250
|
+
const id = this.nextId++;
|
|
251
|
+
const message = { jsonrpc: "2.0", method, params, id };
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
const timer = setTimeout(() => {
|
|
254
|
+
this.pending.delete(id);
|
|
255
|
+
resolve(err(new ElegooError(ErrorCode.OPERATION_TIMEOUT, `Request ${id} (${method}) timed out`)));
|
|
256
|
+
}, timeoutMs);
|
|
257
|
+
this.pending.set(id, {
|
|
258
|
+
resolve: (value) => resolve(ok(value)),
|
|
259
|
+
timer,
|
|
260
|
+
});
|
|
261
|
+
this.transport.send(message).catch((cause) => {
|
|
262
|
+
clearTimeout(timer);
|
|
263
|
+
this.pending.delete(id);
|
|
264
|
+
resolve(err(new ElegooError(ErrorCode.NETWORK_ERROR, `Failed to send ${method}`, cause)));
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
onMessage(raw) {
|
|
269
|
+
if (typeof raw !== "string")
|
|
270
|
+
return;
|
|
271
|
+
try {
|
|
272
|
+
const msg = JSON.parse(raw);
|
|
273
|
+
// Incoming push event (notify_status_update)
|
|
274
|
+
if (msg.method === "notify_status_update" && Array.isArray(msg.params)) {
|
|
275
|
+
const delta = msg.params[0];
|
|
276
|
+
if (this.hasFullStatus) {
|
|
277
|
+
this.cachedStatus = mergeDelta(this.cachedStatus, delta);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
this.cachedStatus = delta;
|
|
281
|
+
this.hasFullStatus = true;
|
|
282
|
+
}
|
|
283
|
+
const status = mapMoonrakerStatus(this.printerInfo?.printerId ?? "", this.cachedStatus);
|
|
284
|
+
for (const h of this.statusHandlers)
|
|
285
|
+
h(status);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
// Response to a pending request
|
|
289
|
+
if (msg.id !== undefined) {
|
|
290
|
+
const pending = this.pending.get(msg.id);
|
|
291
|
+
if (pending) {
|
|
292
|
+
clearTimeout(pending.timer);
|
|
293
|
+
this.pending.delete(msg.id);
|
|
294
|
+
pending.resolve(msg);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// Ignore malformed messages
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=MoonrakerPrinterAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoonrakerPrinterAdapter.js","sourceRoot":"","sources":["../../../../src/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.ts"],"names":[],"mappings":"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"}
|