@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.
Files changed (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/dist/CenturyLink.d.ts +53 -0
  4. package/dist/CenturyLink.d.ts.map +1 -0
  5. package/dist/CenturyLink.js +103 -0
  6. package/dist/CenturyLink.js.map +1 -0
  7. package/dist/application/result/ElegooError.d.ts +7 -0
  8. package/dist/application/result/ElegooError.d.ts.map +1 -0
  9. package/dist/application/result/ElegooError.js +11 -0
  10. package/dist/application/result/ElegooError.js.map +1 -0
  11. package/dist/application/result/Result.d.ts +12 -0
  12. package/dist/application/result/Result.d.ts.map +1 -0
  13. package/dist/application/result/Result.js +12 -0
  14. package/dist/application/result/Result.js.map +1 -0
  15. package/dist/application/result/Result.test.d.ts +2 -0
  16. package/dist/application/result/Result.test.d.ts.map +1 -0
  17. package/dist/application/result/Result.test.js +46 -0
  18. package/dist/application/result/Result.test.js.map +1 -0
  19. package/dist/application/use-cases/ConnectPrinterUseCase.d.ts +9 -0
  20. package/dist/application/use-cases/ConnectPrinterUseCase.d.ts.map +1 -0
  21. package/dist/application/use-cases/ConnectPrinterUseCase.js +10 -0
  22. package/dist/application/use-cases/ConnectPrinterUseCase.js.map +1 -0
  23. package/dist/application/use-cases/DiscoverPrintersUseCase.d.ts +8 -0
  24. package/dist/application/use-cases/DiscoverPrintersUseCase.d.ts.map +1 -0
  25. package/dist/application/use-cases/DiscoverPrintersUseCase.js +36 -0
  26. package/dist/application/use-cases/DiscoverPrintersUseCase.js.map +1 -0
  27. package/dist/application/use-cases/GetFileListUseCase.d.ts +9 -0
  28. package/dist/application/use-cases/GetFileListUseCase.d.ts.map +1 -0
  29. package/dist/application/use-cases/GetFileListUseCase.js +10 -0
  30. package/dist/application/use-cases/GetFileListUseCase.js.map +1 -0
  31. package/dist/application/use-cases/GetPrinterStatusUseCase.d.ts +9 -0
  32. package/dist/application/use-cases/GetPrinterStatusUseCase.d.ts.map +1 -0
  33. package/dist/application/use-cases/GetPrinterStatusUseCase.js +10 -0
  34. package/dist/application/use-cases/GetPrinterStatusUseCase.js.map +1 -0
  35. package/dist/application/use-cases/PausePrintUseCase.d.ts +8 -0
  36. package/dist/application/use-cases/PausePrintUseCase.d.ts.map +1 -0
  37. package/dist/application/use-cases/PausePrintUseCase.js +10 -0
  38. package/dist/application/use-cases/PausePrintUseCase.js.map +1 -0
  39. package/dist/application/use-cases/ResumePrintUseCase.d.ts +8 -0
  40. package/dist/application/use-cases/ResumePrintUseCase.d.ts.map +1 -0
  41. package/dist/application/use-cases/ResumePrintUseCase.js +10 -0
  42. package/dist/application/use-cases/ResumePrintUseCase.js.map +1 -0
  43. package/dist/application/use-cases/StartPrintUseCase.d.ts +8 -0
  44. package/dist/application/use-cases/StartPrintUseCase.d.ts.map +1 -0
  45. package/dist/application/use-cases/StartPrintUseCase.js +10 -0
  46. package/dist/application/use-cases/StartPrintUseCase.js.map +1 -0
  47. package/dist/application/use-cases/StopPrintUseCase.d.ts +8 -0
  48. package/dist/application/use-cases/StopPrintUseCase.d.ts.map +1 -0
  49. package/dist/application/use-cases/StopPrintUseCase.js +10 -0
  50. package/dist/application/use-cases/StopPrintUseCase.js.map +1 -0
  51. package/dist/application/use-cases/UploadFileUseCase.d.ts +8 -0
  52. package/dist/application/use-cases/UploadFileUseCase.d.ts.map +1 -0
  53. package/dist/application/use-cases/UploadFileUseCase.js +10 -0
  54. package/dist/application/use-cases/UploadFileUseCase.js.map +1 -0
  55. package/dist/domain/entities/DiscoveredPrinter.d.ts +14 -0
  56. package/dist/domain/entities/DiscoveredPrinter.d.ts.map +1 -0
  57. package/dist/domain/entities/DiscoveredPrinter.js +2 -0
  58. package/dist/domain/entities/DiscoveredPrinter.js.map +1 -0
  59. package/dist/domain/entities/FileInfo.d.ts +26 -0
  60. package/dist/domain/entities/FileInfo.d.ts.map +1 -0
  61. package/dist/domain/entities/FileInfo.js +2 -0
  62. package/dist/domain/entities/FileInfo.js.map +1 -0
  63. package/dist/domain/entities/PrintTask.d.ts +17 -0
  64. package/dist/domain/entities/PrintTask.d.ts.map +1 -0
  65. package/dist/domain/entities/PrintTask.js +2 -0
  66. package/dist/domain/entities/PrintTask.js.map +1 -0
  67. package/dist/domain/entities/PrinterAttributes.d.ts +44 -0
  68. package/dist/domain/entities/PrinterAttributes.d.ts.map +1 -0
  69. package/dist/domain/entities/PrinterAttributes.js +2 -0
  70. package/dist/domain/entities/PrinterAttributes.js.map +1 -0
  71. package/dist/domain/entities/PrinterInfo.d.ts +16 -0
  72. package/dist/domain/entities/PrinterInfo.d.ts.map +1 -0
  73. package/dist/domain/entities/PrinterInfo.js +2 -0
  74. package/dist/domain/entities/PrinterInfo.js.map +1 -0
  75. package/dist/domain/entities/PrinterStatus.d.ts +86 -0
  76. package/dist/domain/entities/PrinterStatus.d.ts.map +1 -0
  77. package/dist/domain/entities/PrinterStatus.js +2 -0
  78. package/dist/domain/entities/PrinterStatus.js.map +1 -0
  79. package/dist/domain/events/PrinterAttributesEvent.d.ts +7 -0
  80. package/dist/domain/events/PrinterAttributesEvent.d.ts.map +1 -0
  81. package/dist/domain/events/PrinterAttributesEvent.js +2 -0
  82. package/dist/domain/events/PrinterAttributesEvent.js.map +1 -0
  83. package/dist/domain/events/PrinterConnectionEvent.d.ts +6 -0
  84. package/dist/domain/events/PrinterConnectionEvent.d.ts.map +1 -0
  85. package/dist/domain/events/PrinterConnectionEvent.js +2 -0
  86. package/dist/domain/events/PrinterConnectionEvent.js.map +1 -0
  87. package/dist/domain/events/PrinterStatusEvent.d.ts +7 -0
  88. package/dist/domain/events/PrinterStatusEvent.d.ts.map +1 -0
  89. package/dist/domain/events/PrinterStatusEvent.js +2 -0
  90. package/dist/domain/events/PrinterStatusEvent.js.map +1 -0
  91. package/dist/domain/ports/DiscoveryAdapter.d.ts +10 -0
  92. package/dist/domain/ports/DiscoveryAdapter.d.ts.map +1 -0
  93. package/dist/domain/ports/DiscoveryAdapter.js +2 -0
  94. package/dist/domain/ports/DiscoveryAdapter.js.map +1 -0
  95. package/dist/domain/ports/EventBus.d.ts +8 -0
  96. package/dist/domain/ports/EventBus.d.ts.map +1 -0
  97. package/dist/domain/ports/EventBus.js +2 -0
  98. package/dist/domain/ports/EventBus.js.map +1 -0
  99. package/dist/domain/ports/FileAdapter.d.ts +26 -0
  100. package/dist/domain/ports/FileAdapter.d.ts.map +1 -0
  101. package/dist/domain/ports/FileAdapter.js +2 -0
  102. package/dist/domain/ports/FileAdapter.js.map +1 -0
  103. package/dist/domain/ports/PrinterAdapter.d.ts +74 -0
  104. package/dist/domain/ports/PrinterAdapter.d.ts.map +1 -0
  105. package/dist/domain/ports/PrinterAdapter.js +2 -0
  106. package/dist/domain/ports/PrinterAdapter.js.map +1 -0
  107. package/dist/domain/types/ErrorCode.d.ts +43 -0
  108. package/dist/domain/types/ErrorCode.d.ts.map +1 -0
  109. package/dist/domain/types/ErrorCode.js +49 -0
  110. package/dist/domain/types/ErrorCode.js.map +1 -0
  111. package/dist/domain/types/PrinterState.d.ts +24 -0
  112. package/dist/domain/types/PrinterState.d.ts.map +1 -0
  113. package/dist/domain/types/PrinterState.js +25 -0
  114. package/dist/domain/types/PrinterState.js.map +1 -0
  115. package/dist/domain/types/PrinterSubState.d.ts +59 -0
  116. package/dist/domain/types/PrinterSubState.d.ts.map +1 -0
  117. package/dist/domain/types/PrinterSubState.js +73 -0
  118. package/dist/domain/types/PrinterSubState.js.map +1 -0
  119. package/dist/domain/types/PrinterType.d.ts +8 -0
  120. package/dist/domain/types/PrinterType.d.ts.map +1 -0
  121. package/dist/domain/types/PrinterType.js +9 -0
  122. package/dist/domain/types/PrinterType.js.map +1 -0
  123. package/dist/domain/value-objects/PrinterId.d.ts +7 -0
  124. package/dist/domain/value-objects/PrinterId.d.ts.map +1 -0
  125. package/dist/domain/value-objects/PrinterId.js +6 -0
  126. package/dist/domain/value-objects/PrinterId.js.map +1 -0
  127. package/dist/domain/value-objects/Progress.d.ts +9 -0
  128. package/dist/domain/value-objects/Progress.d.ts.map +1 -0
  129. package/dist/domain/value-objects/Progress.js +4 -0
  130. package/dist/domain/value-objects/Progress.js.map +1 -0
  131. package/dist/domain/value-objects/Temperature.d.ts +8 -0
  132. package/dist/domain/value-objects/Temperature.d.ts.map +1 -0
  133. package/dist/domain/value-objects/Temperature.js +4 -0
  134. package/dist/domain/value-objects/Temperature.js.map +1 -0
  135. package/dist/index.d.ts +19 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +10 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.d.ts +6 -0
  140. package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.d.ts.map +1 -0
  141. package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.js +39 -0
  142. package/dist/infrastructure/adapters/cc-v1/CcV1DiscoveryAdapter.js.map +1 -0
  143. package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.d.ts +16 -0
  144. package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.d.ts.map +1 -0
  145. package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.js +87 -0
  146. package/dist/infrastructure/adapters/cc-v1/CcV1FileAdapter.js.map +1 -0
  147. package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.d.ts +47 -0
  148. package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.d.ts.map +1 -0
  149. package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.js +332 -0
  150. package/dist/infrastructure/adapters/cc-v1/CcV1PrinterAdapter.js.map +1 -0
  151. package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.d.ts +36 -0
  152. package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.d.ts.map +1 -0
  153. package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.js +59 -0
  154. package/dist/infrastructure/adapters/cc-v1/CcV1StatusMapper.js.map +1 -0
  155. package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.d.ts +6 -0
  156. package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.d.ts.map +1 -0
  157. package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.js +41 -0
  158. package/dist/infrastructure/adapters/cc-v2/CcV2DiscoveryAdapter.js.map +1 -0
  159. package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.d.ts +16 -0
  160. package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.d.ts.map +1 -0
  161. package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.js +117 -0
  162. package/dist/infrastructure/adapters/cc-v2/CcV2FileAdapter.js.map +1 -0
  163. package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.d.ts +50 -0
  164. package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.d.ts.map +1 -0
  165. package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.js +410 -0
  166. package/dist/infrastructure/adapters/cc-v2/CcV2PrinterAdapter.js.map +1 -0
  167. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.d.ts +81 -0
  168. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.d.ts.map +1 -0
  169. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.js +116 -0
  170. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.js.map +1 -0
  171. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.d.ts +2 -0
  172. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.d.ts.map +1 -0
  173. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.js +59 -0
  174. package/dist/infrastructure/adapters/cc-v2/CcV2StatusMapper.test.js.map +1 -0
  175. package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.d.ts +16 -0
  176. package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.d.ts.map +1 -0
  177. package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.js +137 -0
  178. package/dist/infrastructure/adapters/moonraker/MoonrakerFileAdapter.js.map +1 -0
  179. package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.d.ts +52 -0
  180. package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.d.ts.map +1 -0
  181. package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.js +303 -0
  182. package/dist/infrastructure/adapters/moonraker/MoonrakerPrinterAdapter.js.map +1 -0
  183. package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.d.ts +37 -0
  184. package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.d.ts.map +1 -0
  185. package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.js +84 -0
  186. package/dist/infrastructure/adapters/moonraker/MoonrakerStatusMapper.js.map +1 -0
  187. package/dist/infrastructure/factory/PrinterAdapterFactory.d.ts +12 -0
  188. package/dist/infrastructure/factory/PrinterAdapterFactory.d.ts.map +1 -0
  189. package/dist/infrastructure/factory/PrinterAdapterFactory.js +42 -0
  190. package/dist/infrastructure/factory/PrinterAdapterFactory.js.map +1 -0
  191. package/dist/infrastructure/transport/Transport.d.ts +19 -0
  192. package/dist/infrastructure/transport/Transport.d.ts.map +1 -0
  193. package/dist/infrastructure/transport/Transport.js +2 -0
  194. package/dist/infrastructure/transport/Transport.js.map +1 -0
  195. package/dist/infrastructure/transport/http/HttpClient.d.ts +23 -0
  196. package/dist/infrastructure/transport/http/HttpClient.d.ts.map +1 -0
  197. package/dist/infrastructure/transport/http/HttpClient.js +73 -0
  198. package/dist/infrastructure/transport/http/HttpClient.js.map +1 -0
  199. package/dist/infrastructure/transport/mqtt/CcV2Codec.d.ts +46 -0
  200. package/dist/infrastructure/transport/mqtt/CcV2Codec.d.ts.map +1 -0
  201. package/dist/infrastructure/transport/mqtt/CcV2Codec.js +41 -0
  202. package/dist/infrastructure/transport/mqtt/CcV2Codec.js.map +1 -0
  203. package/dist/infrastructure/transport/mqtt/CcV2Codec.test.d.ts +2 -0
  204. package/dist/infrastructure/transport/mqtt/CcV2Codec.test.d.ts.map +1 -0
  205. package/dist/infrastructure/transport/mqtt/CcV2Codec.test.js +48 -0
  206. package/dist/infrastructure/transport/mqtt/CcV2Codec.test.js.map +1 -0
  207. package/dist/infrastructure/transport/mqtt/MqttTransport.d.ts +26 -0
  208. package/dist/infrastructure/transport/mqtt/MqttTransport.d.ts.map +1 -0
  209. package/dist/infrastructure/transport/mqtt/MqttTransport.js +188 -0
  210. package/dist/infrastructure/transport/mqtt/MqttTransport.js.map +1 -0
  211. package/dist/infrastructure/transport/udp/UdpSocket.d.ts +13 -0
  212. package/dist/infrastructure/transport/udp/UdpSocket.d.ts.map +1 -0
  213. package/dist/infrastructure/transport/udp/UdpSocket.js +37 -0
  214. package/dist/infrastructure/transport/udp/UdpSocket.js.map +1 -0
  215. package/dist/infrastructure/transport/websocket/CcV1Codec.d.ts +33 -0
  216. package/dist/infrastructure/transport/websocket/CcV1Codec.d.ts.map +1 -0
  217. package/dist/infrastructure/transport/websocket/CcV1Codec.js +51 -0
  218. package/dist/infrastructure/transport/websocket/CcV1Codec.js.map +1 -0
  219. package/dist/infrastructure/transport/websocket/CcV1Codec.test.d.ts +2 -0
  220. package/dist/infrastructure/transport/websocket/CcV1Codec.test.d.ts.map +1 -0
  221. package/dist/infrastructure/transport/websocket/CcV1Codec.test.js +79 -0
  222. package/dist/infrastructure/transport/websocket/CcV1Codec.test.js.map +1 -0
  223. package/dist/infrastructure/transport/websocket/WebSocketTransport.d.ts +13 -0
  224. package/dist/infrastructure/transport/websocket/WebSocketTransport.d.ts.map +1 -0
  225. package/dist/infrastructure/transport/websocket/WebSocketTransport.js +71 -0
  226. package/dist/infrastructure/transport/websocket/WebSocketTransport.js.map +1 -0
  227. package/docs/cc2-protocol.md +244 -0
  228. package/package.json +59 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 usarral
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,171 @@
1
+ # century-link-ts
2
+
3
+ An **unofficial**, community-written TypeScript library for communicating with Elegoo 3D printers over a local area network (LAN).
4
+
5
+ > **This project is not affiliated with, endorsed by, or connected to Elegoo Inc. in any way.**
6
+ > See the [Disclaimer](#disclaimer) section for full details.
7
+
8
+ ---
9
+
10
+ ## What this is
11
+
12
+ `century-link-ts` is an independent, open-source implementation of the LAN communication protocol used by Elegoo FDM printers (CC and CC2 series). It was built by reverse-engineering the publicly available [elegoo-link](https://github.com/elegooofficial/ElegooLink) C++ SDK and translating the protocol into a clean TypeScript library.
13
+
14
+ It does **not** use, bundle, or redistribute any proprietary code, firmware, or assets from Elegoo.
15
+
16
+ ### Supported printers
17
+
18
+ | Protocol | Transport | Printers | Tested |
19
+ |----------|-----------|----------|--------|
20
+ | Elegoo FDM CC (V1) | WebSocket · port 3030 | Neptune 4, Centauri Carbon | — |
21
+ | Elegoo FDM CC2 (V2) | MQTT · port 1883 | Centauri Carbon 2, OrangeStorm Giga | ✅ Centauri Carbon 2 |
22
+ | Moonraker / Klipper | HTTP + WebSocket | Any Klipper printer with Moonraker | — |
23
+
24
+ Cloud features (OAuth, Agora RTM) are out of scope — LAN only.
25
+
26
+ > **Tested hardware:** The CC2 protocol has been verified against a real **Elegoo Centauri Carbon 2** on a local network. CC (V1) and Klipper support are implemented based on the elegoo-link C++ SDK and Moonraker API respectively, but have not been tested against physical hardware.
27
+ >
28
+ > **Have a different printer?** If you try this library with another Elegoo model (or any Klipper printer) and it works — or doesn't — please [open an issue](../../issues) or leave a comment. Confirmed working machines will be added to the table above.
29
+
30
+ ---
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ npm install century-link-ts
36
+ # or
37
+ pnpm add century-link-ts
38
+ ```
39
+
40
+ Requires **Node.js ≥ 18**.
41
+
42
+ ---
43
+
44
+ ## Quick start
45
+
46
+ ```typescript
47
+ import { CenturyLink, PrinterType } from "century-link-ts";
48
+
49
+ const link = new CenturyLink();
50
+
51
+ // Discover printers on the local network
52
+ for await (const printer of link.discover({ timeoutMs: 5000 })) {
53
+ console.log(printer.model, printer.host);
54
+ }
55
+
56
+ // Connect
57
+ const result = await link.connect({
58
+ host: "192.168.1.100",
59
+ printerType: PrinterType.ELEGOO_FDM_CC2,
60
+ model: "Centauri Carbon 2",
61
+ });
62
+
63
+ if (!result.ok) {
64
+ console.error(result.error.message);
65
+ process.exit(1);
66
+ }
67
+
68
+ const printer = result.value;
69
+
70
+ // Subscribe to live status
71
+ printer.onStatus((status) => {
72
+ console.log(status.printer.state, `${status.printer.progress}%`);
73
+ });
74
+
75
+ // Upload and print
76
+ await printer.uploadFile({ localFilePath: "./model.gcode", fileName: "model.gcode", storageLocation: "local" });
77
+ await printer.startPrint({ fileName: "model.gcode", storageLocation: "local" });
78
+
79
+ // Later
80
+ await printer.disconnect();
81
+ ```
82
+
83
+ ---
84
+
85
+ ## API reference
86
+
87
+ ### `CenturyLink`
88
+
89
+ | Method | Returns | Description |
90
+ |--------|---------|-------------|
91
+ | `discover(params?)` | `AsyncIterable<DiscoveredPrinter>` | UDP broadcast discovery on the LAN |
92
+ | `connect(params)` | `Promise<Result<ConnectedPrinter>>` | Connect to a printer by IP |
93
+
94
+ ### `ConnectedPrinter`
95
+
96
+ | Method | Description |
97
+ |--------|-------------|
98
+ | `getStatus(timeoutMs?)` | Poll current printer status |
99
+ | `startPrint(params)` | Start a print job |
100
+ | `pausePrint()` | Pause the active print |
101
+ | `resumePrint()` | Resume a paused print |
102
+ | `stopPrint()` | Stop the active print |
103
+ | `uploadFile(params, onProgress?)` | Upload a file (CC2 only) |
104
+ | `getFiles(page?, pageSize?)` | List files on the printer |
105
+ | `onStatus(handler)` | Subscribe to live status push events |
106
+ | `onConnection(handler)` | Subscribe to connection state changes |
107
+ | `disconnect()` | Close the connection |
108
+
109
+ ### `Result<T>`
110
+
111
+ All async operations return `Result<T>` — a discriminated union with no thrown exceptions:
112
+
113
+ ```typescript
114
+ const result = await printer.getStatus();
115
+
116
+ if (result.ok) {
117
+ console.log(result.value.printer.state);
118
+ } else {
119
+ console.error(result.error.code, result.error.message);
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ## Architecture
126
+
127
+ The library follows **Hexagonal Architecture** (ports & adapters):
128
+
129
+ ```
130
+ src/
131
+ domain/ ← entities, value objects, port interfaces, events
132
+ application/ ← Result<T>, ElegooError, use cases
133
+ infrastructure/ ← WebSocket/MQTT/UDP/HTTP transports, printer adapters
134
+ CenturyLink.ts ← public facade
135
+ ```
136
+
137
+ The domain layer has zero runtime dependencies and no knowledge of any transport protocol. Adapters implement the `PrinterAdapter` port and can be swapped or extended independently.
138
+
139
+ ---
140
+
141
+ ## Development
142
+
143
+ ```bash
144
+ pnpm install
145
+ pnpm typecheck # TypeScript type check
146
+ pnpm test # Run unit tests (vitest)
147
+ pnpm build # Compile to dist/
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Disclaimer
153
+
154
+ **century-link-ts is an independent, unofficial project.**
155
+
156
+ - This library is **not** produced by, affiliated with, endorsed by, or in any way connected to **Elegoo Inc.** or any of its subsidiaries.
157
+ - "Elegoo", "Neptune", "Centauri Carbon", "OrangeStorm", and related product names are **trademarks of Elegoo Inc.** Their use here is solely for descriptive purposes (nominative fair use) to identify the hardware this library is designed to communicate with.
158
+ - This project was built by analyzing the publicly available [elegoo-link](https://github.com/elegooofficial/ElegooLink) open-source C++ SDK. No proprietary code, firmware, binaries, or trade secrets were used.
159
+ - The communication protocol implemented here is derived from public documentation and open-source reference implementations.
160
+ - Use of this library is **entirely at your own risk**. The author(s) accept no responsibility for damage to hardware, failed prints, voided warranties, or any other consequences arising from its use. This includes, but is not limited to, unintended movements, temperature changes, or any other commands sent to the printer.
161
+ - This library does not circumvent any access control or security mechanism. It communicates over the same local network protocol the official applications use.
162
+
163
+ If you are a representative of Elegoo Inc. and have concerns about this project, please open an issue or contact the maintainer directly before taking any action — this project exists to benefit the maker community and is maintained in good faith.
164
+
165
+ ---
166
+
167
+ ## License
168
+
169
+ MIT © [usarral](https://github.com/usarral)
170
+
171
+ This project is independent and unaffiliated with Elegoo Inc.
@@ -0,0 +1,53 @@
1
+ import { PrinterType } from "./domain/types/PrinterType.js";
2
+ import type { DiscoveredPrinter } from "./domain/entities/DiscoveredPrinter.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 { FileListData, FileDetail } from "./domain/entities/FileInfo.js";
7
+ import type { PrintTaskListData } from "./domain/entities/PrintTask.js";
8
+ import type { ConnectParams, StartPrintParams, FileDownloadTriggerParams, Unsubscribe } from "./domain/ports/PrinterAdapter.js";
9
+ import type { DiscoveryParams } from "./domain/ports/DiscoveryAdapter.js";
10
+ import type { FileUploadParams, FileDetailParams, ProgressCallback } from "./domain/ports/FileAdapter.js";
11
+ import type { Result } from "./application/result/Result.js";
12
+ export interface ConnectedPrinter {
13
+ readonly info: PrinterInfo;
14
+ getStatus(timeoutMs?: number): Promise<Result<PrinterStatusData>>;
15
+ getStatusRaw(timeoutMs?: number): Promise<Result<string>>;
16
+ getAttributes(timeoutMs?: number): Promise<Result<PrinterAttributes>>;
17
+ refreshPrinterStatus(): Promise<Result<void>>;
18
+ refreshPrinterAttributes(): Promise<Result<void>>;
19
+ startPrint(params: StartPrintParams): Promise<Result<void>>;
20
+ pausePrint(): Promise<Result<void>>;
21
+ resumePrint(): Promise<Result<void>>;
22
+ stopPrint(): Promise<Result<void>>;
23
+ uploadFile(params: FileUploadParams, onProgress?: ProgressCallback): Promise<Result<void>>;
24
+ cancelUpload(): Promise<Result<void>>;
25
+ getFiles(page?: number, pageSize?: number): Promise<Result<FileListData>>;
26
+ getFileDetail(params: FileDetailParams): Promise<Result<FileDetail>>;
27
+ getCanvasStatus(timeoutMs?: number): Promise<Result<CanvasStatus>>;
28
+ setAutoRefill(enable: boolean): Promise<Result<void>>;
29
+ updatePrinterName(name: string): Promise<Result<void>>;
30
+ homeAxis(axes: string): Promise<Result<void>>;
31
+ moveAxis(axes: string, distanceMm: number): Promise<Result<void>>;
32
+ setTemperature(targets: Readonly<Record<string, number>>): Promise<Result<void>>;
33
+ setFanSpeed(speeds: Readonly<Record<string, number>>): Promise<Result<void>>;
34
+ setPrintSpeed(mode: 0 | 1 | 2 | 3): Promise<Result<void>>;
35
+ getPrintTaskList(page?: number, pageSize?: number): Promise<Result<PrintTaskListData>>;
36
+ deletePrintTasks(taskIds: readonly string[]): Promise<Result<void>>;
37
+ triggerFileDownload(params: FileDownloadTriggerParams): Promise<Result<void>>;
38
+ cancelFileDownload(taskId: string): Promise<Result<void>>;
39
+ onStatus(handler: (status: PrinterStatusData) => void): Unsubscribe;
40
+ onAttributes(handler: (attrs: PrinterAttributes) => void): Unsubscribe;
41
+ onConnection(handler: (connected: boolean) => void): Unsubscribe;
42
+ disconnect(): Promise<void>;
43
+ }
44
+ export declare class CenturyLink {
45
+ static readonly VERSION = "0.1.0";
46
+ discover(params?: DiscoveryParams): AsyncIterable<DiscoveredPrinter>;
47
+ getSupportedPrinterTypes(): PrinterType[];
48
+ getVersion(): string;
49
+ connect(params: ConnectParams & {
50
+ printerType: PrinterType;
51
+ }): Promise<Result<ConnectedPrinter>>;
52
+ }
53
+ //# sourceMappingURL=CenturyLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CenturyLink.d.ts","sourceRoot":"","sources":["../src/CenturyLink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import { DiscoverPrintersUseCase } from "./application/use-cases/DiscoverPrintersUseCase.js";
2
+ import { ConnectPrinterUseCase } from "./application/use-cases/ConnectPrinterUseCase.js";
3
+ import { StartPrintUseCase } from "./application/use-cases/StartPrintUseCase.js";
4
+ import { PausePrintUseCase } from "./application/use-cases/PausePrintUseCase.js";
5
+ import { ResumePrintUseCase } from "./application/use-cases/ResumePrintUseCase.js";
6
+ import { StopPrintUseCase } from "./application/use-cases/StopPrintUseCase.js";
7
+ import { UploadFileUseCase } from "./application/use-cases/UploadFileUseCase.js";
8
+ import { GetFileListUseCase } from "./application/use-cases/GetFileListUseCase.js";
9
+ import { GetPrinterStatusUseCase } from "./application/use-cases/GetPrinterStatusUseCase.js";
10
+ import { createPrinterAdapter, createDiscoveryAdapters, createFileAdapter } from "./infrastructure/factory/PrinterAdapterFactory.js";
11
+ import { ElegooError } from "./application/result/ElegooError.js";
12
+ import { ErrorCode } from "./domain/types/ErrorCode.js";
13
+ import { PrinterType } from "./domain/types/PrinterType.js";
14
+ import { err } from "./application/result/Result.js";
15
+ export class CenturyLink {
16
+ static VERSION = "0.1.0";
17
+ discover(params) {
18
+ const adapters = createDiscoveryAdapters();
19
+ const useCase = new DiscoverPrintersUseCase(adapters);
20
+ return useCase.execute(params);
21
+ }
22
+ getSupportedPrinterTypes() {
23
+ return [
24
+ PrinterType.ELEGOO_FDM_CC,
25
+ PrinterType.ELEGOO_FDM_CC2,
26
+ PrinterType.ELEGOO_FDM_KLIPPER,
27
+ PrinterType.GENERIC_FDM_KLIPPER,
28
+ ];
29
+ }
30
+ getVersion() {
31
+ return CenturyLink.VERSION;
32
+ }
33
+ async connect(params) {
34
+ const printerAdapter = createPrinterAdapter(params.printerType);
35
+ const connectUseCase = new ConnectPrinterUseCase(printerAdapter);
36
+ const result = await connectUseCase.execute(params);
37
+ if (!result.ok)
38
+ return result;
39
+ const info = result.value;
40
+ let fileAdapter;
41
+ try {
42
+ fileAdapter = createFileAdapter(params.printerType, params.host, params.accessCode ?? params.token, params.port);
43
+ }
44
+ catch {
45
+ // Some printer types may not have a file adapter — that's fine
46
+ }
47
+ const noFileAdapter = () => Promise.resolve(err(new ElegooError(ErrorCode.OPERATION_NOT_IMPLEMENTED, "Not supported for this printer type")));
48
+ const connectedPrinter = {
49
+ info,
50
+ getStatus: (timeoutMs) => new GetPrinterStatusUseCase(printerAdapter).execute(timeoutMs),
51
+ getStatusRaw: (timeoutMs) => printerAdapter.getStatusRaw(timeoutMs),
52
+ getAttributes: (timeoutMs) => printerAdapter.getAttributes(timeoutMs),
53
+ refreshPrinterStatus: () => printerAdapter.refreshPrinterStatus(),
54
+ refreshPrinterAttributes: () => printerAdapter.refreshPrinterAttributes(),
55
+ startPrint: (p) => new StartPrintUseCase(printerAdapter).execute(p),
56
+ pausePrint: () => new PausePrintUseCase(printerAdapter).execute(),
57
+ resumePrint: () => new ResumePrintUseCase(printerAdapter).execute(),
58
+ stopPrint: () => new StopPrintUseCase(printerAdapter).execute(),
59
+ uploadFile: (p, onProgress) => {
60
+ if (!fileAdapter)
61
+ return noFileAdapter();
62
+ return new UploadFileUseCase(fileAdapter).execute(p, onProgress);
63
+ },
64
+ cancelUpload: () => {
65
+ if (!fileAdapter)
66
+ return noFileAdapter();
67
+ return fileAdapter.cancelUpload();
68
+ },
69
+ getFiles: (page, pageSize) => {
70
+ if (printerAdapter.getFileList)
71
+ return printerAdapter.getFileList(page, pageSize);
72
+ if (!fileAdapter)
73
+ return noFileAdapter();
74
+ return new GetFileListUseCase(fileAdapter).execute({ page, pageSize });
75
+ },
76
+ getFileDetail: (p) => {
77
+ if (printerAdapter.getFileDetail)
78
+ return printerAdapter.getFileDetail(p);
79
+ if (!fileAdapter)
80
+ return noFileAdapter();
81
+ return fileAdapter.getFileDetail(p);
82
+ },
83
+ getCanvasStatus: (timeoutMs) => printerAdapter.getCanvasStatus(timeoutMs),
84
+ setAutoRefill: (enable) => printerAdapter.setAutoRefill(enable),
85
+ updatePrinterName: (name) => printerAdapter.updatePrinterName(name),
86
+ homeAxis: (axes) => printerAdapter.homeAxis(axes),
87
+ moveAxis: (axes, distanceMm) => printerAdapter.moveAxis(axes, distanceMm),
88
+ setTemperature: (targets) => printerAdapter.setTemperature(targets),
89
+ setFanSpeed: (speeds) => printerAdapter.setFanSpeed(speeds),
90
+ setPrintSpeed: (mode) => printerAdapter.setPrintSpeed(mode),
91
+ getPrintTaskList: (page, pageSize) => printerAdapter.getPrintTaskList(page, pageSize),
92
+ deletePrintTasks: (taskIds) => printerAdapter.deletePrintTasks(taskIds),
93
+ triggerFileDownload: (p) => printerAdapter.triggerFileDownload(p),
94
+ cancelFileDownload: (taskId) => printerAdapter.cancelFileDownload(taskId),
95
+ onStatus: (handler) => printerAdapter.onStatus(handler),
96
+ onAttributes: (handler) => printerAdapter.onAttributes(handler),
97
+ onConnection: (handler) => printerAdapter.onConnection(handler),
98
+ disconnect: () => printerAdapter.disconnect(),
99
+ };
100
+ return { ok: true, value: connectedPrinter };
101
+ }
102
+ }
103
+ //# sourceMappingURL=CenturyLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CenturyLink.js","sourceRoot":"","sources":["../src/CenturyLink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ErrorCode } from "../../domain/types/ErrorCode.js";
2
+ export declare class ElegooError extends Error {
3
+ readonly code: ErrorCode;
4
+ readonly cause?: unknown | undefined;
5
+ constructor(code: ErrorCode, message: string, cause?: unknown | undefined);
6
+ }
7
+ //# sourceMappingURL=ElegooError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElegooError.d.ts","sourceRoot":"","sources":["../../../src/application/result/ElegooError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,SAAS;aAEf,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,SAAS,EAC/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC"}
@@ -0,0 +1,11 @@
1
+ export class ElegooError extends Error {
2
+ code;
3
+ cause;
4
+ constructor(code, message, cause) {
5
+ super(message);
6
+ this.code = code;
7
+ this.cause = cause;
8
+ this.name = "ElegooError";
9
+ }
10
+ }
11
+ //# sourceMappingURL=ElegooError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElegooError.js","sourceRoot":"","sources":["../../../src/application/result/ElegooError.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB;IAEA;IAHlB,YACkB,IAAe,EAC/B,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAW;QAEf,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ElegooError } from "./ElegooError.js";
2
+ export type Result<T> = {
3
+ readonly ok: true;
4
+ readonly value: T;
5
+ } | {
6
+ readonly ok: false;
7
+ readonly error: ElegooError;
8
+ };
9
+ export declare function ok<T>(value: T): Result<T>;
10
+ export declare function err(error: ElegooError): Result<never>;
11
+ export declare function mapResult<T, U>(result: Result<T>, fn: (value: T) => U): Result<U>;
12
+ //# sourceMappingURL=Result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.d.ts","sourceRoot":"","sources":["../../../src/application/result/Result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAExD,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAEzC;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAErD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAC5B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAClB,MAAM,CAAC,CAAC,CAAC,CAGX"}
@@ -0,0 +1,12 @@
1
+ export function ok(value) {
2
+ return { ok: true, value };
3
+ }
4
+ export function err(error) {
5
+ return { ok: false, error };
6
+ }
7
+ export function mapResult(result, fn) {
8
+ if (result.ok)
9
+ return ok(fn(result.value));
10
+ return result;
11
+ }
12
+ //# sourceMappingURL=Result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.js","sourceRoot":"","sources":["../../../src/application/result/Result.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAkB;IACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAAiB,EACjB,EAAmB;IAEnB,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Result.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.test.d.ts","sourceRoot":"","sources":["../../../src/application/result/Result.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ok, err, mapResult } from "./Result.js";
3
+ import { ElegooError } from "./ElegooError.js";
4
+ import { ErrorCode } from "../../domain/types/ErrorCode.js";
5
+ describe("Result", () => {
6
+ it("ok wraps a value", () => {
7
+ const result = ok(42);
8
+ expect(result.ok).toBe(true);
9
+ if (result.ok)
10
+ expect(result.value).toBe(42);
11
+ });
12
+ it("err wraps an error", () => {
13
+ const error = new ElegooError(ErrorCode.NETWORK_ERROR, "connection failed");
14
+ const result = err(error);
15
+ expect(result.ok).toBe(false);
16
+ if (!result.ok)
17
+ expect(result.error).toBe(error);
18
+ });
19
+ it("mapResult transforms ok value", () => {
20
+ const result = mapResult(ok(5), (n) => n * 2);
21
+ expect(result.ok).toBe(true);
22
+ if (result.ok)
23
+ expect(result.value).toBe(10);
24
+ });
25
+ it("mapResult passes err through unchanged", () => {
26
+ const error = new ElegooError(ErrorCode.OPERATION_TIMEOUT, "timed out");
27
+ const result = mapResult(err(error), (n) => n * 2);
28
+ expect(result.ok).toBe(false);
29
+ if (!result.ok)
30
+ expect(result.error).toBe(error);
31
+ });
32
+ });
33
+ describe("ElegooError", () => {
34
+ it("stores code and message", () => {
35
+ const e = new ElegooError(ErrorCode.PRINTER_NOT_FOUND, "not found");
36
+ expect(e.code).toBe(ErrorCode.PRINTER_NOT_FOUND);
37
+ expect(e.message).toBe("not found");
38
+ expect(e.name).toBe("ElegooError");
39
+ });
40
+ it("stores optional cause", () => {
41
+ const cause = new Error("root cause");
42
+ const e = new ElegooError(ErrorCode.NETWORK_ERROR, "failed", cause);
43
+ expect(e.cause).toBe(cause);
44
+ });
45
+ });
46
+ //# sourceMappingURL=Result.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.test.js","sourceRoot":"","sources":["../../../src/application/result/Result.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PrinterAdapter, ConnectParams } from "../../domain/ports/PrinterAdapter.js";
2
+ import type { PrinterInfo } from "../../domain/entities/PrinterInfo.js";
3
+ import type { Result } from "../result/Result.js";
4
+ export declare class ConnectPrinterUseCase {
5
+ private readonly adapter;
6
+ constructor(adapter: PrinterAdapter);
7
+ execute(params: ConnectParams): Promise<Result<PrinterInfo>>;
8
+ }
9
+ //# sourceMappingURL=ConnectPrinterUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectPrinterUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/ConnectPrinterUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;CAG7D"}
@@ -0,0 +1,10 @@
1
+ export class ConnectPrinterUseCase {
2
+ adapter;
3
+ constructor(adapter) {
4
+ this.adapter = adapter;
5
+ }
6
+ execute(params) {
7
+ return this.adapter.connect(params);
8
+ }
9
+ }
10
+ //# sourceMappingURL=ConnectPrinterUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectPrinterUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/ConnectPrinterUseCase.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,OAAO,CAAC,MAAqB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { DiscoveryAdapter, DiscoveryParams } from "../../domain/ports/DiscoveryAdapter.js";
2
+ import type { DiscoveredPrinter } from "../../domain/entities/DiscoveredPrinter.js";
3
+ export declare class DiscoverPrintersUseCase {
4
+ private readonly adapters;
5
+ constructor(adapters: readonly DiscoveryAdapter[]);
6
+ execute(params?: DiscoveryParams): AsyncIterable<DiscoveredPrinter>;
7
+ }
8
+ //# sourceMappingURL=DiscoverPrintersUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoverPrintersUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/DiscoverPrintersUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAEpF,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,SAAS,gBAAgB,EAAE;IAE3D,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,aAAa,CAAC,iBAAiB,CAAC;CAiC3E"}
@@ -0,0 +1,36 @@
1
+ export class DiscoverPrintersUseCase {
2
+ adapters;
3
+ constructor(adapters) {
4
+ this.adapters = adapters;
5
+ }
6
+ async *execute(params) {
7
+ const streams = this.adapters.map((a) => a.discover(params));
8
+ const queue = [];
9
+ let done = 0;
10
+ let resolve = null;
11
+ const notify = (printer) => {
12
+ queue.push(printer);
13
+ resolve?.();
14
+ };
15
+ const promises = streams.map(async (stream) => {
16
+ for await (const printer of stream) {
17
+ notify(printer);
18
+ }
19
+ done++;
20
+ resolve?.();
21
+ });
22
+ while (done < streams.length || queue.length > 0) {
23
+ if (queue.length === 0) {
24
+ await new Promise((r) => {
25
+ resolve = r;
26
+ });
27
+ resolve = null;
28
+ }
29
+ while (queue.length > 0) {
30
+ yield queue.shift();
31
+ }
32
+ }
33
+ await Promise.all(promises);
34
+ }
35
+ }
36
+ //# sourceMappingURL=DiscoverPrintersUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoverPrintersUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/DiscoverPrintersUseCase.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,uBAAuB;IACL;IAA7B,YAA6B,QAAqC;QAArC,aAAQ,GAAR,QAAQ,CAA6B;IAAG,CAAC;IAEtE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAwB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAwB,IAAI,CAAC;QAExC,MAAM,MAAM,GAAG,CAAC,OAA0B,EAAE,EAAE;YAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,EAAE,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;gBACnC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;oBAC5B,OAAO,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,KAAK,CAAC,KAAK,EAAG,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { FileAdapter, FileListParams } from "../../domain/ports/FileAdapter.js";
2
+ import type { FileListData } from "../../domain/entities/FileInfo.js";
3
+ import type { Result } from "../result/Result.js";
4
+ export declare class GetFileListUseCase {
5
+ private readonly adapter;
6
+ constructor(adapter: FileAdapter);
7
+ execute(params?: FileListParams): Promise<Result<FileListData>>;
8
+ }
9
+ //# sourceMappingURL=GetFileListUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetFileListUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/GetFileListUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAEjD,OAAO,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;CAGhE"}
@@ -0,0 +1,10 @@
1
+ export class GetFileListUseCase {
2
+ adapter;
3
+ constructor(adapter) {
4
+ this.adapter = adapter;
5
+ }
6
+ execute(params) {
7
+ return this.adapter.getFileList(params);
8
+ }
9
+ }
10
+ //# sourceMappingURL=GetFileListUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetFileListUseCase.js","sourceRoot":"","sources":["../../../src/application/use-cases/GetFileListUseCase.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAG,CAAC;IAErD,OAAO,CAAC,MAAuB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { PrinterAdapter } from "../../domain/ports/PrinterAdapter.js";
2
+ import type { PrinterStatusData } from "../../domain/entities/PrinterStatus.js";
3
+ import type { Result } from "../result/Result.js";
4
+ export declare class GetPrinterStatusUseCase {
5
+ private readonly adapter;
6
+ constructor(adapter: PrinterAdapter);
7
+ execute(timeoutMs?: number): Promise<Result<PrinterStatusData>>;
8
+ }
9
+ //# sourceMappingURL=GetPrinterStatusUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetPrinterStatusUseCase.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/GetPrinterStatusUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;CAGhE"}