@lhremote/core 0.8.0 → 0.9.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 (438) hide show
  1. package/dist/cdp/app-discovery.d.ts +57 -0
  2. package/dist/cdp/app-discovery.d.ts.map +1 -1
  3. package/dist/cdp/app-discovery.js +90 -7
  4. package/dist/cdp/app-discovery.js.map +1 -1
  5. package/dist/cdp/app-discovery.test.js +180 -9
  6. package/dist/cdp/app-discovery.test.js.map +1 -1
  7. package/dist/cdp/client.d.ts +8 -1
  8. package/dist/cdp/client.d.ts.map +1 -1
  9. package/dist/cdp/client.js +8 -1
  10. package/dist/cdp/client.js.map +1 -1
  11. package/dist/cdp/discovery.d.ts.map +1 -1
  12. package/dist/cdp/discovery.js +5 -1
  13. package/dist/cdp/discovery.js.map +1 -1
  14. package/dist/cdp/discovery.test.js +7 -0
  15. package/dist/cdp/discovery.test.js.map +1 -1
  16. package/dist/cdp/index.d.ts +1 -1
  17. package/dist/cdp/index.d.ts.map +1 -1
  18. package/dist/cdp/index.js +1 -1
  19. package/dist/cdp/index.js.map +1 -1
  20. package/dist/cdp/instance-discovery.d.ts.map +1 -1
  21. package/dist/cdp/instance-discovery.js +25 -10
  22. package/dist/cdp/instance-discovery.js.map +1 -1
  23. package/dist/cdp/instance-discovery.test.js +17 -0
  24. package/dist/cdp/instance-discovery.test.js.map +1 -1
  25. package/dist/cdp/testing/launch-chromium.d.ts +1 -1
  26. package/dist/cdp/testing/launch-chromium.js +2 -2
  27. package/dist/db/client.d.ts.map +1 -1
  28. package/dist/db/client.js +3 -0
  29. package/dist/db/client.js.map +1 -1
  30. package/dist/db/repositories/collection-list.integration.test.js +6 -4
  31. package/dist/db/repositories/collection-list.integration.test.js.map +1 -1
  32. package/dist/index.d.ts +6 -6
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +6 -6
  35. package/dist/index.js.map +1 -1
  36. package/dist/linkedin/dom-automation-retry.test.d.ts +2 -0
  37. package/dist/linkedin/dom-automation-retry.test.d.ts.map +1 -0
  38. package/dist/linkedin/dom-automation-retry.test.js +51 -0
  39. package/dist/linkedin/dom-automation-retry.test.js.map +1 -0
  40. package/dist/linkedin/dom-automation.d.ts +160 -3
  41. package/dist/linkedin/dom-automation.d.ts.map +1 -1
  42. package/dist/linkedin/dom-automation.js +489 -14
  43. package/dist/linkedin/dom-automation.js.map +1 -1
  44. package/dist/linkedin/humanized-mouse.d.ts +69 -0
  45. package/dist/linkedin/humanized-mouse.d.ts.map +1 -0
  46. package/dist/linkedin/humanized-mouse.js +109 -0
  47. package/dist/linkedin/humanized-mouse.js.map +1 -0
  48. package/dist/linkedin/index.d.ts +2 -1
  49. package/dist/linkedin/index.d.ts.map +1 -1
  50. package/dist/linkedin/index.js +2 -1
  51. package/dist/linkedin/index.js.map +1 -1
  52. package/dist/operations/add-people-to-collection.d.ts +1 -1
  53. package/dist/operations/add-people-to-collection.d.ts.map +1 -1
  54. package/dist/operations/add-people-to-collection.js +3 -6
  55. package/dist/operations/add-people-to-collection.js.map +1 -1
  56. package/dist/operations/build-linkedin-url.test.d.ts +2 -0
  57. package/dist/operations/build-linkedin-url.test.d.ts.map +1 -0
  58. package/dist/operations/build-linkedin-url.test.js +158 -0
  59. package/dist/operations/build-linkedin-url.test.js.map +1 -0
  60. package/dist/operations/campaign-add-action.d.ts +1 -1
  61. package/dist/operations/campaign-add-action.d.ts.map +1 -1
  62. package/dist/operations/campaign-add-action.js +3 -6
  63. package/dist/operations/campaign-add-action.js.map +1 -1
  64. package/dist/operations/campaign-create.d.ts +1 -1
  65. package/dist/operations/campaign-create.d.ts.map +1 -1
  66. package/dist/operations/campaign-create.js +3 -6
  67. package/dist/operations/campaign-create.js.map +1 -1
  68. package/dist/operations/campaign-delete.d.ts +1 -1
  69. package/dist/operations/campaign-delete.d.ts.map +1 -1
  70. package/dist/operations/campaign-delete.js +3 -6
  71. package/dist/operations/campaign-delete.js.map +1 -1
  72. package/dist/operations/campaign-erase.d.ts +1 -1
  73. package/dist/operations/campaign-erase.d.ts.map +1 -1
  74. package/dist/operations/campaign-erase.js +3 -6
  75. package/dist/operations/campaign-erase.js.map +1 -1
  76. package/dist/operations/campaign-exclude-add.d.ts +1 -1
  77. package/dist/operations/campaign-exclude-add.d.ts.map +1 -1
  78. package/dist/operations/campaign-exclude-add.js +3 -6
  79. package/dist/operations/campaign-exclude-add.js.map +1 -1
  80. package/dist/operations/campaign-exclude-list.d.ts +1 -1
  81. package/dist/operations/campaign-exclude-list.d.ts.map +1 -1
  82. package/dist/operations/campaign-exclude-list.js +3 -6
  83. package/dist/operations/campaign-exclude-list.js.map +1 -1
  84. package/dist/operations/campaign-exclude-remove.d.ts +1 -1
  85. package/dist/operations/campaign-exclude-remove.d.ts.map +1 -1
  86. package/dist/operations/campaign-exclude-remove.js +3 -6
  87. package/dist/operations/campaign-exclude-remove.js.map +1 -1
  88. package/dist/operations/campaign-export.d.ts +1 -1
  89. package/dist/operations/campaign-export.d.ts.map +1 -1
  90. package/dist/operations/campaign-export.js +3 -6
  91. package/dist/operations/campaign-export.js.map +1 -1
  92. package/dist/operations/campaign-get.d.ts +1 -1
  93. package/dist/operations/campaign-get.d.ts.map +1 -1
  94. package/dist/operations/campaign-get.js +3 -6
  95. package/dist/operations/campaign-get.js.map +1 -1
  96. package/dist/operations/campaign-list-people.d.ts +1 -1
  97. package/dist/operations/campaign-list-people.d.ts.map +1 -1
  98. package/dist/operations/campaign-list-people.js +3 -6
  99. package/dist/operations/campaign-list-people.js.map +1 -1
  100. package/dist/operations/campaign-list.d.ts +1 -1
  101. package/dist/operations/campaign-list.d.ts.map +1 -1
  102. package/dist/operations/campaign-list.js +3 -6
  103. package/dist/operations/campaign-list.js.map +1 -1
  104. package/dist/operations/campaign-move-next.d.ts +1 -1
  105. package/dist/operations/campaign-move-next.d.ts.map +1 -1
  106. package/dist/operations/campaign-move-next.js +3 -6
  107. package/dist/operations/campaign-move-next.js.map +1 -1
  108. package/dist/operations/campaign-remove-action.d.ts +1 -1
  109. package/dist/operations/campaign-remove-action.d.ts.map +1 -1
  110. package/dist/operations/campaign-remove-action.js +3 -6
  111. package/dist/operations/campaign-remove-action.js.map +1 -1
  112. package/dist/operations/campaign-remove-people.d.ts +1 -1
  113. package/dist/operations/campaign-remove-people.d.ts.map +1 -1
  114. package/dist/operations/campaign-remove-people.js +3 -6
  115. package/dist/operations/campaign-remove-people.js.map +1 -1
  116. package/dist/operations/campaign-reorder-actions.d.ts +1 -1
  117. package/dist/operations/campaign-reorder-actions.d.ts.map +1 -1
  118. package/dist/operations/campaign-reorder-actions.js +3 -6
  119. package/dist/operations/campaign-reorder-actions.js.map +1 -1
  120. package/dist/operations/campaign-retry.d.ts +1 -1
  121. package/dist/operations/campaign-retry.d.ts.map +1 -1
  122. package/dist/operations/campaign-retry.js +3 -6
  123. package/dist/operations/campaign-retry.js.map +1 -1
  124. package/dist/operations/campaign-start.d.ts +1 -1
  125. package/dist/operations/campaign-start.d.ts.map +1 -1
  126. package/dist/operations/campaign-start.js +3 -6
  127. package/dist/operations/campaign-start.js.map +1 -1
  128. package/dist/operations/campaign-statistics.d.ts +1 -1
  129. package/dist/operations/campaign-statistics.d.ts.map +1 -1
  130. package/dist/operations/campaign-statistics.js +3 -6
  131. package/dist/operations/campaign-statistics.js.map +1 -1
  132. package/dist/operations/campaign-status.d.ts +1 -1
  133. package/dist/operations/campaign-status.d.ts.map +1 -1
  134. package/dist/operations/campaign-status.js +3 -6
  135. package/dist/operations/campaign-status.js.map +1 -1
  136. package/dist/operations/campaign-stop.d.ts +1 -1
  137. package/dist/operations/campaign-stop.d.ts.map +1 -1
  138. package/dist/operations/campaign-stop.js +3 -6
  139. package/dist/operations/campaign-stop.js.map +1 -1
  140. package/dist/operations/campaign-update-action.d.ts +1 -1
  141. package/dist/operations/campaign-update-action.d.ts.map +1 -1
  142. package/dist/operations/campaign-update-action.js +3 -6
  143. package/dist/operations/campaign-update-action.js.map +1 -1
  144. package/dist/operations/campaign-update.d.ts +1 -1
  145. package/dist/operations/campaign-update.d.ts.map +1 -1
  146. package/dist/operations/campaign-update.js +3 -6
  147. package/dist/operations/campaign-update.js.map +1 -1
  148. package/dist/operations/check-replies.d.ts +3 -1
  149. package/dist/operations/check-replies.d.ts.map +1 -1
  150. package/dist/operations/check-replies.js +132 -17
  151. package/dist/operations/check-replies.js.map +1 -1
  152. package/dist/operations/check-replies.test.js +177 -17
  153. package/dist/operations/check-replies.test.js.map +1 -1
  154. package/dist/operations/collect-people.d.ts +1 -1
  155. package/dist/operations/collect-people.d.ts.map +1 -1
  156. package/dist/operations/collect-people.js +3 -6
  157. package/dist/operations/collect-people.js.map +1 -1
  158. package/dist/operations/comment-on-post.d.ts +4 -1
  159. package/dist/operations/comment-on-post.d.ts.map +1 -1
  160. package/dist/operations/comment-on-post.js +15 -19
  161. package/dist/operations/comment-on-post.js.map +1 -1
  162. package/dist/operations/comment-on-post.test.js +8 -6
  163. package/dist/operations/comment-on-post.test.js.map +1 -1
  164. package/dist/operations/create-collection.d.ts +1 -1
  165. package/dist/operations/create-collection.d.ts.map +1 -1
  166. package/dist/operations/create-collection.js +3 -6
  167. package/dist/operations/create-collection.js.map +1 -1
  168. package/dist/operations/delete-collection.d.ts +1 -1
  169. package/dist/operations/delete-collection.d.ts.map +1 -1
  170. package/dist/operations/delete-collection.js +3 -6
  171. package/dist/operations/delete-collection.js.map +1 -1
  172. package/dist/operations/dismiss-errors.d.ts +7 -4
  173. package/dist/operations/dismiss-errors.d.ts.map +1 -1
  174. package/dist/operations/dismiss-errors.js +52 -33
  175. package/dist/operations/dismiss-errors.js.map +1 -1
  176. package/dist/operations/dismiss-errors.test.js +53 -6
  177. package/dist/operations/dismiss-errors.test.js.map +1 -1
  178. package/dist/operations/endorse-skills.test.d.ts +2 -0
  179. package/dist/operations/endorse-skills.test.d.ts.map +1 -0
  180. package/dist/operations/endorse-skills.test.js +70 -0
  181. package/dist/operations/endorse-skills.test.js.map +1 -0
  182. package/dist/operations/enrich-profile.test.d.ts +2 -0
  183. package/dist/operations/enrich-profile.test.d.ts.map +1 -0
  184. package/dist/operations/enrich-profile.test.js +73 -0
  185. package/dist/operations/enrich-profile.test.js.map +1 -0
  186. package/dist/operations/ephemeral-action.d.ts +1 -1
  187. package/dist/operations/ephemeral-action.d.ts.map +1 -1
  188. package/dist/operations/ephemeral-action.js +3 -6
  189. package/dist/operations/ephemeral-action.js.map +1 -1
  190. package/dist/operations/ephemeral-action.test.d.ts +2 -0
  191. package/dist/operations/ephemeral-action.test.d.ts.map +1 -0
  192. package/dist/operations/ephemeral-action.test.js +140 -0
  193. package/dist/operations/ephemeral-action.test.js.map +1 -0
  194. package/dist/operations/follow-person.test.d.ts +2 -0
  195. package/dist/operations/follow-person.test.d.ts.map +1 -0
  196. package/dist/operations/follow-person.test.js +57 -0
  197. package/dist/operations/follow-person.test.js.map +1 -0
  198. package/dist/operations/get-action-budget.d.ts +1 -1
  199. package/dist/operations/get-action-budget.d.ts.map +1 -1
  200. package/dist/operations/get-action-budget.js +3 -6
  201. package/dist/operations/get-action-budget.js.map +1 -1
  202. package/dist/operations/get-errors.d.ts +5 -1
  203. package/dist/operations/get-errors.d.ts.map +1 -1
  204. package/dist/operations/get-errors.js +55 -33
  205. package/dist/operations/get-errors.js.map +1 -1
  206. package/dist/operations/get-errors.test.js +54 -55
  207. package/dist/operations/get-errors.test.js.map +1 -1
  208. package/dist/operations/get-feed.d.ts +83 -4
  209. package/dist/operations/get-feed.d.ts.map +1 -1
  210. package/dist/operations/get-feed.js +400 -153
  211. package/dist/operations/get-feed.js.map +1 -1
  212. package/dist/operations/get-feed.test.js +416 -190
  213. package/dist/operations/get-feed.test.js.map +1 -1
  214. package/dist/operations/get-post-engagers.d.ts +6 -3
  215. package/dist/operations/get-post-engagers.d.ts.map +1 -1
  216. package/dist/operations/get-post-engagers.js +278 -78
  217. package/dist/operations/get-post-engagers.js.map +1 -1
  218. package/dist/operations/get-post-engagers.test.js +292 -14
  219. package/dist/operations/get-post-engagers.test.js.map +1 -1
  220. package/dist/operations/get-post-stats.d.ts +8 -3
  221. package/dist/operations/get-post-stats.d.ts.map +1 -1
  222. package/dist/operations/get-post-stats.js +101 -37
  223. package/dist/operations/get-post-stats.js.map +1 -1
  224. package/dist/operations/get-post-stats.test.js +137 -2
  225. package/dist/operations/get-post-stats.test.js.map +1 -1
  226. package/dist/operations/get-post.d.ts +9 -150
  227. package/dist/operations/get-post.d.ts.map +1 -1
  228. package/dist/operations/get-post.js +356 -210
  229. package/dist/operations/get-post.js.map +1 -1
  230. package/dist/operations/get-post.test.js +210 -387
  231. package/dist/operations/get-post.test.js.map +1 -1
  232. package/dist/operations/get-profile-activity.d.ts +13 -92
  233. package/dist/operations/get-profile-activity.d.ts.map +1 -1
  234. package/dist/operations/get-profile-activity.js +305 -105
  235. package/dist/operations/get-profile-activity.js.map +1 -1
  236. package/dist/operations/get-profile-activity.test.js +277 -158
  237. package/dist/operations/get-profile-activity.test.js.map +1 -1
  238. package/dist/operations/get-throttle-status.d.ts +1 -1
  239. package/dist/operations/get-throttle-status.d.ts.map +1 -1
  240. package/dist/operations/get-throttle-status.js +4 -10
  241. package/dist/operations/get-throttle-status.js.map +1 -1
  242. package/dist/operations/import-people-from-collection.d.ts +1 -1
  243. package/dist/operations/import-people-from-collection.d.ts.map +1 -1
  244. package/dist/operations/import-people-from-collection.js +3 -6
  245. package/dist/operations/import-people-from-collection.js.map +1 -1
  246. package/dist/operations/import-people-from-urls.d.ts +1 -1
  247. package/dist/operations/import-people-from-urls.d.ts.map +1 -1
  248. package/dist/operations/import-people-from-urls.js +3 -6
  249. package/dist/operations/import-people-from-urls.js.map +1 -1
  250. package/dist/operations/index.d.ts +2 -2
  251. package/dist/operations/index.d.ts.map +1 -1
  252. package/dist/operations/index.js +2 -1
  253. package/dist/operations/index.js.map +1 -1
  254. package/dist/operations/like-person-posts.test.d.ts +2 -0
  255. package/dist/operations/like-person-posts.test.d.ts.map +1 -0
  256. package/dist/operations/like-person-posts.test.js +103 -0
  257. package/dist/operations/like-person-posts.test.js.map +1 -0
  258. package/dist/operations/list-collections.d.ts +1 -1
  259. package/dist/operations/list-collections.d.ts.map +1 -1
  260. package/dist/operations/list-collections.js +3 -6
  261. package/dist/operations/list-collections.js.map +1 -1
  262. package/dist/operations/message-person.test.d.ts +2 -0
  263. package/dist/operations/message-person.test.d.ts.map +1 -0
  264. package/dist/operations/message-person.test.js +108 -0
  265. package/dist/operations/message-person.test.js.map +1 -0
  266. package/dist/operations/navigate-away.d.ts +14 -0
  267. package/dist/operations/navigate-away.d.ts.map +1 -0
  268. package/dist/operations/navigate-away.js +24 -0
  269. package/dist/operations/navigate-away.js.map +1 -0
  270. package/dist/operations/navigate-away.test.d.ts +2 -0
  271. package/dist/operations/navigate-away.test.d.ts.map +1 -0
  272. package/dist/operations/navigate-away.test.js +51 -0
  273. package/dist/operations/navigate-away.test.js.map +1 -0
  274. package/dist/operations/query-messages.d.ts +1 -1
  275. package/dist/operations/query-messages.d.ts.map +1 -1
  276. package/dist/operations/query-messages.js +3 -6
  277. package/dist/operations/query-messages.js.map +1 -1
  278. package/dist/operations/react-to-post.d.ts +3 -0
  279. package/dist/operations/react-to-post.d.ts.map +1 -1
  280. package/dist/operations/react-to-post.js +13 -15
  281. package/dist/operations/react-to-post.js.map +1 -1
  282. package/dist/operations/react-to-post.test.js +8 -5
  283. package/dist/operations/react-to-post.test.js.map +1 -1
  284. package/dist/operations/remove-connection.test.d.ts +2 -0
  285. package/dist/operations/remove-connection.test.d.ts.map +1 -0
  286. package/dist/operations/remove-connection.test.js +45 -0
  287. package/dist/operations/remove-connection.test.js.map +1 -0
  288. package/dist/operations/remove-people-from-collection.d.ts +1 -1
  289. package/dist/operations/remove-people-from-collection.d.ts.map +1 -1
  290. package/dist/operations/remove-people-from-collection.js +3 -6
  291. package/dist/operations/remove-people-from-collection.js.map +1 -1
  292. package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -1
  293. package/dist/operations/resolve-linkedin-entity.js +2 -2
  294. package/dist/operations/resolve-linkedin-entity.js.map +1 -1
  295. package/dist/operations/resolve-linkedin-entity.test.d.ts +2 -0
  296. package/dist/operations/resolve-linkedin-entity.test.d.ts.map +1 -0
  297. package/dist/operations/resolve-linkedin-entity.test.js +343 -0
  298. package/dist/operations/resolve-linkedin-entity.test.js.map +1 -0
  299. package/dist/operations/scrape-messaging-history.d.ts +2 -1
  300. package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
  301. package/dist/operations/scrape-messaging-history.js +121 -18
  302. package/dist/operations/scrape-messaging-history.js.map +1 -1
  303. package/dist/operations/scrape-messaging-history.test.js +134 -12
  304. package/dist/operations/scrape-messaging-history.test.js.map +1 -1
  305. package/dist/operations/search-posts.d.ts +20 -112
  306. package/dist/operations/search-posts.d.ts.map +1 -1
  307. package/dist/operations/search-posts.js +369 -170
  308. package/dist/operations/search-posts.js.map +1 -1
  309. package/dist/operations/search-posts.test.js +273 -234
  310. package/dist/operations/search-posts.test.js.map +1 -1
  311. package/dist/operations/send-inmail.test.d.ts +2 -0
  312. package/dist/operations/send-inmail.test.d.ts.map +1 -0
  313. package/dist/operations/send-inmail.test.js +108 -0
  314. package/dist/operations/send-inmail.test.js.map +1 -0
  315. package/dist/operations/send-invite.test.d.ts +2 -0
  316. package/dist/operations/send-invite.test.d.ts.map +1 -0
  317. package/dist/operations/send-invite.test.js +59 -0
  318. package/dist/operations/send-invite.test.js.map +1 -0
  319. package/dist/operations/types.d.ts +24 -1
  320. package/dist/operations/types.d.ts.map +1 -1
  321. package/dist/operations/types.js +13 -1
  322. package/dist/operations/types.js.map +1 -1
  323. package/dist/operations/visit-profile.d.ts +1 -1
  324. package/dist/operations/visit-profile.d.ts.map +1 -1
  325. package/dist/operations/visit-profile.js +3 -6
  326. package/dist/operations/visit-profile.js.map +1 -1
  327. package/dist/services/account-resolution.d.ts +9 -4
  328. package/dist/services/account-resolution.d.ts.map +1 -1
  329. package/dist/services/account-resolution.js +60 -5
  330. package/dist/services/account-resolution.js.map +1 -1
  331. package/dist/services/app.d.ts +6 -2
  332. package/dist/services/app.d.ts.map +1 -1
  333. package/dist/services/app.js +18 -6
  334. package/dist/services/app.js.map +1 -1
  335. package/dist/services/app.test.js +41 -7
  336. package/dist/services/app.test.js.map +1 -1
  337. package/dist/services/campaign.d.ts +34 -2
  338. package/dist/services/campaign.d.ts.map +1 -1
  339. package/dist/services/campaign.js +108 -1
  340. package/dist/services/campaign.js.map +1 -1
  341. package/dist/services/errors.d.ts +2 -1
  342. package/dist/services/errors.d.ts.map +1 -1
  343. package/dist/services/errors.js +6 -3
  344. package/dist/services/errors.js.map +1 -1
  345. package/dist/services/index.d.ts +0 -1
  346. package/dist/services/index.d.ts.map +1 -1
  347. package/dist/services/index.js +0 -1
  348. package/dist/services/index.js.map +1 -1
  349. package/dist/services/instance-context.d.ts +5 -1
  350. package/dist/services/instance-context.d.ts.map +1 -1
  351. package/dist/services/instance-context.js +87 -28
  352. package/dist/services/instance-context.js.map +1 -1
  353. package/dist/services/instance-context.test.js +5 -1
  354. package/dist/services/instance-context.test.js.map +1 -1
  355. package/dist/services/instance-lifecycle.d.ts.map +1 -1
  356. package/dist/services/instance-lifecycle.js +32 -1
  357. package/dist/services/instance-lifecycle.js.map +1 -1
  358. package/dist/services/instance-lifecycle.test.js +52 -1
  359. package/dist/services/instance-lifecycle.test.js.map +1 -1
  360. package/dist/services/instance.d.ts +19 -7
  361. package/dist/services/instance.d.ts.map +1 -1
  362. package/dist/services/instance.js +56 -17
  363. package/dist/services/instance.js.map +1 -1
  364. package/dist/services/instance.test.js +65 -0
  365. package/dist/services/instance.test.js.map +1 -1
  366. package/dist/services/launcher.d.ts +47 -3
  367. package/dist/services/launcher.d.ts.map +1 -1
  368. package/dist/services/launcher.js +205 -33
  369. package/dist/services/launcher.js.map +1 -1
  370. package/dist/services/launcher.test.js +133 -6
  371. package/dist/services/launcher.test.js.map +1 -1
  372. package/dist/services/status.d.ts +6 -2
  373. package/dist/services/status.d.ts.map +1 -1
  374. package/dist/services/status.js +67 -34
  375. package/dist/services/status.js.map +1 -1
  376. package/dist/services/status.test.js +9 -2
  377. package/dist/services/status.test.js.map +1 -1
  378. package/dist/testing/e2e-helpers.d.ts +23 -1
  379. package/dist/testing/e2e-helpers.d.ts.map +1 -1
  380. package/dist/testing/e2e-helpers.js +110 -5
  381. package/dist/testing/e2e-helpers.js.map +1 -1
  382. package/dist/testing/index.d.ts +1 -1
  383. package/dist/testing/index.d.ts.map +1 -1
  384. package/dist/testing/index.js +1 -1
  385. package/dist/testing/index.js.map +1 -1
  386. package/dist/types/account.d.ts +1 -1
  387. package/dist/types/feed.d.ts +1 -3
  388. package/dist/types/feed.d.ts.map +1 -1
  389. package/dist/types/index.d.ts +0 -1
  390. package/dist/types/index.d.ts.map +1 -1
  391. package/dist/utils/cdp-port.d.ts.map +1 -1
  392. package/dist/utils/cdp-port.js +3 -1
  393. package/dist/utils/cdp-port.js.map +1 -1
  394. package/dist/utils/cdp-port.test.js +1 -1
  395. package/dist/utils/cdp-port.test.js.map +1 -1
  396. package/dist/utils/delay.d.ts +79 -0
  397. package/dist/utils/delay.d.ts.map +1 -1
  398. package/dist/utils/delay.js +118 -0
  399. package/dist/utils/delay.js.map +1 -1
  400. package/dist/utils/delay.test.js +111 -1
  401. package/dist/utils/delay.test.js.map +1 -1
  402. package/dist/utils/index.d.ts +2 -1
  403. package/dist/utils/index.d.ts.map +1 -1
  404. package/dist/utils/index.js +2 -1
  405. package/dist/utils/index.js.map +1 -1
  406. package/dist/utils/session-pacer.d.ts +27 -0
  407. package/dist/utils/session-pacer.d.ts.map +1 -0
  408. package/dist/utils/session-pacer.js +55 -0
  409. package/dist/utils/session-pacer.js.map +1 -0
  410. package/dist/utils/session-pacer.test.d.ts +2 -0
  411. package/dist/utils/session-pacer.test.d.ts.map +1 -0
  412. package/dist/utils/session-pacer.test.js +111 -0
  413. package/dist/utils/session-pacer.test.js.map +1 -0
  414. package/package.json +1 -1
  415. package/dist/linkedin/__tests__/selectors.integration.test.d.ts +0 -2
  416. package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +0 -1
  417. package/dist/linkedin/__tests__/selectors.integration.test.js +0 -258
  418. package/dist/linkedin/__tests__/selectors.integration.test.js.map +0 -1
  419. package/dist/types/search-posts.d.ts +0 -22
  420. package/dist/types/search-posts.d.ts.map +0 -1
  421. package/dist/types/search-posts.js +0 -4
  422. package/dist/types/search-posts.js.map +0 -1
  423. package/dist/voyager/index.d.ts +0 -2
  424. package/dist/voyager/index.d.ts.map +0 -1
  425. package/dist/voyager/index.js +0 -4
  426. package/dist/voyager/index.js.map +0 -1
  427. package/dist/voyager/interceptor.d.ts +0 -100
  428. package/dist/voyager/interceptor.d.ts.map +0 -1
  429. package/dist/voyager/interceptor.integration.test.d.ts +0 -2
  430. package/dist/voyager/interceptor.integration.test.d.ts.map +0 -1
  431. package/dist/voyager/interceptor.integration.test.js +0 -89
  432. package/dist/voyager/interceptor.integration.test.js.map +0 -1
  433. package/dist/voyager/interceptor.js +0 -235
  434. package/dist/voyager/interceptor.js.map +0 -1
  435. package/dist/voyager/interceptor.test.d.ts +0 -2
  436. package/dist/voyager/interceptor.test.d.ts.map +0 -1
  437. package/dist/voyager/interceptor.test.js +0 -372
  438. package/dist/voyager/interceptor.test.js.map +0 -1
