@lhremote/core 0.0.0 → 0.2.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 (551) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +124 -0
  3. package/dist/cdp/app-discovery.d.ts +22 -0
  4. package/dist/cdp/app-discovery.d.ts.map +1 -0
  5. package/dist/cdp/app-discovery.js +60 -0
  6. package/dist/cdp/app-discovery.js.map +1 -0
  7. package/dist/cdp/app-discovery.test.d.ts +2 -0
  8. package/dist/cdp/app-discovery.test.d.ts.map +1 -0
  9. package/dist/cdp/app-discovery.test.js +124 -0
  10. package/dist/cdp/app-discovery.test.js.map +1 -0
  11. package/dist/cdp/client.d.ts +114 -0
  12. package/dist/cdp/client.d.ts.map +1 -0
  13. package/dist/cdp/client.integration.test.d.ts +2 -0
  14. package/dist/cdp/client.integration.test.d.ts.map +1 -0
  15. package/dist/cdp/client.integration.test.js +77 -0
  16. package/dist/cdp/client.integration.test.js.map +1 -0
  17. package/dist/cdp/client.js +319 -0
  18. package/dist/cdp/client.js.map +1 -0
  19. package/dist/cdp/client.test.d.ts +2 -0
  20. package/dist/cdp/client.test.d.ts.map +1 -0
  21. package/dist/cdp/client.test.js +533 -0
  22. package/dist/cdp/client.test.js.map +1 -0
  23. package/dist/cdp/discovery.d.ts +14 -0
  24. package/dist/cdp/discovery.d.ts.map +1 -0
  25. package/dist/cdp/discovery.integration.test.d.ts +2 -0
  26. package/dist/cdp/discovery.integration.test.d.ts.map +1 -0
  27. package/dist/cdp/discovery.integration.test.js +27 -0
  28. package/dist/cdp/discovery.integration.test.js.map +1 -0
  29. package/dist/cdp/discovery.js +33 -0
  30. package/dist/cdp/discovery.js.map +1 -0
  31. package/dist/cdp/discovery.test.d.ts +2 -0
  32. package/dist/cdp/discovery.test.d.ts.map +1 -0
  33. package/dist/cdp/discovery.test.js +56 -0
  34. package/dist/cdp/discovery.test.js.map +1 -0
  35. package/dist/cdp/errors.d.ts +28 -0
  36. package/dist/cdp/errors.d.ts.map +1 -0
  37. package/dist/cdp/errors.js +42 -0
  38. package/dist/cdp/errors.js.map +1 -0
  39. package/dist/cdp/errors.test.d.ts +2 -0
  40. package/dist/cdp/errors.test.d.ts.map +1 -0
  41. package/dist/cdp/errors.test.js +37 -0
  42. package/dist/cdp/errors.test.js.map +1 -0
  43. package/dist/cdp/index.d.ts +6 -0
  44. package/dist/cdp/index.d.ts.map +1 -0
  45. package/dist/cdp/index.js +8 -0
  46. package/dist/cdp/index.js.map +1 -0
  47. package/dist/cdp/instance-discovery.d.ts +30 -0
  48. package/dist/cdp/instance-discovery.d.ts.map +1 -0
  49. package/dist/cdp/instance-discovery.integration.test.d.ts +2 -0
  50. package/dist/cdp/instance-discovery.integration.test.d.ts.map +1 -0
  51. package/dist/cdp/instance-discovery.integration.test.js +36 -0
  52. package/dist/cdp/instance-discovery.integration.test.js.map +1 -0
  53. package/dist/cdp/instance-discovery.js +118 -0
  54. package/dist/cdp/instance-discovery.js.map +1 -0
  55. package/dist/cdp/instance-discovery.test.d.ts +2 -0
  56. package/dist/cdp/instance-discovery.test.d.ts.map +1 -0
  57. package/dist/cdp/instance-discovery.test.js +112 -0
  58. package/dist/cdp/instance-discovery.test.js.map +1 -0
  59. package/dist/cdp/testing/launch-chromium.d.ts +24 -0
  60. package/dist/cdp/testing/launch-chromium.d.ts.map +1 -0
  61. package/dist/cdp/testing/launch-chromium.js +93 -0
  62. package/dist/cdp/testing/launch-chromium.js.map +1 -0
  63. package/dist/constants.d.ts +5 -0
  64. package/dist/constants.d.ts.map +1 -0
  65. package/dist/constants.js +7 -0
  66. package/dist/constants.js.map +1 -0
  67. package/dist/data/action-types.d.ts +39 -0
  68. package/dist/data/action-types.d.ts.map +1 -0
  69. package/dist/data/action-types.js +497 -0
  70. package/dist/data/action-types.js.map +1 -0
  71. package/dist/data/action-types.test.d.ts +2 -0
  72. package/dist/data/action-types.test.d.ts.map +1 -0
  73. package/dist/data/action-types.test.js +544 -0
  74. package/dist/data/action-types.test.js.map +1 -0
  75. package/dist/data/index.d.ts +3 -0
  76. package/dist/data/index.d.ts.map +1 -0
  77. package/dist/data/index.js +4 -0
  78. package/dist/data/index.js.map +1 -0
  79. package/dist/db/client.d.ts +27 -0
  80. package/dist/db/client.d.ts.map +1 -0
  81. package/dist/db/client.integration.test.d.ts +2 -0
  82. package/dist/db/client.integration.test.d.ts.map +1 -0
  83. package/dist/db/client.integration.test.js +63 -0
  84. package/dist/db/client.integration.test.js.map +1 -0
  85. package/dist/db/client.js +23 -0
  86. package/dist/db/client.js.map +1 -0
  87. package/dist/db/client.test.d.ts +2 -0
  88. package/dist/db/client.test.d.ts.map +1 -0
  89. package/dist/db/client.test.js +48 -0
  90. package/dist/db/client.test.js.map +1 -0
  91. package/dist/db/discovery.d.ts +14 -0
  92. package/dist/db/discovery.d.ts.map +1 -0
  93. package/dist/db/discovery.integration.test.d.ts +2 -0
  94. package/dist/db/discovery.integration.test.d.ts.map +1 -0
  95. package/dist/db/discovery.integration.test.js +101 -0
  96. package/dist/db/discovery.integration.test.js.map +1 -0
  97. package/dist/db/discovery.js +76 -0
  98. package/dist/db/discovery.js.map +1 -0
  99. package/dist/db/discovery.test.d.ts +2 -0
  100. package/dist/db/discovery.test.d.ts.map +1 -0
  101. package/dist/db/discovery.test.js +125 -0
  102. package/dist/db/discovery.test.js.map +1 -0
  103. package/dist/db/errors.d.ts +52 -0
  104. package/dist/db/errors.d.ts.map +1 -0
  105. package/dist/db/errors.js +82 -0
  106. package/dist/db/errors.js.map +1 -0
  107. package/dist/db/errors.test.d.ts +2 -0
  108. package/dist/db/errors.test.d.ts.map +1 -0
  109. package/dist/db/errors.test.js +34 -0
  110. package/dist/db/errors.test.js.map +1 -0
  111. package/dist/db/escape-like.d.ts +8 -0
  112. package/dist/db/escape-like.d.ts.map +1 -0
  113. package/dist/db/escape-like.js +12 -0
  114. package/dist/db/escape-like.js.map +1 -0
  115. package/dist/db/escape-like.test.d.ts +2 -0
  116. package/dist/db/escape-like.test.d.ts.map +1 -0
  117. package/dist/db/escape-like.test.js +25 -0
  118. package/dist/db/escape-like.test.js.map +1 -0
  119. package/dist/db/index.d.ts +5 -0
  120. package/dist/db/index.d.ts.map +1 -0
  121. package/dist/db/index.js +7 -0
  122. package/dist/db/index.js.map +1 -0
  123. package/dist/db/repositories/campaign-exclude-list.d.ts +89 -0
  124. package/dist/db/repositories/campaign-exclude-list.d.ts.map +1 -0
  125. package/dist/db/repositories/campaign-exclude-list.js +204 -0
  126. package/dist/db/repositories/campaign-exclude-list.js.map +1 -0
  127. package/dist/db/repositories/campaign-exclude-list.test.d.ts +2 -0
  128. package/dist/db/repositories/campaign-exclude-list.test.d.ts.map +1 -0
  129. package/dist/db/repositories/campaign-exclude-list.test.js +132 -0
  130. package/dist/db/repositories/campaign-exclude-list.test.js.map +1 -0
  131. package/dist/db/repositories/campaign-statistics.d.ts +58 -0
  132. package/dist/db/repositories/campaign-statistics.d.ts.map +1 -0
  133. package/dist/db/repositories/campaign-statistics.js +278 -0
  134. package/dist/db/repositories/campaign-statistics.js.map +1 -0
  135. package/dist/db/repositories/campaign-statistics.test.d.ts +2 -0
  136. package/dist/db/repositories/campaign-statistics.test.d.ts.map +1 -0
  137. package/dist/db/repositories/campaign-statistics.test.js +266 -0
  138. package/dist/db/repositories/campaign-statistics.test.js.map +1 -0
  139. package/dist/db/repositories/campaign.d.ts +103 -0
  140. package/dist/db/repositories/campaign.d.ts.map +1 -0
  141. package/dist/db/repositories/campaign.js +388 -0
  142. package/dist/db/repositories/campaign.js.map +1 -0
  143. package/dist/db/repositories/campaign.test.d.ts +2 -0
  144. package/dist/db/repositories/campaign.test.d.ts.map +1 -0
  145. package/dist/db/repositories/campaign.test.js +392 -0
  146. package/dist/db/repositories/campaign.test.js.map +1 -0
  147. package/dist/db/repositories/index.d.ts +6 -0
  148. package/dist/db/repositories/index.d.ts.map +1 -0
  149. package/dist/db/repositories/index.js +8 -0
  150. package/dist/db/repositories/index.js.map +1 -0
  151. package/dist/db/repositories/message.d.ts +57 -0
  152. package/dist/db/repositories/message.d.ts.map +1 -0
  153. package/dist/db/repositories/message.integration.test.d.ts +2 -0
  154. package/dist/db/repositories/message.integration.test.d.ts.map +1 -0
  155. package/dist/db/repositories/message.integration.test.js +137 -0
  156. package/dist/db/repositories/message.integration.test.js.map +1 -0
  157. package/dist/db/repositories/message.js +308 -0
  158. package/dist/db/repositories/message.js.map +1 -0
  159. package/dist/db/repositories/message.test.d.ts +2 -0
  160. package/dist/db/repositories/message.test.d.ts.map +1 -0
  161. package/dist/db/repositories/message.test.js +179 -0
  162. package/dist/db/repositories/message.test.js.map +1 -0
  163. package/dist/db/repositories/profile.d.ts +42 -0
  164. package/dist/db/repositories/profile.d.ts.map +1 -0
  165. package/dist/db/repositories/profile.integration.test.d.ts +2 -0
  166. package/dist/db/repositories/profile.integration.test.d.ts.map +1 -0
  167. package/dist/db/repositories/profile.integration.test.js +222 -0
  168. package/dist/db/repositories/profile.integration.test.js.map +1 -0
  169. package/dist/db/repositories/profile.js +163 -0
  170. package/dist/db/repositories/profile.js.map +1 -0
  171. package/dist/db/repositories/profile.test.d.ts +2 -0
  172. package/dist/db/repositories/profile.test.d.ts.map +1 -0
  173. package/dist/db/repositories/profile.test.js +216 -0
  174. package/dist/db/repositories/profile.test.js.map +1 -0
  175. package/dist/db/testing/create-fixture.d.ts +2 -0
  176. package/dist/db/testing/create-fixture.d.ts.map +1 -0
  177. package/dist/db/testing/create-fixture.js +745 -0
  178. package/dist/db/testing/create-fixture.js.map +1 -0
  179. package/dist/db/testing/open-fixture.d.ts +15 -0
  180. package/dist/db/testing/open-fixture.d.ts.map +1 -0
  181. package/dist/db/testing/open-fixture.js +39 -0
  182. package/dist/db/testing/open-fixture.js.map +1 -0
  183. package/dist/formats/campaign-format.d.ts +31 -0
  184. package/dist/formats/campaign-format.d.ts.map +1 -0
  185. package/dist/formats/campaign-format.js +225 -0
  186. package/dist/formats/campaign-format.js.map +1 -0
  187. package/dist/formats/campaign-format.test.d.ts +2 -0
  188. package/dist/formats/campaign-format.test.d.ts.map +1 -0
  189. package/dist/formats/campaign-format.test.js +442 -0
  190. package/dist/formats/campaign-format.test.js.map +1 -0
  191. package/dist/formats/errors.d.ts +7 -0
  192. package/dist/formats/errors.d.ts.map +1 -0
  193. package/dist/formats/errors.js +12 -0
  194. package/dist/formats/errors.js.map +1 -0
  195. package/dist/formats/index.d.ts +3 -0
  196. package/dist/formats/index.d.ts.map +1 -0
  197. package/dist/formats/index.js +5 -0
  198. package/dist/formats/index.js.map +1 -0
  199. package/dist/index.d.ts +10 -1
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +29 -1
  202. package/dist/index.js.map +1 -1
  203. package/dist/operations/campaign-add-action.d.ts +14 -0
  204. package/dist/operations/campaign-add-action.d.ts.map +1 -0
  205. package/dist/operations/campaign-add-action.js +33 -0
  206. package/dist/operations/campaign-add-action.js.map +1 -0
  207. package/dist/operations/campaign-add-action.test.d.ts +2 -0
  208. package/dist/operations/campaign-add-action.test.d.ts.map +1 -0
  209. package/dist/operations/campaign-add-action.test.js +122 -0
  210. package/dist/operations/campaign-add-action.test.js.map +1 -0
  211. package/dist/operations/campaign-create.d.ts +17 -0
  212. package/dist/operations/campaign-create.d.ts.map +1 -0
  213. package/dist/operations/campaign-create.js +21 -0
  214. package/dist/operations/campaign-create.js.map +1 -0
  215. package/dist/operations/campaign-create.test.d.ts +2 -0
  216. package/dist/operations/campaign-create.test.d.ts.map +1 -0
  217. package/dist/operations/campaign-create.test.js +113 -0
  218. package/dist/operations/campaign-create.test.js.map +1 -0
  219. package/dist/operations/campaign-delete.d.ts +20 -0
  220. package/dist/operations/campaign-delete.d.ts.map +1 -0
  221. package/dist/operations/campaign-delete.js +22 -0
  222. package/dist/operations/campaign-delete.js.map +1 -0
  223. package/dist/operations/campaign-delete.test.d.ts +2 -0
  224. package/dist/operations/campaign-delete.test.d.ts.map +1 -0
  225. package/dist/operations/campaign-delete.test.js +92 -0
  226. package/dist/operations/campaign-delete.test.js.map +1 -0
  227. package/dist/operations/campaign-exclude-add.d.ts +16 -0
  228. package/dist/operations/campaign-exclude-add.d.ts.map +1 -0
  229. package/dist/operations/campaign-exclude-add.js +27 -0
  230. package/dist/operations/campaign-exclude-add.js.map +1 -0
  231. package/dist/operations/campaign-exclude-add.test.d.ts +2 -0
  232. package/dist/operations/campaign-exclude-add.test.d.ts.map +1 -0
  233. package/dist/operations/campaign-exclude-add.test.js +114 -0
  234. package/dist/operations/campaign-exclude-add.test.js.map +1 -0
  235. package/dist/operations/campaign-exclude-list.d.ts +14 -0
  236. package/dist/operations/campaign-exclude-list.d.ts.map +1 -0
  237. package/dist/operations/campaign-exclude-list.js +26 -0
  238. package/dist/operations/campaign-exclude-list.js.map +1 -0
  239. package/dist/operations/campaign-exclude-list.test.d.ts +2 -0
  240. package/dist/operations/campaign-exclude-list.test.d.ts.map +1 -0
  241. package/dist/operations/campaign-exclude-list.test.js +113 -0
  242. package/dist/operations/campaign-exclude-list.test.js.map +1 -0
  243. package/dist/operations/campaign-exclude-remove.d.ts +16 -0
  244. package/dist/operations/campaign-exclude-remove.d.ts.map +1 -0
  245. package/dist/operations/campaign-exclude-remove.js +27 -0
  246. package/dist/operations/campaign-exclude-remove.js.map +1 -0
  247. package/dist/operations/campaign-exclude-remove.test.d.ts +2 -0
  248. package/dist/operations/campaign-exclude-remove.test.d.ts.map +1 -0
  249. package/dist/operations/campaign-exclude-remove.test.js +114 -0
  250. package/dist/operations/campaign-exclude-remove.test.js.map +1 -0
  251. package/dist/operations/campaign-export.d.ts +12 -0
  252. package/dist/operations/campaign-export.d.ts.map +1 -0
  253. package/dist/operations/campaign-export.js +24 -0
  254. package/dist/operations/campaign-export.js.map +1 -0
  255. package/dist/operations/campaign-export.test.d.ts +2 -0
  256. package/dist/operations/campaign-export.test.d.ts.map +1 -0
  257. package/dist/operations/campaign-export.test.js +134 -0
  258. package/dist/operations/campaign-export.test.js.map +1 -0
  259. package/dist/operations/campaign-get.d.ts +19 -0
  260. package/dist/operations/campaign-get.d.ts.map +1 -0
  261. package/dist/operations/campaign-get.js +23 -0
  262. package/dist/operations/campaign-get.js.map +1 -0
  263. package/dist/operations/campaign-get.test.d.ts +2 -0
  264. package/dist/operations/campaign-get.test.d.ts.map +1 -0
  265. package/dist/operations/campaign-get.test.js +99 -0
  266. package/dist/operations/campaign-get.test.js.map +1 -0
  267. package/dist/operations/campaign-list.d.ts +20 -0
  268. package/dist/operations/campaign-list.d.ts.map +1 -0
  269. package/dist/operations/campaign-list.js +23 -0
  270. package/dist/operations/campaign-list.js.map +1 -0
  271. package/dist/operations/campaign-list.test.d.ts +2 -0
  272. package/dist/operations/campaign-list.test.d.ts.map +1 -0
  273. package/dist/operations/campaign-list.test.js +106 -0
  274. package/dist/operations/campaign-list.test.js.map +1 -0
  275. package/dist/operations/campaign-move-next.d.ts +15 -0
  276. package/dist/operations/campaign-move-next.d.ts.map +1 -0
  277. package/dist/operations/campaign-move-next.js +25 -0
  278. package/dist/operations/campaign-move-next.js.map +1 -0
  279. package/dist/operations/campaign-move-next.test.d.ts +2 -0
  280. package/dist/operations/campaign-move-next.test.d.ts.map +1 -0
  281. package/dist/operations/campaign-move-next.test.js +105 -0
  282. package/dist/operations/campaign-move-next.test.js.map +1 -0
  283. package/dist/operations/campaign-remove-action.d.ts +12 -0
  284. package/dist/operations/campaign-remove-action.d.ts.map +1 -0
  285. package/dist/operations/campaign-remove-action.js +23 -0
  286. package/dist/operations/campaign-remove-action.js.map +1 -0
  287. package/dist/operations/campaign-remove-action.test.d.ts +2 -0
  288. package/dist/operations/campaign-remove-action.test.d.ts.map +1 -0
  289. package/dist/operations/campaign-remove-action.test.js +95 -0
  290. package/dist/operations/campaign-remove-action.test.js.map +1 -0
  291. package/dist/operations/campaign-reorder-actions.d.ts +13 -0
  292. package/dist/operations/campaign-reorder-actions.d.ts.map +1 -0
  293. package/dist/operations/campaign-reorder-actions.js +19 -0
  294. package/dist/operations/campaign-reorder-actions.js.map +1 -0
  295. package/dist/operations/campaign-reorder-actions.test.d.ts +2 -0
  296. package/dist/operations/campaign-reorder-actions.test.d.ts.map +1 -0
  297. package/dist/operations/campaign-reorder-actions.test.js +103 -0
  298. package/dist/operations/campaign-reorder-actions.test.js.map +1 -0
  299. package/dist/operations/campaign-retry.d.ts +13 -0
  300. package/dist/operations/campaign-retry.d.ts.map +1 -0
  301. package/dist/operations/campaign-retry.js +24 -0
  302. package/dist/operations/campaign-retry.js.map +1 -0
  303. package/dist/operations/campaign-retry.test.d.ts +2 -0
  304. package/dist/operations/campaign-retry.test.d.ts.map +1 -0
  305. package/dist/operations/campaign-retry.test.js +100 -0
  306. package/dist/operations/campaign-retry.test.js.map +1 -0
  307. package/dist/operations/campaign-start.d.ts +13 -0
  308. package/dist/operations/campaign-start.d.ts.map +1 -0
  309. package/dist/operations/campaign-start.js +24 -0
  310. package/dist/operations/campaign-start.js.map +1 -0
  311. package/dist/operations/campaign-start.test.d.ts +2 -0
  312. package/dist/operations/campaign-start.test.d.ts.map +1 -0
  313. package/dist/operations/campaign-start.test.js +96 -0
  314. package/dist/operations/campaign-start.test.js.map +1 -0
  315. package/dist/operations/campaign-statistics.d.ts +10 -0
  316. package/dist/operations/campaign-statistics.d.ts.map +1 -0
  317. package/dist/operations/campaign-statistics.js +23 -0
  318. package/dist/operations/campaign-statistics.js.map +1 -0
  319. package/dist/operations/campaign-statistics.test.d.ts +2 -0
  320. package/dist/operations/campaign-statistics.test.d.ts.map +1 -0
  321. package/dist/operations/campaign-statistics.test.js +120 -0
  322. package/dist/operations/campaign-statistics.test.js.map +1 -0
  323. package/dist/operations/campaign-status.d.ts +26 -0
  324. package/dist/operations/campaign-status.d.ts.map +1 -0
  325. package/dist/operations/campaign-status.js +32 -0
  326. package/dist/operations/campaign-status.js.map +1 -0
  327. package/dist/operations/campaign-status.test.d.ts +2 -0
  328. package/dist/operations/campaign-status.test.d.ts.map +1 -0
  329. package/dist/operations/campaign-status.test.js +142 -0
  330. package/dist/operations/campaign-status.test.js.map +1 -0
  331. package/dist/operations/campaign-stop.d.ts +11 -0
  332. package/dist/operations/campaign-stop.d.ts.map +1 -0
  333. package/dist/operations/campaign-stop.js +23 -0
  334. package/dist/operations/campaign-stop.js.map +1 -0
  335. package/dist/operations/campaign-stop.test.d.ts +2 -0
  336. package/dist/operations/campaign-stop.test.d.ts.map +1 -0
  337. package/dist/operations/campaign-stop.test.js +92 -0
  338. package/dist/operations/campaign-stop.test.js.map +1 -0
  339. package/dist/operations/campaign-update.d.ts +18 -0
  340. package/dist/operations/campaign-update.d.ts.map +1 -0
  341. package/dist/operations/campaign-update.js +21 -0
  342. package/dist/operations/campaign-update.js.map +1 -0
  343. package/dist/operations/campaign-update.test.d.ts +2 -0
  344. package/dist/operations/campaign-update.test.d.ts.map +1 -0
  345. package/dist/operations/campaign-update.test.js +105 -0
  346. package/dist/operations/campaign-update.test.js.map +1 -0
  347. package/dist/operations/check-replies.d.ts +12 -0
  348. package/dist/operations/check-replies.d.ts.map +1 -0
  349. package/dist/operations/check-replies.js +26 -0
  350. package/dist/operations/check-replies.js.map +1 -0
  351. package/dist/operations/check-replies.test.d.ts +2 -0
  352. package/dist/operations/check-replies.test.d.ts.map +1 -0
  353. package/dist/operations/check-replies.test.js +118 -0
  354. package/dist/operations/check-replies.test.js.map +1 -0
  355. package/dist/operations/import-people-from-urls.d.ts +16 -0
  356. package/dist/operations/import-people-from-urls.d.ts.map +1 -0
  357. package/dist/operations/import-people-from-urls.js +27 -0
  358. package/dist/operations/import-people-from-urls.js.map +1 -0
  359. package/dist/operations/import-people-from-urls.test.d.ts +2 -0
  360. package/dist/operations/import-people-from-urls.test.d.ts.map +1 -0
  361. package/dist/operations/import-people-from-urls.test.js +118 -0
  362. package/dist/operations/import-people-from-urls.test.js.map +1 -0
  363. package/dist/operations/index.d.ts +24 -0
  364. package/dist/operations/index.d.ts.map +1 -0
  365. package/dist/operations/index.js +30 -0
  366. package/dist/operations/index.js.map +1 -0
  367. package/dist/operations/query-messages.d.ts +23 -0
  368. package/dist/operations/query-messages.d.ts.map +1 -0
  369. package/dist/operations/query-messages.js +33 -0
  370. package/dist/operations/query-messages.js.map +1 -0
  371. package/dist/operations/query-messages.test.d.ts +2 -0
  372. package/dist/operations/query-messages.test.d.ts.map +1 -0
  373. package/dist/operations/query-messages.test.js +134 -0
  374. package/dist/operations/query-messages.test.js.map +1 -0
  375. package/dist/operations/scrape-messaging-history.d.ts +10 -0
  376. package/dist/operations/scrape-messaging-history.d.ts.map +1 -0
  377. package/dist/operations/scrape-messaging-history.js +24 -0
  378. package/dist/operations/scrape-messaging-history.js.map +1 -0
  379. package/dist/operations/scrape-messaging-history.test.d.ts +2 -0
  380. package/dist/operations/scrape-messaging-history.test.d.ts.map +1 -0
  381. package/dist/operations/scrape-messaging-history.test.js +112 -0
  382. package/dist/operations/scrape-messaging-history.test.js.map +1 -0
  383. package/dist/operations/types.d.ts +10 -0
  384. package/dist/operations/types.d.ts.map +1 -0
  385. package/dist/operations/types.js +4 -0
  386. package/dist/operations/types.js.map +1 -0
  387. package/dist/services/account-resolution.d.ts +22 -0
  388. package/dist/services/account-resolution.d.ts.map +1 -0
  389. package/dist/services/account-resolution.js +45 -0
  390. package/dist/services/account-resolution.js.map +1 -0
  391. package/dist/services/account-resolution.test.d.ts +2 -0
  392. package/dist/services/account-resolution.test.d.ts.map +1 -0
  393. package/dist/services/account-resolution.test.js +91 -0
  394. package/dist/services/account-resolution.test.js.map +1 -0
  395. package/dist/services/app.d.ts +62 -0
  396. package/dist/services/app.d.ts.map +1 -0
  397. package/dist/services/app.js +200 -0
  398. package/dist/services/app.js.map +1 -0
  399. package/dist/services/app.test.d.ts +2 -0
  400. package/dist/services/app.test.d.ts.map +1 -0
  401. package/dist/services/app.test.js +267 -0
  402. package/dist/services/app.test.js.map +1 -0
  403. package/dist/services/campaign.d.ts +143 -0
  404. package/dist/services/campaign.d.ts.map +1 -0
  405. package/dist/services/campaign.js +409 -0
  406. package/dist/services/campaign.js.map +1 -0
  407. package/dist/services/campaign.test.d.ts +2 -0
  408. package/dist/services/campaign.test.d.ts.map +1 -0
  409. package/dist/services/campaign.test.js +481 -0
  410. package/dist/services/campaign.test.js.map +1 -0
  411. package/dist/services/errors.d.ts +83 -0
  412. package/dist/services/errors.d.ts.map +1 -0
  413. package/dist/services/errors.js +126 -0
  414. package/dist/services/errors.js.map +1 -0
  415. package/dist/services/errors.test.d.ts +2 -0
  416. package/dist/services/errors.test.d.ts.map +1 -0
  417. package/dist/services/errors.test.js +123 -0
  418. package/dist/services/errors.test.js.map +1 -0
  419. package/dist/services/index.d.ts +10 -0
  420. package/dist/services/index.d.ts.map +1 -0
  421. package/dist/services/index.js +12 -0
  422. package/dist/services/index.js.map +1 -0
  423. package/dist/services/instance-context.d.ts +37 -0
  424. package/dist/services/instance-context.d.ts.map +1 -0
  425. package/dist/services/instance-context.js +49 -0
  426. package/dist/services/instance-context.js.map +1 -0
  427. package/dist/services/instance-context.test.d.ts +2 -0
  428. package/dist/services/instance-context.test.d.ts.map +1 -0
  429. package/dist/services/instance-context.test.js +203 -0
  430. package/dist/services/instance-context.test.js.map +1 -0
  431. package/dist/services/instance-lifecycle.d.ts +38 -0
  432. package/dist/services/instance-lifecycle.d.ts.map +1 -0
  433. package/dist/services/instance-lifecycle.js +87 -0
  434. package/dist/services/instance-lifecycle.js.map +1 -0
  435. package/dist/services/instance-lifecycle.test.d.ts +2 -0
  436. package/dist/services/instance-lifecycle.test.d.ts.map +1 -0
  437. package/dist/services/instance-lifecycle.test.js +158 -0
  438. package/dist/services/instance-lifecycle.test.js.map +1 -0
  439. package/dist/services/instance.d.ts +90 -0
  440. package/dist/services/instance.d.ts.map +1 -0
  441. package/dist/services/instance.js +178 -0
  442. package/dist/services/instance.js.map +1 -0
  443. package/dist/services/instance.test.d.ts +2 -0
  444. package/dist/services/instance.test.d.ts.map +1 -0
  445. package/dist/services/instance.test.js +291 -0
  446. package/dist/services/instance.test.js.map +1 -0
  447. package/dist/services/launcher.d.ts +54 -0
  448. package/dist/services/launcher.d.ts.map +1 -0
  449. package/dist/services/launcher.js +162 -0
  450. package/dist/services/launcher.js.map +1 -0
  451. package/dist/services/launcher.test.d.ts +2 -0
  452. package/dist/services/launcher.test.d.ts.map +1 -0
  453. package/dist/services/launcher.test.js +163 -0
  454. package/dist/services/launcher.test.js.map +1 -0
  455. package/dist/services/status.d.ts +37 -0
  456. package/dist/services/status.d.ts.map +1 -0
  457. package/dist/services/status.js +85 -0
  458. package/dist/services/status.js.map +1 -0
  459. package/dist/services/status.test.d.ts +2 -0
  460. package/dist/services/status.test.d.ts.map +1 -0
  461. package/dist/services/status.test.js +248 -0
  462. package/dist/services/status.test.js.map +1 -0
  463. package/dist/testing/e2e-helpers.d.ts +41 -0
  464. package/dist/testing/e2e-helpers.d.ts.map +1 -0
  465. package/dist/testing/e2e-helpers.js +114 -0
  466. package/dist/testing/e2e-helpers.js.map +1 -0
  467. package/dist/testing/index.d.ts +2 -0
  468. package/dist/testing/index.d.ts.map +1 -0
  469. package/dist/testing/index.js +4 -0
  470. package/dist/testing/index.js.map +1 -0
  471. package/dist/types/account.d.ts +13 -0
  472. package/dist/types/account.d.ts.map +1 -0
  473. package/dist/types/account.js +4 -0
  474. package/dist/types/account.js.map +1 -0
  475. package/dist/types/account.test.d.ts +2 -0
  476. package/dist/types/account.test.d.ts.map +1 -0
  477. package/dist/types/account.test.js +26 -0
  478. package/dist/types/account.test.js.map +1 -0
  479. package/dist/types/campaign.d.ts +267 -0
  480. package/dist/types/campaign.d.ts.map +1 -0
  481. package/dist/types/campaign.js +4 -0
  482. package/dist/types/campaign.js.map +1 -0
  483. package/dist/types/cdp.d.ts +18 -0
  484. package/dist/types/cdp.d.ts.map +1 -0
  485. package/dist/types/cdp.js +4 -0
  486. package/dist/types/cdp.js.map +1 -0
  487. package/dist/types/cdp.test.d.ts +2 -0
  488. package/dist/types/cdp.test.d.ts.map +1 -0
  489. package/dist/types/cdp.test.js +30 -0
  490. package/dist/types/cdp.test.js.map +1 -0
  491. package/dist/types/index.d.ts +6 -0
  492. package/dist/types/index.d.ts.map +1 -0
  493. package/dist/types/index.js +4 -0
  494. package/dist/types/index.js.map +1 -0
  495. package/dist/types/instance.d.ts +36 -0
  496. package/dist/types/instance.d.ts.map +1 -0
  497. package/dist/types/instance.js +4 -0
  498. package/dist/types/instance.js.map +1 -0
  499. package/dist/types/instance.test.d.ts +2 -0
  500. package/dist/types/instance.test.d.ts.map +1 -0
  501. package/dist/types/instance.test.js +59 -0
  502. package/dist/types/instance.test.js.map +1 -0
  503. package/dist/types/messaging.d.ts +51 -0
  504. package/dist/types/messaging.d.ts.map +1 -0
  505. package/dist/types/messaging.js +4 -0
  506. package/dist/types/messaging.js.map +1 -0
  507. package/dist/types/profile.d.ts +81 -0
  508. package/dist/types/profile.d.ts.map +1 -0
  509. package/dist/types/profile.js +4 -0
  510. package/dist/types/profile.js.map +1 -0
  511. package/dist/types/profile.test.d.ts +2 -0
  512. package/dist/types/profile.test.d.ts.map +1 -0
  513. package/dist/types/profile.test.js +105 -0
  514. package/dist/types/profile.test.js.map +1 -0
  515. package/dist/utils/cdp-port.d.ts +5 -0
  516. package/dist/utils/cdp-port.d.ts.map +1 -0
  517. package/dist/utils/cdp-port.js +15 -0
  518. package/dist/utils/cdp-port.js.map +1 -0
  519. package/dist/utils/cdp-port.test.d.ts +2 -0
  520. package/dist/utils/cdp-port.test.d.ts.map +1 -0
  521. package/dist/utils/cdp-port.test.js +23 -0
  522. package/dist/utils/cdp-port.test.js.map +1 -0
  523. package/dist/utils/delay.d.ts +5 -0
  524. package/dist/utils/delay.d.ts.map +1 -0
  525. package/dist/utils/delay.js +9 -0
  526. package/dist/utils/delay.js.map +1 -0
  527. package/dist/utils/delay.test.d.ts +2 -0
  528. package/dist/utils/delay.test.d.ts.map +1 -0
  529. package/dist/utils/delay.test.js +17 -0
  530. package/dist/utils/delay.test.js.map +1 -0
  531. package/dist/utils/error-message.d.ts +5 -0
  532. package/dist/utils/error-message.d.ts.map +1 -0
  533. package/dist/utils/error-message.js +9 -0
  534. package/dist/utils/error-message.js.map +1 -0
  535. package/dist/utils/error-message.test.d.ts +2 -0
  536. package/dist/utils/error-message.test.d.ts.map +1 -0
  537. package/dist/utils/error-message.test.js +28 -0
  538. package/dist/utils/error-message.test.js.map +1 -0
  539. package/dist/utils/index.d.ts +5 -0
  540. package/dist/utils/index.d.ts.map +1 -0
  541. package/dist/utils/index.js +7 -0
  542. package/dist/utils/index.js.map +1 -0
  543. package/dist/utils/loopback.d.ts +10 -0
  544. package/dist/utils/loopback.d.ts.map +1 -0
  545. package/dist/utils/loopback.js +28 -0
  546. package/dist/utils/loopback.js.map +1 -0
  547. package/dist/utils/loopback.test.d.ts +2 -0
  548. package/dist/utils/loopback.test.d.ts.map +1 -0
  549. package/dist/utils/loopback.test.js +34 -0
  550. package/dist/utils/loopback.test.js.map +1 -0
  551. package/package.json +26 -9