@@ -1,19 +1,297 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
- import { describe, expect, it } from "vitest";
4
- // extractPostUrn is tested in get-post-stats.test.ts; here we test
5
- // the response-parsing logic indirectly by importing the module.
6
- // Direct unit tests for the operation function require CDP mocking
7
- // which is covered by integration tests.
8
- describe("get-post-engagers module", () => {
9
- it("exports the getPostEngagers function", async () => {
10
- const mod = await import("./get-post-engagers.js");
11
- expect(typeof mod.getPostEngagers).toBe("function");
12
- });
13
- it("exports the GetPostEngagersInput type-compatible shape", async () => {
14
- // Type-level verification: ensure the input shape is importable
15
- const mod = await import("./get-post-engagers.js");
16
- expect(mod.getPostEngagers).toBeDefined();
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ vi.mock("../cdp/discovery.js", () => ({
5
+ discoverTargets: vi.fn(),
6
+ }));
7
+ vi.mock("../cdp/client.js", () => ({
8
+ CDPClient: vi.fn(),
9
+ }));
10
+ vi.mock("./navigate-away.js", () => ({
11
+ navigateAwayIf: vi.fn().mockResolvedValue(undefined),
12
+ }));
13
+ vi.mock("./get-feed.js", () => ({
14
+ delay: vi.fn().mockResolvedValue(undefined),
15
+ }));
16
+ vi.mock("../utils/delay.js", () => ({
17
+ delay: vi.fn().mockResolvedValue(undefined),
18
+ gaussianDelay: vi.fn().mockResolvedValue(undefined),
19
+ gaussianBetween: vi.fn().mockReturnValue(500),
20
+ maybeHesitate: vi.fn().mockResolvedValue(undefined),
21
+ maybeBreak: vi.fn().mockResolvedValue(undefined),
22
+ simulateReadingTime: vi.fn().mockResolvedValue(undefined),
23
+ }));
24
+ vi.mock("../linkedin/dom-automation.js", () => ({
25
+ humanizedScrollTo: vi.fn().mockResolvedValue(undefined),
26
+ humanizedClick: vi.fn().mockResolvedValue(undefined),
27
+ }));
28
+ import { discoverTargets } from "../cdp/discovery.js";
29
+ import { CDPClient } from "../cdp/client.js";
30
+ import { getPostEngagers } from "./get-post-engagers.js";
31
+ const DEFAULT_ENGAGERS = [
32
+ {
33
+ firstName: "Jane",
34
+ lastName: "Doe",
35
+ publicId: "janedoe",
36
+ headline: "Software Engineer at ACME",
37
+ engagementType: "LIKE",
38
+ },
39
+ {
40
+ firstName: "John",
41
+ lastName: "Smith",
42
+ publicId: "johnsmith",
43
+ headline: "Product Manager",
44
+ engagementType: "PRAISE",
45
+ },
46
+ ];
47
+ describe("getPostEngagers", () => {
48
+ const CDP_PORT = 9222;
49
+ const POST_URL = "https://www.linkedin.com/feed/update/urn:li:activity:1234567890/";
50
+ /**
51
+ * Set up CDP mocks for the standard flow:
52
+ *
53
+ * 1. waitForPostLoad readiness polls (boolean[])
54
+ * 2. FIND_REACTIONS_SCRIPT (boolean) — scroll + click are via dom-automation mocks
55
+ * 3. waitForReactionsModal readiness polls (boolean[])
56
+ * 4. GET_MODAL_TOTAL_SCRIPT (number)
57
+ * 5. SCRAPE_ENGAGERS_SCRIPT + SCROLL_MODAL_SCRIPT interleaved
58
+ */
59
+ function setupMocks(opts) {
60
+ const { postReadySequence = [true], reactionsFound = true, modalReadySequence = [true], totalReactions = 2, scrapeSequence = [DEFAULT_ENGAGERS], scrollSequence = [], } = opts ?? {};
61
+ vi.mocked(discoverTargets).mockResolvedValue([
62
+ {
63
+ id: "target-1",
64
+ type: "page",
65
+ title: "LinkedIn",
66
+ url: "https://www.linkedin.com/feed/",
67
+ description: "",
68
+ devtoolsFrontendUrl: "",
69
+ },
70
+ ]);
71
+ const disconnect = vi.fn();
72
+ const navigate = vi.fn().mockResolvedValue(undefined);
73
+ const evaluateMock = vi.fn();
74
+ // 1. Post readiness polls
75
+ for (const ready of postReadySequence) {
76
+ evaluateMock.mockResolvedValueOnce(ready);
77
+ }
78
+ // 2. Find reactions element (scroll + click handled by dom-automation mocks)
79
+ evaluateMock.mockResolvedValueOnce(reactionsFound);
80
+ if (reactionsFound) {
81
+ // 3. Modal readiness polls
82
+ for (const ready of modalReadySequence) {
83
+ evaluateMock.mockResolvedValueOnce(ready);
84
+ }
85
+ // 4. Total reactions
86
+ evaluateMock.mockResolvedValueOnce(totalReactions);
87
+ // 5. Scrape + scroll interleaved
88
+ for (let i = 0; i < scrapeSequence.length; i++) {
89
+ evaluateMock.mockResolvedValueOnce(scrapeSequence[i]);
90
+ if (i < scrollSequence.length) {
91
+ evaluateMock.mockResolvedValueOnce(scrollSequence[i]);
92
+ }
93
+ }
94
+ }
95
+ vi.mocked(CDPClient).mockImplementation(function () {
96
+ return {
97
+ connect: vi.fn().mockResolvedValue(undefined),
98
+ disconnect,
99
+ navigate,
100
+ evaluate: evaluateMock,
101
+ send: vi.fn().mockResolvedValue(undefined),
102
+ };
103
+ });
104
+ return { evaluateMock, disconnect, navigate };
105
+ }
106
+ beforeEach(() => {
107
+ vi.clearAllMocks();
108
+ });
109
+ afterEach(() => {
110
+ vi.restoreAllMocks();
111
+ });
112
+ it("throws on non-loopback host without allowRemote", async () => {
113
+ await expect(getPostEngagers({
114
+ postUrl: POST_URL,
115
+ cdpPort: CDP_PORT,
116
+ cdpHost: "192.168.1.1",
117
+ })).rejects.toThrow("requires --allow-remote");
118
+ });
119
+ it("throws when no LinkedIn page found", async () => {
120
+ vi.mocked(discoverTargets).mockResolvedValue([]);
121
+ await expect(getPostEngagers({ postUrl: POST_URL, cdpPort: CDP_PORT })).rejects.toThrow("No LinkedIn page found in LinkedHelper");
122
+ });
123
+ it("navigates to post detail URL and extracts engagers from DOM", async () => {
124
+ const { navigate } = setupMocks();
125
+ const result = await getPostEngagers({
126
+ postUrl: POST_URL,
127
+ cdpPort: CDP_PORT,
128
+ });
129
+ expect(navigate).toHaveBeenCalledWith("https://www.linkedin.com/feed/update/urn:li:activity:1234567890/");
130
+ expect(result.postUrn).toBe("urn:li:activity:1234567890");
131
+ expect(result.engagers).toHaveLength(2);
132
+ expect(result.engagers[0]).toMatchObject({
133
+ firstName: "Jane",
134
+ lastName: "Doe",
135
+ publicId: "janedoe",
136
+ headline: "Software Engineer at ACME",
137
+ engagementType: "LIKE",
138
+ });
139
+ expect(result.engagers[1]).toMatchObject({
140
+ firstName: "John",
141
+ lastName: "Smith",
142
+ publicId: "johnsmith",
143
+ headline: "Product Manager",
144
+ engagementType: "PRAISE",
145
+ });
146
+ });
147
+ it("returns empty engagers when no reactions button found", async () => {
148
+ setupMocks({ reactionsFound: false });
149
+ const result = await getPostEngagers({
150
+ postUrl: POST_URL,
151
+ cdpPort: CDP_PORT,
152
+ });
153
+ expect(result.engagers).toEqual([]);
154
+ expect(result.paging).toEqual({ start: 0, count: 0, total: 0 });
155
+ });
156
+ it("returns paging metadata from modal total", async () => {
157
+ setupMocks({ totalReactions: 42 });
158
+ const result = await getPostEngagers({
159
+ postUrl: POST_URL,
160
+ cdpPort: CDP_PORT,
161
+ });
162
+ expect(result.paging).toEqual({ start: 0, count: 2, total: 42 });
163
+ });
164
+ it("handles empty engagers gracefully", async () => {
165
+ setupMocks({
166
+ scrapeSequence: [[]],
167
+ totalReactions: 0,
168
+ });
169
+ const result = await getPostEngagers({
170
+ postUrl: POST_URL,
171
+ cdpPort: CDP_PORT,
172
+ });
173
+ expect(result.engagers).toEqual([]);
174
+ expect(result.paging.count).toBe(0);
175
+ });
176
+ it("handles null evaluate result for engagers", async () => {
177
+ setupMocks({ scrapeSequence: [null] });
178
+ const result = await getPostEngagers({
179
+ postUrl: POST_URL,
180
+ cdpPort: CDP_PORT,
181
+ });
182
+ expect(result.engagers).toEqual([]);
183
+ });
184
+ it("scrolls modal for pagination", async () => {
185
+ const first = DEFAULT_ENGAGERS[0];
186
+ const partial = [first];
187
+ const full = [...DEFAULT_ENGAGERS];
188
+ setupMocks({
189
+ totalReactions: 2,
190
+ scrapeSequence: [partial, full],
191
+ scrollSequence: [true],
192
+ });
193
+ const result = await getPostEngagers({
194
+ postUrl: POST_URL,
195
+ cdpPort: CDP_PORT,
196
+ count: 2,
197
+ });
198
+ expect(result.engagers).toHaveLength(2);
199
+ });
200
+ it("stops scrolling when modal is at bottom", async () => {
201
+ const partial = [DEFAULT_ENGAGERS[0]];
202
+ setupMocks({
203
+ totalReactions: 5,
204
+ scrapeSequence: [partial, partial],
205
+ scrollSequence: [true, false],
206
+ });
207
+ const result = await getPostEngagers({
208
+ postUrl: POST_URL,
209
+ cdpPort: CDP_PORT,
210
+ count: 5,
211
+ });
212
+ // Only got 1 engager despite requesting 5
213
+ expect(result.engagers).toHaveLength(1);
214
+ });
215
+ it("respects count limit", async () => {
216
+ const many = [
217
+ ...DEFAULT_ENGAGERS,
218
+ {
219
+ firstName: "Alice",
220
+ lastName: "Wonder",
221
+ publicId: "alice",
222
+ headline: "Designer",
223
+ engagementType: "LIKE",
224
+ },
225
+ ];
226
+ setupMocks({
227
+ totalReactions: 3,
228
+ scrapeSequence: [many],
229
+ });
230
+ const result = await getPostEngagers({
231
+ postUrl: POST_URL,
232
+ cdpPort: CDP_PORT,
233
+ count: 2,
234
+ });
235
+ expect(result.engagers).toHaveLength(2);
236
+ expect(result.paging.count).toBe(2);
237
+ });
238
+ it("respects start offset", async () => {
239
+ setupMocks({ totalReactions: 2 });
240
+ const result = await getPostEngagers({
241
+ postUrl: POST_URL,
242
+ cdpPort: CDP_PORT,
243
+ start: 1,
244
+ count: 10,
245
+ });
246
+ expect(result.engagers).toHaveLength(1);
247
+ const engager = result.engagers[0];
248
+ expect(engager.firstName).toBe("John");
249
+ expect(result.paging.start).toBe(1);
250
+ });
251
+ it("waits for post to load with polling", async () => {
252
+ const { evaluateMock } = setupMocks({
253
+ postReadySequence: [false, false, true],
254
+ });
255
+ await getPostEngagers({ postUrl: POST_URL, cdpPort: CDP_PORT, count: 2 });
256
+ // 3 readiness + 1 click + 1 modal ready + 1 total + 1 scrape = 7
257
+ expect(evaluateMock).toHaveBeenCalledTimes(7);
258
+ });
259
+ it("waits for modal to load with polling", async () => {
260
+ const { evaluateMock } = setupMocks({
261
+ modalReadySequence: [false, true],
262
+ });
263
+ await getPostEngagers({ postUrl: POST_URL, cdpPort: CDP_PORT, count: 2 });
264
+ // 1 readiness + 1 click + 2 modal ready + 1 total + 1 scrape = 6
265
+ expect(evaluateMock).toHaveBeenCalledTimes(6);
266
+ });
267
+ it("disconnects CDP client after successful operation", async () => {
268
+ const { disconnect } = setupMocks();
269
+ await getPostEngagers({ postUrl: POST_URL, cdpPort: CDP_PORT });
270
+ expect(disconnect).toHaveBeenCalled();
271
+ });
272
+ it("disconnects CDP client even on error", async () => {
273
+ vi.mocked(discoverTargets).mockResolvedValue([
274
+ {
275
+ id: "target-1",
276
+ type: "page",
277
+ title: "LinkedIn",
278
+ url: "https://www.linkedin.com/feed/",
279
+ description: "",
280
+ devtoolsFrontendUrl: "",
281
+ },
282
+ ]);
283
+ const disconnect = vi.fn();
284
+ vi.mocked(CDPClient).mockImplementation(function () {
285
+ return {
286
+ connect: vi.fn().mockResolvedValue(undefined),
287
+ disconnect,
288
+ navigate: vi.fn().mockResolvedValue(undefined),
289
+ evaluate: vi.fn().mockRejectedValue(new Error("evaluate failed")),
290
+ send: vi.fn().mockResolvedValue(undefined),
291
+ };
292
+ });
293
+ await expect(getPostEngagers({ postUrl: POST_URL, cdpPort: CDP_PORT })).rejects.toThrow();
294
+ expect(disconnect).toHaveBeenCalled();
17
295
  });
18
296
  });
19
297
  //# sourceMappingURL=get-post-engagers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-post-engagers.test.js","sourceRoot":"","sources":["../../src/operations/get-post-engagers.test.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,mEAAmE;AACnE,iEAAiE;AACjE,mEAAmE;AACnE,yCAAyC;AAEzC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,gEAAgE;QAChE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"get-post-engagers.test.js","sourceRoot":"","sources":["../../src/operations/get-post-engagers.test.ts"],"names":[],"mappings":"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"}
@@ -24,12 +24,17 @@ export interface GetPostStatsOutput {
24
24
  * - Raw URN: `urn:li:activity:XXXXX`
25
25
  */
26
26
  export declare function extractPostUrn(input: string): string;
27
+ /**
28
+ * Resolve a post URL or URN into a navigable LinkedIn post detail URL.
29
+ * Accepts full LinkedIn URLs (returned as-is) or raw URNs (converted to URL).
30
+ */
31
+ export declare function resolvePostDetailUrl(input: string): string;
27
32
  /**
28
33
  * Retrieve engagement statistics for a LinkedIn post.
29
34
  *
30
- * Connects to the LinkedIn webview in LinkedHelper and calls the
31
- * Voyager feed social-detail API to get reaction breakdown, comment
32
- * count, and share count.
35
+ * Connects to the LinkedIn webview in LinkedHelper, navigates to the
36
+ * post detail page, and extracts engagement statistics from the
37
+ * rendered DOM.
33
38
  *
34
39
  * @param input - Post URL or URN and CDP connection parameters.
35
40
  * @returns Engagement statistics for the post.
@@ -1 +1 @@
1
- {"version":3,"file":"get-post-stats.d.ts","sourceRoot":"","sources":["../../src/operations/get-post-stats.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,4BAA4B,CAAC;AAK3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAapD;AA6DD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA6D7B"}
1
+ {"version":3,"file":"get-post-stats.d.ts","sourceRoot":"","sources":["../../src/operations/get-post-stats.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC1D,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAapD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1D;AA+ED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAqE7B"}
@@ -1,9 +1,11 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
+ import { resolveInstancePort } from "../cdp/index.js";
3
4
  import { CDPClient } from "../cdp/client.js";
4
5
  import { discoverTargets } from "../cdp/discovery.js";
5
- import { VoyagerInterceptor } from "../voyager/interceptor.js";
6
- import { DEFAULT_CDP_PORT } from "../constants.js";
6
+ import { gaussianDelay } from "../utils/delay.js";
7
+ import { delay } from "./get-feed.js";
8
+ import { navigateAwayIf } from "./navigate-away.js";
7
9
  /**
8
10
  * Extract a post activity URN from a LinkedIn post URL or raw URN.
9
11
  *
@@ -29,41 +31,97 @@ export function extractPostUrn(input) {
29
31
  throw new Error(`Cannot extract post URN from: ${input}`);
30
32
  }
31
33
  /**
32
- * Parse the Voyager social-detail response into a normalised PostStats.
34
+ * Resolve a post URL or URN into a navigable LinkedIn post detail URL.
35
+ * Accepts full LinkedIn URLs (returned as-is) or raw URNs (converted to URL).
33
36
  */
34
- function parseSocialDetailResponse(raw, postUrn) {
35
- // Support both nested (data.) and flat response shapes
36
- const counts = raw.data?.totalSocialActivityCounts ?? raw.totalSocialActivityCounts;
37
- const rawReactions = raw.data?.reactionTypeCounts ?? raw.reactionTypeCounts ?? [];
38
- const reactionsByType = rawReactions
39
- .filter((r) => r.reactionType !== undefined && r.count !== undefined)
40
- .map((r) => ({ type: r.reactionType, count: r.count }));
41
- const reactionCount = reactionsByType.length > 0
42
- ? reactionsByType.reduce((sum, r) => sum + r.count, 0)
43
- : (counts?.numLikes ?? 0);
44
- return {
45
- postUrn,
46
- reactionCount,
47
- reactionsByType,
48
- commentCount: counts?.numComments ?? 0,
49
- shareCount: counts?.numShares ?? 0,
50
- };
37
+ export function resolvePostDetailUrl(input) {
38
+ if (input.startsWith("https://"))
39
+ return input;
40
+ if (input.startsWith("urn:li:"))
41
+ return `https://www.linkedin.com/feed/update/${input}/`;
42
+ throw new Error(`Invalid post identifier: ${input}`);
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // In-page DOM scraping script
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * JavaScript source evaluated inside the LinkedIn post detail page to
49
+ * extract engagement statistics from the rendered DOM.
50
+ *
51
+ * The post detail page renders engagement counts as text content
52
+ * (e.g. "42 reactions", "5 comments", "3 reposts"). The script
53
+ * searches the page body text for these patterns.
54
+ */
55
+ const SCRAPE_POST_STATS_SCRIPT = `(() => {
56
+ let reactionCount = 0;
57
+ let commentCount = 0;
58
+ let shareCount = 0;
59
+
60
+ const countText = document.body.textContent || '';
61
+
62
+ function parseCount(pattern) {
63
+ const m = countText.match(pattern);
64
+ if (!m) return 0;
65
+ const raw = m[1].replace(/,/g, '');
66
+ const num = parseInt(raw, 10);
67
+ return isNaN(num) ? 0 : num;
68
+ }
69
+
70
+ reactionCount = parseCount(/(\\d[\\d,]*)\\s+reactions?/i);
71
+ commentCount = parseCount(/(\\d[\\d,]*)\\s+comments?/i);
72
+ shareCount = parseCount(/(\\d[\\d,]*)\\s+reposts?/i);
73
+
74
+ return { reactionCount, commentCount, shareCount };
75
+ })()`;
76
+ // ---------------------------------------------------------------------------
77
+ // Wait for post detail to load
78
+ // ---------------------------------------------------------------------------
79
+ /**
80
+ * Poll the DOM until the post detail page has rendered. The page is
81
+ * considered ready when an author link and at least one `span[dir="ltr"]`
82
+ * are present.
83
+ */
84
+ async function waitForPostLoad(client, timeoutMs = 15_000) {
85
+ const deadline = Date.now() + timeoutMs;
86
+ while (Date.now() < deadline) {
87
+ const ready = await client.evaluate(`(() => {
88
+ const authorLink = document.querySelector('a[href*="/in/"], a[href*="/company/"]');
89
+ if (!authorLink) return false;
90
+ const ltrSpans = document.querySelectorAll('span[dir="ltr"]');
91
+ return ltrSpans.length > 0;
92
+ })()`);
93
+ if (ready)
94
+ return;
95
+ await delay(500);
96
+ }
97
+ throw new Error("Timed out waiting for post detail to appear in the DOM");
51
98
  }
99
+ // ---------------------------------------------------------------------------
100
+ // Main operation
101
+ // ---------------------------------------------------------------------------
52
102
  /**
53
103
  * Retrieve engagement statistics for a LinkedIn post.
54
104
  *
55
- * Connects to the LinkedIn webview in LinkedHelper and calls the
56
- * Voyager feed social-detail API to get reaction breakdown, comment
57
- * count, and share count.
105
+ * Connects to the LinkedIn webview in LinkedHelper, navigates to the
106
+ * post detail page, and extracts engagement statistics from the
107
+ * rendered DOM.
58
108
  *
59
109
  * @param input - Post URL or URN and CDP connection parameters.
60
110
  * @returns Engagement statistics for the post.
61
111
  */
62
112
  export async function getPostStats(input) {
63
- const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
113
+ const cdpPort = await resolveInstancePort(input.cdpPort, input.cdpHost);
64
114
  const cdpHost = input.cdpHost ?? "127.0.0.1";
65
115
  const allowRemote = input.allowRemote ?? false;
66
- const postUrn = extractPostUrn(input.postUrl);
116
+ const postDetailUrl = resolvePostDetailUrl(input.postUrl);
117
+ // Keep using extractPostUrn for the output postUrn field
118
+ let postUrn;
119
+ try {
120
+ postUrn = extractPostUrn(input.postUrl);
121
+ }
122
+ catch {
123
+ postUrn = input.postUrl;
124
+ }
67
125
  // Enforce loopback guard
68
126
  if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
69
127
  throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
@@ -78,19 +136,25 @@ export async function getPostStats(input) {
78
136
  const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
79
137
  await client.connect(linkedInTarget.id);
80
138
  try {
81
- const voyager = new VoyagerInterceptor(client);
82
- const encodedUrn = encodeURIComponent(postUrn);
83
- const path = `/voyager/api/feed/dash/feedSocialDetails` +
84
- `?q=socialDetailsByFeedUpdate&feedUpdateUrn=${encodedUrn}`;
85
- const response = await voyager.fetch(path);
86
- if (response.status !== 200) {
87
- throw new Error(`Voyager API returned HTTP ${String(response.status)} for post stats`);
88
- }
89
- const body = response.body;
90
- if (body === null || typeof body !== "object") {
91
- throw new Error("Voyager API returned an unexpected response format for post stats");
139
+ // Navigate away if already on the post detail page to force a fresh load
140
+ await navigateAwayIf(client, "/feed/update/");
141
+ // Navigate to the post detail page
142
+ await client.navigate(postDetailUrl);
143
+ // Wait for the post content to render
144
+ await waitForPostLoad(client);
145
+ // Extract engagement stats from the DOM
146
+ const raw = await client.evaluate(SCRAPE_POST_STATS_SCRIPT);
147
+ if (!raw) {
148
+ throw new Error("Failed to extract post stats from the DOM");
92
149
  }
93
- const stats = parseSocialDetailResponse(body, postUrn);
150
+ const stats = {
151
+ postUrn,
152
+ reactionCount: raw.reactionCount,
153
+ reactionsByType: [],
154
+ commentCount: raw.commentCount,
155
+ shareCount: raw.shareCount,
156
+ };
157
+ await gaussianDelay(800, 300, 300, 1_800); // Post-action dwell
94
158
  return { stats };
95
159
  }
96
160
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"get-post-stats.js","sourceRoot":"","sources":["../../src/operations/get-post-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-post-stats.js","sourceRoot":"","sources":["../../src/operations/get-post-stats.ts"],"names":[],"mappings":"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"}