@@ -0,0 +1,38 @@
1
+ import type { LauncherService } from "./launcher.js";
2
+ /**
3
+ * Result of a start-instance operation.
4
+ */
5
+ export type StartInstanceOutcome = {
6
+ status: "started";
7
+ port: number;
8
+ } | {
9
+ status: "already_running";
10
+ port: number;
11
+ } | {
12
+ status: "timeout";
13
+ };
14
+ /**
15
+ * Start a LinkedHelper instance with idempotent handling and crash recovery.
16
+ *
17
+ * - If the instance is already running and reachable, returns `already_running`.
18
+ * - If the launcher reports "already running" but the port is not discoverable
19
+ * (stale state after crash), performs crash recovery: stop → delay → restart.
20
+ * - After starting, polls for the instance CDP port until available or timeout.
21
+ */
22
+ export declare function startInstanceWithRecovery(launcher: LauncherService, accountId: number, launcherPort: number): Promise<StartInstanceOutcome>;
23
+ /**
24
+ * Poll for the instance CDP port until available or timeout.
25
+ *
26
+ * The underlying `discoverInstancePort` verifies each candidate port
27
+ * responds to the CDP `/json/list` endpoint, so the returned port is
28
+ * guaranteed to be a working CDP port.
29
+ */
30
+ export declare function waitForInstancePort(launcherPort: number): Promise<number | null>;
31
+ /**
32
+ * Poll until no instance CDP port is discoverable, or timeout.
33
+ *
34
+ * Use after `stopInstance()` to ensure the process has fully exited
35
+ * before starting a new instance.
36
+ */
37
+ export declare function waitForInstanceShutdown(launcherPort: number): Promise<void>;
38
+ //# sourceMappingURL=instance-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.d.ts","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBrD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC,CA4B/B;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -0,0 +1,87 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { discoverInstancePort } from "../cdp/index.js";
4
+ import { delay } from "../utils/delay.js";
5
+ import { StartInstanceError } from "./errors.js";
6
+ /**
7
+ * Maximum time to wait for the instance CDP port to become available (ms).
8
+ *
9
+ * LinkedHelper instances are full Electron apps that load LinkedIn on startup,
10
+ * so the CDP endpoint may not be ready for 30+ seconds after the process starts.
11
+ */
12
+ const PORT_DISCOVERY_TIMEOUT = 45_000;
13
+ /** Maximum time to wait for the instance CDP port to disappear after stop (ms). */
14
+ const PORT_SHUTDOWN_TIMEOUT = 15_000;
15
+ /** Interval between port discovery attempts (ms). */
16
+ const PORT_DISCOVERY_INTERVAL = 1_000;
17
+ /** Delay after crash recovery stop before retrying start (ms). */
18
+ const CRASH_RECOVERY_DELAY = 2_000;
19
+ /**
20
+ * Start a LinkedHelper instance with idempotent handling and crash recovery.
21
+ *
22
+ * - If the instance is already running and reachable, returns `already_running`.
23
+ * - If the launcher reports "already running" but the port is not discoverable
24
+ * (stale state after crash), performs crash recovery: stop → delay → restart.
25
+ * - After starting, polls for the instance CDP port until available or timeout.
26
+ */
27
+ export async function startInstanceWithRecovery(launcher, accountId, launcherPort) {
28
+ try {
29
+ await launcher.startInstance(accountId);
30
+ }
31
+ catch (error) {
32
+ if (error instanceof StartInstanceError &&
33
+ error.message.includes("already running")) {
34
+ const existingPort = await discoverInstancePort(launcherPort);
35
+ if (existingPort !== null) {
36
+ return { status: "already_running", port: existingPort };
37
+ }
38
+ // Stale state — crash recovery
39
+ await launcher.stopInstance(accountId);
40
+ await delay(CRASH_RECOVERY_DELAY);
41
+ await launcher.startInstance(accountId);
42
+ }
43
+ else {
44
+ throw error;
45
+ }
46
+ }
47
+ const port = await waitForInstancePort(launcherPort);
48
+ if (port === null) {
49
+ return { status: "timeout" };
50
+ }
51
+ return { status: "started", port };
52
+ }
53
+ /**
54
+ * Poll for the instance CDP port until available or timeout.
55
+ *
56
+ * The underlying `discoverInstancePort` verifies each candidate port
57
+ * responds to the CDP `/json/list` endpoint, so the returned port is
58
+ * guaranteed to be a working CDP port.
59
+ */
60
+ export async function waitForInstancePort(launcherPort) {
61
+ const deadline = Date.now() + PORT_DISCOVERY_TIMEOUT;
62
+ while (Date.now() < deadline) {
63
+ const port = await discoverInstancePort(launcherPort);
64
+ if (port !== null) {
65
+ return port;
66
+ }
67
+ await delay(PORT_DISCOVERY_INTERVAL);
68
+ }
69
+ return null;
70
+ }
71
+ /**
72
+ * Poll until no instance CDP port is discoverable, or timeout.
73
+ *
74
+ * Use after `stopInstance()` to ensure the process has fully exited
75
+ * before starting a new instance.
76
+ */
77
+ export async function waitForInstanceShutdown(launcherPort) {
78
+ const deadline = Date.now() + PORT_SHUTDOWN_TIMEOUT;
79
+ while (Date.now() < deadline) {
80
+ const port = await discoverInstancePort(launcherPort);
81
+ if (port === null) {
82
+ return;
83
+ }
84
+ await delay(PORT_DISCOVERY_INTERVAL);
85
+ }
86
+ }
87
+ //# sourceMappingURL=instance-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC,qDAAqD;AACrD,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAEtC,kEAAkE;AAClE,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAUnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,QAAyB,EACzB,SAAiB,EACjB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,kBAAkB;YACnC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACzC,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC9D,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YAC3D,CAAC;YAED,+BAA+B;YAC/B,MAAM,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;IAErD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC;IAEpD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=instance-lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.test.d.ts","sourceRoot":"","sources":["../../src/services/instance-lifecycle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("../cdp/index.js", async (importOriginal) => {
5
+ const actual = await importOriginal();
6
+ return {
7
+ ...actual,
8
+ discoverInstancePort: vi.fn(),
9
+ };
10
+ });
11
+ import { discoverInstancePort } from "../cdp/index.js";
12
+ import { StartInstanceError } from "./errors.js";
13
+ import { startInstanceWithRecovery, waitForInstancePort, waitForInstanceShutdown, } from "./instance-lifecycle.js";
14
+ function createMockLauncher(overrides = {}) {
15
+ return {
16
+ connect: vi.fn().mockResolvedValue(undefined),
17
+ disconnect: vi.fn(),
18
+ startInstance: vi.fn().mockResolvedValue(undefined),
19
+ stopInstance: vi.fn().mockResolvedValue(undefined),
20
+ listAccounts: vi.fn().mockResolvedValue([]),
21
+ ...overrides,
22
+ };
23
+ }
24
+ describe("startInstanceWithRecovery", () => {
25
+ beforeEach(() => {
26
+ vi.clearAllMocks();
27
+ vi.useFakeTimers({ shouldAdvanceTime: true });
28
+ });
29
+ afterEach(() => {
30
+ vi.useRealTimers();
31
+ vi.restoreAllMocks();
32
+ });
33
+ it("returns started with port on successful start", async () => {
34
+ const launcher = createMockLauncher();
35
+ vi.mocked(discoverInstancePort).mockResolvedValue(55123);
36
+ const result = await startInstanceWithRecovery(launcher, 42, 9222);
37
+ expect(launcher.startInstance).toHaveBeenCalledWith(42);
38
+ expect(result).toEqual({ status: "started", port: 55123 });
39
+ });
40
+ it("returns already_running when instance is running and port discoverable", async () => {
41
+ const launcher = createMockLauncher({
42
+ startInstance: vi
43
+ .fn()
44
+ .mockRejectedValue(new StartInstanceError(42, "account is already running")),
45
+ });
46
+ vi.mocked(discoverInstancePort).mockResolvedValue(55123);
47
+ const result = await startInstanceWithRecovery(launcher, 42, 9222);
48
+ expect(result).toEqual({ status: "already_running", port: 55123 });
49
+ expect(launcher.stopInstance).not.toHaveBeenCalled();
50
+ });
51
+ it("performs crash recovery when already running but no port", async () => {
52
+ const startInstance = vi
53
+ .fn()
54
+ .mockRejectedValueOnce(new StartInstanceError(42, "account is already running"))
55
+ .mockResolvedValueOnce(undefined);
56
+ const launcher = createMockLauncher({ startInstance });
57
+ // First call (already running check): no port → crash recovery
58
+ // After recovery + restart: port available
59
+ vi.mocked(discoverInstancePort)
60
+ .mockResolvedValueOnce(null)
61
+ .mockResolvedValue(55999);
62
+ const result = await startInstanceWithRecovery(launcher, 42, 9222);
63
+ expect(launcher.stopInstance).toHaveBeenCalledWith(42);
64
+ expect(startInstance).toHaveBeenCalledTimes(2);
65
+ expect(result).toEqual({ status: "started", port: 55999 });
66
+ });
67
+ it("returns timeout when port never becomes available", async () => {
68
+ const launcher = createMockLauncher();
69
+ vi.mocked(discoverInstancePort).mockResolvedValue(null);
70
+ const resultPromise = startInstanceWithRecovery(launcher, 42, 9222);
71
+ await vi.advanceTimersByTimeAsync(46_000);
72
+ const result = await resultPromise;
73
+ expect(result).toEqual({ status: "timeout" });
74
+ });
75
+ it("rethrows non-already-running StartInstanceError", async () => {
76
+ const launcher = createMockLauncher({
77
+ startInstance: vi
78
+ .fn()
79
+ .mockRejectedValue(new StartInstanceError(42, "license expired")),
80
+ });
81
+ await expect(startInstanceWithRecovery(launcher, 42, 9222)).rejects.toThrow("license expired");
82
+ });
83
+ it("rethrows non-StartInstanceError", async () => {
84
+ const launcher = createMockLauncher({
85
+ startInstance: vi
86
+ .fn()
87
+ .mockRejectedValue(new Error("network error")),
88
+ });
89
+ await expect(startInstanceWithRecovery(launcher, 42, 9222)).rejects.toThrow("network error");
90
+ });
91
+ });
92
+ describe("waitForInstancePort", () => {
93
+ beforeEach(() => {
94
+ vi.clearAllMocks();
95
+ vi.useFakeTimers({ shouldAdvanceTime: true });
96
+ });
97
+ afterEach(() => {
98
+ vi.useRealTimers();
99
+ vi.restoreAllMocks();
100
+ });
101
+ it("returns port immediately when available", async () => {
102
+ vi.mocked(discoverInstancePort).mockResolvedValue(55123);
103
+ const result = await waitForInstancePort(9222);
104
+ expect(result).toBe(55123);
105
+ });
106
+ it("polls until port becomes available", async () => {
107
+ vi.mocked(discoverInstancePort)
108
+ .mockResolvedValueOnce(null)
109
+ .mockResolvedValueOnce(null)
110
+ .mockResolvedValue(55123);
111
+ const resultPromise = waitForInstancePort(9222);
112
+ await vi.advanceTimersByTimeAsync(3_000);
113
+ const result = await resultPromise;
114
+ expect(result).toBe(55123);
115
+ expect(discoverInstancePort).toHaveBeenCalledTimes(3);
116
+ });
117
+ it("returns null on timeout", async () => {
118
+ vi.mocked(discoverInstancePort).mockResolvedValue(null);
119
+ const resultPromise = waitForInstancePort(9222);
120
+ await vi.advanceTimersByTimeAsync(46_000);
121
+ const result = await resultPromise;
122
+ expect(result).toBeNull();
123
+ });
124
+ });
125
+ describe("waitForInstanceShutdown", () => {
126
+ beforeEach(() => {
127
+ vi.clearAllMocks();
128
+ vi.useFakeTimers({ shouldAdvanceTime: true });
129
+ });
130
+ afterEach(() => {
131
+ vi.useRealTimers();
132
+ vi.restoreAllMocks();
133
+ });
134
+ it("resolves immediately when no instance port is found", async () => {
135
+ vi.mocked(discoverInstancePort).mockResolvedValue(null);
136
+ await waitForInstanceShutdown(9222);
137
+ expect(discoverInstancePort).toHaveBeenCalledTimes(1);
138
+ });
139
+ it("polls until port disappears", async () => {
140
+ vi.mocked(discoverInstancePort)
141
+ .mockResolvedValueOnce(55123)
142
+ .mockResolvedValueOnce(55123)
143
+ .mockResolvedValue(null);
144
+ const promise = waitForInstanceShutdown(9222);
145
+ await vi.advanceTimersByTimeAsync(3_000);
146
+ await promise;
147
+ expect(discoverInstancePort).toHaveBeenCalledTimes(3);
148
+ });
149
+ it("resolves after timeout even if port persists", async () => {
150
+ vi.mocked(discoverInstancePort).mockResolvedValue(55123);
151
+ const promise = waitForInstanceShutdown(9222);
152
+ await vi.advanceTimersByTimeAsync(46_000);
153
+ await promise;
154
+ // Should have polled multiple times then given up
155
+ expect(vi.mocked(discoverInstancePort).mock.calls.length).toBeGreaterThan(1);
156
+ });
157
+ });
158
+ //# sourceMappingURL=instance-lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.test.js","sourceRoot":"","sources":["../../src/services/instance-lifecycle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Result of a LinkedHelper action execution.
3
+ */
4
+ export interface ActionResult {
5
+ /** Whether the action completed successfully. */
6
+ success: boolean;
7
+ /** The action type that was executed. */
8
+ actionType: string;
9
+ /** Error message if the action failed. */
10
+ error?: string;
11
+ }
12
+ /**
13
+ * Controls a running LinkedHelper instance via CDP.
14
+ *
15
+ * An instance has two CDP targets on the same port:
16
+ * - **LinkedIn webview**: The Chromium page rendering linkedin.com
17
+ * - **Instance UI**: The Electron page hosting the LinkedHelper UI
18
+ *
19
+ * This service connects to both targets and provides methods for
20
+ * profile navigation and data extraction.
21
+ */
22
+ export declare class InstanceService {
23
+ private readonly port;
24
+ private readonly host;
25
+ private readonly timeout;
26
+ private readonly allowRemote;
27
+ private linkedInClient;
28
+ private uiClient;
29
+ constructor(port: number, options?: {
30
+ host?: string;
31
+ timeout?: number;
32
+ allowRemote?: boolean;
33
+ });
34
+ /**
35
+ * Connect to both instance CDP targets (LinkedIn page and UI).
36
+ *
37
+ * The instance may still be loading LinkedIn after startup, so this
38
+ * method polls until both targets appear or the timeout is reached.
39
+ *
40
+ * @throws {InstanceNotRunningError} if the expected targets are not found within the timeout.
41
+ */
42
+ connect(): Promise<void>;
43
+ /**
44
+ * Disconnect from both targets.
45
+ */
46
+ disconnect(): void;
47
+ /**
48
+ * Navigate the LinkedIn webview to a profile URL.
49
+ *
50
+ * Enables the Page domain, navigates, and waits for the load event.
51
+ *
52
+ * @throws {InvalidProfileUrlError} if the URL is not a valid LinkedIn profile path.
53
+ */
54
+ navigateToProfile(url: string): Promise<void>;
55
+ /**
56
+ * Execute a LinkedHelper action via the instance UI.
57
+ *
58
+ * This tells LinkedHelper to run the given action type with the
59
+ * provided configuration object. The call resolves when the action
60
+ * completes (which may take minutes for long-running actions like
61
+ * ScrapeMessagingHistory).
62
+ *
63
+ * @param actionName The action type (e.g., 'SaveCurrentProfile', 'ScrapeMessagingHistory').
64
+ * @param config Action configuration object (default: `{}`).
65
+ */
66
+ executeAction(actionName: string, config?: Record<string, unknown>): Promise<ActionResult>;
67
+ /**
68
+ * Trigger the SaveCurrentProfile action via the instance UI.
69
+ *
70
+ * This tells LinkedHelper to extract data from the currently
71
+ * displayed LinkedIn profile and save it to the database.
72
+ */
73
+ triggerExtraction(): Promise<void>;
74
+ /**
75
+ * Evaluate a JavaScript expression in the LinkedHelper UI context.
76
+ *
77
+ * Provides access to `window.mainWindowService.mainWindow.source.*`
78
+ * and other LinkedHelper internal APIs that are only available on
79
+ * the UI target.
80
+ *
81
+ * @param expression JavaScript source to evaluate.
82
+ * @param awaitPromise Whether to await a Promise result (default `true`).
83
+ */
84
+ evaluateUI<T = unknown>(expression: string, awaitPromise?: boolean): Promise<T>;
85
+ /** Whether both clients are currently connected. */
86
+ get isConnected(): boolean;
87
+ private ensureLinkedInClient;
88
+ private ensureUiClient;
89
+ }
90
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAO9F;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;;;;;OAMG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD;;;;;;;;;;OAUG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAoBxB;;;;;OAKG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;;;;;;OASG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1B,UAAU,EAAE,MAAM,EAClB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC;IAKb,oDAAoD;IACpD,IAAI,WAAW,IAAI,OAAO,CAOzB;IAED,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,cAAc;CAMvB"}
@@ -0,0 +1,178 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { CDPClient, discoverTargets } from "../cdp/index.js";
4
+ import { delay } from "../utils/delay.js";
5
+ import { errorMessage } from "../utils/error-message.js";
6
+ import { ActionExecutionError, InstanceNotRunningError, InvalidProfileUrlError, ServiceError } from "./errors.js";
7
+ /** Maximum time to wait for both CDP targets to appear (ms). */
8
+ const CONNECT_TIMEOUT = 30_000;
9
+ /** Interval between target discovery polls (ms). */
10
+ const CONNECT_POLL_INTERVAL = 1_000;
11
+ /**
12
+ * Controls a running LinkedHelper instance via CDP.
13
+ *
14
+ * An instance has two CDP targets on the same port:
15
+ * - **LinkedIn webview**: The Chromium page rendering linkedin.com
16
+ * - **Instance UI**: The Electron page hosting the LinkedHelper UI
17
+ *
18
+ * This service connects to both targets and provides methods for
19
+ * profile navigation and data extraction.
20
+ */
21
+ export class InstanceService {
22
+ port;
23
+ host;
24
+ timeout;
25
+ allowRemote;
26
+ linkedInClient = null;
27
+ uiClient = null;
28
+ constructor(port, options) {
29
+ this.port = port;
30
+ this.host = options?.host ?? "127.0.0.1";
31
+ this.timeout = options?.timeout;
32
+ this.allowRemote = options?.allowRemote ?? false;
33
+ }
34
+ /**
35
+ * Connect to both instance CDP targets (LinkedIn page and UI).
36
+ *
37
+ * The instance may still be loading LinkedIn after startup, so this
38
+ * method polls until both targets appear or the timeout is reached.
39
+ *
40
+ * @throws {InstanceNotRunningError} if the expected targets are not found within the timeout.
41
+ */
42
+ async connect() {
43
+ const deadline = Date.now() + CONNECT_TIMEOUT;
44
+ let targets = [];
45
+ let linkedInTarget;
46
+ let uiTarget;
47
+ while (Date.now() < deadline) {
48
+ targets = await discoverTargets(this.port, this.host);
49
+ linkedInTarget = targets.find(isLinkedInTarget);
50
+ uiTarget = targets.find(isUiTarget);
51
+ if (linkedInTarget && uiTarget) {
52
+ break;
53
+ }
54
+ await delay(CONNECT_POLL_INTERVAL);
55
+ }
56
+ if (!linkedInTarget) {
57
+ throw new InstanceNotRunningError(`LinkedIn webview target not found among ${String(targets.length)} CDP target(s) on port ${String(this.port)}`);
58
+ }
59
+ if (!uiTarget) {
60
+ throw new InstanceNotRunningError(`Instance UI target not found among ${String(targets.length)} CDP target(s) on port ${String(this.port)}`);
61
+ }
62
+ const clientOptions = {
63
+ host: this.host,
64
+ ...(this.timeout !== undefined && { timeout: this.timeout }),
65
+ allowRemote: this.allowRemote,
66
+ };
67
+ const liClient = new CDPClient(this.port, clientOptions);
68
+ await liClient.connect(linkedInTarget.id);
69
+ const ui = new CDPClient(this.port, clientOptions);
70
+ await ui.connect(uiTarget.id);
71
+ this.linkedInClient = liClient;
72
+ this.uiClient = ui;
73
+ }
74
+ /**
75
+ * Disconnect from both targets.
76
+ */
77
+ disconnect() {
78
+ this.linkedInClient?.disconnect();
79
+ this.linkedInClient = null;
80
+ this.uiClient?.disconnect();
81
+ this.uiClient = null;
82
+ }
83
+ /**
84
+ * Navigate the LinkedIn webview to a profile URL.
85
+ *
86
+ * Enables the Page domain, navigates, and waits for the load event.
87
+ *
88
+ * @throws {InvalidProfileUrlError} if the URL is not a valid LinkedIn profile path.
89
+ */
90
+ async navigateToProfile(url) {
91
+ assertLinkedInProfileUrl(url);
92
+ const client = this.ensureLinkedInClient();
93
+ await client.send("Page.enable");
94
+ await client.navigate(url);
95
+ await client.waitForEvent("Page.loadEventFired");
96
+ }
97
+ /**
98
+ * Execute a LinkedHelper action via the instance UI.
99
+ *
100
+ * This tells LinkedHelper to run the given action type with the
101
+ * provided configuration object. The call resolves when the action
102
+ * completes (which may take minutes for long-running actions like
103
+ * ScrapeMessagingHistory).
104
+ *
105
+ * @param actionName The action type (e.g., 'SaveCurrentProfile', 'ScrapeMessagingHistory').
106
+ * @param config Action configuration object (default: `{}`).
107
+ */
108
+ async executeAction(actionName, config = {}) {
109
+ const client = this.ensureUiClient();
110
+ try {
111
+ await client.evaluate(`(async () => {
112
+ const mws = window.mainWindowService;
113
+ if (!mws) throw new Error('mainWindowService not found on window');
114
+ return await mws.call('executeSingleAction', ${JSON.stringify(actionName)}, ${JSON.stringify(config)});
115
+ })()`, true);
116
+ }
117
+ catch (error) {
118
+ const message = errorMessage(error);
119
+ throw new ActionExecutionError(actionName, `Action '${actionName}' failed: ${message}`, { cause: error });
120
+ }
121
+ return { success: true, actionType: actionName };
122
+ }
123
+ /**
124
+ * Trigger the SaveCurrentProfile action via the instance UI.
125
+ *
126
+ * This tells LinkedHelper to extract data from the currently
127
+ * displayed LinkedIn profile and save it to the database.
128
+ */
129
+ async triggerExtraction() {
130
+ await this.executeAction("SaveCurrentProfile");
131
+ }
132
+ /**
133
+ * Evaluate a JavaScript expression in the LinkedHelper UI context.
134
+ *
135
+ * Provides access to `window.mainWindowService.mainWindow.source.*`
136
+ * and other LinkedHelper internal APIs that are only available on
137
+ * the UI target.
138
+ *
139
+ * @param expression JavaScript source to evaluate.
140
+ * @param awaitPromise Whether to await a Promise result (default `true`).
141
+ */
142
+ async evaluateUI(expression, awaitPromise = true) {
143
+ const client = this.ensureUiClient();
144
+ return client.evaluate(expression, awaitPromise);
145
+ }
146
+ /** Whether both clients are currently connected. */
147
+ get isConnected() {
148
+ return (this.linkedInClient !== null &&
149
+ this.linkedInClient.isConnected &&
150
+ this.uiClient !== null &&
151
+ this.uiClient.isConnected);
152
+ }
153
+ ensureLinkedInClient() {
154
+ if (!this.linkedInClient) {
155
+ throw new ServiceError("InstanceService is not connected (LinkedIn target)");
156
+ }
157
+ return this.linkedInClient;
158
+ }
159
+ ensureUiClient() {
160
+ if (!this.uiClient) {
161
+ throw new ServiceError("InstanceService is not connected (UI target)");
162
+ }
163
+ return this.uiClient;
164
+ }
165
+ }
166
+ const LINKEDIN_PROFILE_URL_RE = /^https:\/\/www\.linkedin\.com\/in\/[^/]+\/?$/;
167
+ function assertLinkedInProfileUrl(url) {
168
+ if (!LINKEDIN_PROFILE_URL_RE.test(url)) {
169
+ throw new InvalidProfileUrlError(url);
170
+ }
171
+ }
172
+ function isLinkedInTarget(target) {
173
+ return target.type === "page" && target.url.includes("linkedin.com");
174
+ }
175
+ function isUiTarget(target) {
176
+ return target.type === "page" && target.url.includes("index.html");
177
+ }
178
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=instance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.test.d.ts","sourceRoot":"","sources":["../../src/services/instance.test.ts"],"names":[],"mappings":""}