asyar-sdk 1.16.2 → 2.0.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 (281) hide show
  1. package/README.md +95 -42
  2. package/dist/ExtensionBridge.d.ts +1 -1
  3. package/dist/ExtensionBridge.d.ts.map +1 -1
  4. package/dist/ExtensionBridge.js +17 -13
  5. package/dist/ExtensionBridge.js.map +1 -1
  6. package/dist/ExtensionBridge.test.js +76 -101
  7. package/dist/ExtensionBridge.test.js.map +1 -1
  8. package/dist/ExtensionContext.d.ts +22 -57
  9. package/dist/ExtensionContext.d.ts.map +1 -1
  10. package/dist/ExtensionContext.js +84 -207
  11. package/dist/ExtensionContext.js.map +1 -1
  12. package/dist/ExtensionContext.test.js +91 -66
  13. package/dist/ExtensionContext.test.js.map +1 -1
  14. package/dist/ExtensionContextCore.d.ts +46 -0
  15. package/dist/ExtensionContextCore.d.ts.map +1 -0
  16. package/dist/ExtensionContextCore.js +149 -0
  17. package/dist/ExtensionContextCore.js.map +1 -0
  18. package/dist/PreferencesFacade.js +4 -9
  19. package/dist/PreferencesFacade.js.map +1 -1
  20. package/dist/PreferencesFacade.test.js +53 -55
  21. package/dist/PreferencesFacade.test.js.map +1 -1
  22. package/dist/cli/commands/attach.js +1 -1
  23. package/dist/cli/commands/attach.js.map +1 -1
  24. package/dist/cli/commands/build.d.ts +5 -1
  25. package/dist/cli/commands/build.d.ts.map +1 -1
  26. package/dist/cli/commands/build.js +43 -5
  27. package/dist/cli/commands/build.js.map +1 -1
  28. package/dist/cli/lib/manifest.d.ts +17 -5
  29. package/dist/cli/lib/manifest.d.ts.map +1 -1
  30. package/dist/cli/lib/manifest.js +125 -66
  31. package/dist/cli/lib/manifest.js.map +1 -1
  32. package/dist/{index.d.ts → contracts.d.ts} +23 -1
  33. package/dist/contracts.d.ts.map +1 -0
  34. package/dist/contracts.js +36 -0
  35. package/dist/contracts.js.map +1 -0
  36. package/dist/contracts.purity.test.d.ts +2 -0
  37. package/dist/contracts.purity.test.d.ts.map +1 -0
  38. package/dist/contracts.purity.test.js +42 -0
  39. package/dist/contracts.purity.test.js.map +1 -0
  40. package/dist/icons/AsyarIconElement.js +4 -9
  41. package/dist/icons/AsyarIconElement.js.map +1 -1
  42. package/dist/icons/AsyarIconElement.test.js +14 -16
  43. package/dist/icons/AsyarIconElement.test.js.map +1 -1
  44. package/dist/icons/IconRenderer.js +9 -15
  45. package/dist/icons/IconRenderer.js.map +1 -1
  46. package/dist/icons/IconRenderer.test.js +63 -65
  47. package/dist/icons/IconRenderer.test.js.map +1 -1
  48. package/dist/icons/iconData.js +2 -5
  49. package/dist/icons/iconData.js.map +1 -1
  50. package/dist/icons/index.js +3 -14
  51. package/dist/icons/index.js.map +1 -1
  52. package/dist/ipc/MessageBroker.d.ts.map +1 -1
  53. package/dist/ipc/MessageBroker.js +33 -6
  54. package/dist/ipc/MessageBroker.js.map +1 -1
  55. package/dist/ipc/MessageBroker.test.js +26 -28
  56. package/dist/ipc/MessageBroker.test.js.map +1 -1
  57. package/dist/ipc/devInspectorBridge.d.ts +57 -0
  58. package/dist/ipc/devInspectorBridge.d.ts.map +1 -0
  59. package/dist/ipc/devInspectorBridge.js +70 -0
  60. package/dist/ipc/devInspectorBridge.js.map +1 -0
  61. package/dist/ipc/devInspectorBridge.test.d.ts +2 -0
  62. package/dist/ipc/devInspectorBridge.test.d.ts.map +1 -0
  63. package/dist/ipc/devInspectorBridge.test.js +128 -0
  64. package/dist/ipc/devInspectorBridge.test.js.map +1 -0
  65. package/dist/ipc/namespaces.d.ts +1 -1
  66. package/dist/ipc/namespaces.d.ts.map +1 -1
  67. package/dist/ipc/namespaces.js +4 -7
  68. package/dist/ipc/namespaces.js.map +1 -1
  69. package/dist/ipc/namespaces.test.js +11 -13
  70. package/dist/ipc/namespaces.test.js.map +1 -1
  71. package/dist/lib/focusTracker.js +1 -4
  72. package/dist/lib/focusTracker.js.map +1 -1
  73. package/dist/lib/focusTracker.test.js +32 -57
  74. package/dist/lib/focusTracker.test.js.map +1 -1
  75. package/dist/lib/syncProviderBridge.js +1 -4
  76. package/dist/lib/syncProviderBridge.js.map +1 -1
  77. package/dist/lib/syncProviderBridge.test.js +60 -85
  78. package/dist/lib/syncProviderBridge.test.js.map +1 -1
  79. package/dist/lib/themeInjector.js +3 -8
  80. package/dist/lib/themeInjector.js.map +1 -1
  81. package/dist/lib/themeInjector.test.js +42 -44
  82. package/dist/lib/themeInjector.test.js.map +1 -1
  83. package/dist/search/SearchEngine.js +3 -10
  84. package/dist/search/SearchEngine.js.map +1 -1
  85. package/dist/search/SearchEngine.test.js +53 -55
  86. package/dist/search/SearchEngine.test.js.map +1 -1
  87. package/dist/search/index.js +2 -8
  88. package/dist/search/index.js.map +1 -1
  89. package/dist/search/textUtils.js +2 -6
  90. package/dist/search/textUtils.js.map +1 -1
  91. package/dist/search/textUtils.test.js +73 -75
  92. package/dist/search/textUtils.test.js.map +1 -1
  93. package/dist/search/types.js +1 -2
  94. package/dist/services/AIServiceProxy.js +2 -6
  95. package/dist/services/AIServiceProxy.js.map +1 -1
  96. package/dist/services/AIServiceProxy.test.js +69 -71
  97. package/dist/services/AIServiceProxy.test.js.map +1 -1
  98. package/dist/services/ActionServiceProxy.d.ts.map +1 -1
  99. package/dist/services/ActionServiceProxy.js +14 -13
  100. package/dist/services/ActionServiceProxy.js.map +1 -1
  101. package/dist/services/ActionServiceProxy.test.js +28 -23
  102. package/dist/services/ActionServiceProxy.test.js.map +1 -1
  103. package/dist/services/ApplicationService.js +2 -6
  104. package/dist/services/ApplicationService.js.map +1 -1
  105. package/dist/services/ApplicationService.test.js +108 -110
  106. package/dist/services/ApplicationService.test.js.map +1 -1
  107. package/dist/services/BaseServiceProxy.js +3 -7
  108. package/dist/services/BaseServiceProxy.js.map +1 -1
  109. package/dist/services/CacheServiceProxy.js +2 -6
  110. package/dist/services/CacheServiceProxy.js.map +1 -1
  111. package/dist/services/CacheServiceProxy.test.js +21 -23
  112. package/dist/services/CacheServiceProxy.test.js.map +1 -1
  113. package/dist/services/ClipboardHistoryServiceProxy.js +6 -10
  114. package/dist/services/ClipboardHistoryServiceProxy.js.map +1 -1
  115. package/dist/services/ClipboardHistoryServiceProxy.test.js +106 -108
  116. package/dist/services/ClipboardHistoryServiceProxy.test.js.map +1 -1
  117. package/dist/services/CommandServiceProxy.js +7 -11
  118. package/dist/services/CommandServiceProxy.js.map +1 -1
  119. package/dist/services/CommandServiceProxy.test.js +37 -39
  120. package/dist/services/CommandServiceProxy.test.js.map +1 -1
  121. package/dist/services/EntitlementServiceProxy.js +2 -6
  122. package/dist/services/EntitlementServiceProxy.js.map +1 -1
  123. package/dist/services/EntitlementServiceProxy.test.js +16 -18
  124. package/dist/services/EntitlementServiceProxy.test.js.map +1 -1
  125. package/dist/services/ExtensionManagerProxy.js +2 -6
  126. package/dist/services/ExtensionManagerProxy.js.map +1 -1
  127. package/dist/services/ExtensionManagerProxy.test.js +42 -44
  128. package/dist/services/ExtensionManagerProxy.test.js.map +1 -1
  129. package/dist/services/ExtensionRpc.d.ts +90 -0
  130. package/dist/services/ExtensionRpc.d.ts.map +1 -0
  131. package/dist/services/ExtensionRpc.js +277 -0
  132. package/dist/services/ExtensionRpc.js.map +1 -0
  133. package/dist/services/ExtensionRpc.test.d.ts +2 -0
  134. package/dist/services/ExtensionRpc.test.d.ts.map +1 -0
  135. package/dist/services/ExtensionRpc.test.js +259 -0
  136. package/dist/services/ExtensionRpc.test.js.map +1 -0
  137. package/dist/services/ExtensionStateProxy.d.ts +44 -0
  138. package/dist/services/ExtensionStateProxy.d.ts.map +1 -0
  139. package/dist/services/ExtensionStateProxy.js +115 -0
  140. package/dist/services/ExtensionStateProxy.js.map +1 -0
  141. package/dist/services/ExtensionStateProxy.test.d.ts +2 -0
  142. package/dist/services/ExtensionStateProxy.test.d.ts.map +1 -0
  143. package/dist/services/ExtensionStateProxy.test.js +158 -0
  144. package/dist/services/ExtensionStateProxy.test.js.map +1 -0
  145. package/dist/services/FeedbackServiceProxy.js +2 -6
  146. package/dist/services/FeedbackServiceProxy.js.map +1 -1
  147. package/dist/services/FeedbackServiceProxy.test.js +31 -33
  148. package/dist/services/FeedbackServiceProxy.test.js.map +1 -1
  149. package/dist/services/FileManagerServiceProxy.js +2 -6
  150. package/dist/services/FileManagerServiceProxy.js.map +1 -1
  151. package/dist/services/FileManagerServiceProxy.test.js +21 -23
  152. package/dist/services/FileManagerServiceProxy.test.js.map +1 -1
  153. package/dist/services/FileSystemWatcherService.js +2 -6
  154. package/dist/services/FileSystemWatcherService.js.map +1 -1
  155. package/dist/services/FileSystemWatcherService.test.js +45 -47
  156. package/dist/services/FileSystemWatcherService.test.js.map +1 -1
  157. package/dist/services/IAIService.js +1 -2
  158. package/dist/services/ICacheService.js +1 -2
  159. package/dist/services/IClipboardHistoryService.js +1 -2
  160. package/dist/services/ICommandService.js +1 -2
  161. package/dist/services/IEntitlementService.js +1 -2
  162. package/dist/services/IExtensionManager.js +1 -2
  163. package/dist/services/IFeedbackService.js +1 -2
  164. package/dist/services/IFileManagerService.js +1 -2
  165. package/dist/services/IInteropService.js +1 -5
  166. package/dist/services/IInteropService.js.map +1 -1
  167. package/dist/services/INotificationService.js +1 -2
  168. package/dist/services/IOAuthService.js +1 -2
  169. package/dist/services/IPowerService.js +1 -2
  170. package/dist/services/IPreferencesService.js +1 -2
  171. package/dist/services/ISelectionService.js +1 -2
  172. package/dist/services/ISettingsService.js +1 -2
  173. package/dist/services/IShellService.js +1 -2
  174. package/dist/services/IStatusBarService.js +1 -2
  175. package/dist/services/IStorageService.js +1 -2
  176. package/dist/services/ISystemEventsService.js +1 -2
  177. package/dist/services/ISystemEventsService.js.map +1 -1
  178. package/dist/services/ITimerService.js +1 -2
  179. package/dist/services/InteropServiceProxy.js +2 -6
  180. package/dist/services/InteropServiceProxy.js.map +1 -1
  181. package/dist/services/InteropServiceProxy.test.js +19 -21
  182. package/dist/services/InteropServiceProxy.test.js.map +1 -1
  183. package/dist/services/LogService.js +1 -2
  184. package/dist/services/LogServiceProxy.js +2 -6
  185. package/dist/services/LogServiceProxy.js.map +1 -1
  186. package/dist/services/LogServiceProxy.test.js +43 -45
  187. package/dist/services/LogServiceProxy.test.js.map +1 -1
  188. package/dist/services/NetworkServiceProxy.js +2 -6
  189. package/dist/services/NetworkServiceProxy.js.map +1 -1
  190. package/dist/services/NetworkServiceProxy.test.js +20 -22
  191. package/dist/services/NetworkServiceProxy.test.js.map +1 -1
  192. package/dist/services/NotificationServiceProxy.js +2 -6
  193. package/dist/services/NotificationServiceProxy.js.map +1 -1
  194. package/dist/services/NotificationServiceProxy.test.js +39 -41
  195. package/dist/services/NotificationServiceProxy.test.js.map +1 -1
  196. package/dist/services/OAuthServiceProxy.js +2 -6
  197. package/dist/services/OAuthServiceProxy.js.map +1 -1
  198. package/dist/services/OAuthServiceProxy.test.js +42 -44
  199. package/dist/services/OAuthServiceProxy.test.js.map +1 -1
  200. package/dist/services/PowerServiceProxy.js +2 -6
  201. package/dist/services/PowerServiceProxy.js.map +1 -1
  202. package/dist/services/PowerServiceProxy.test.js +24 -26
  203. package/dist/services/PowerServiceProxy.test.js.map +1 -1
  204. package/dist/services/PreferencesServiceProxy.js +2 -6
  205. package/dist/services/PreferencesServiceProxy.js.map +1 -1
  206. package/dist/services/PreferencesServiceProxy.test.js +22 -24
  207. package/dist/services/PreferencesServiceProxy.test.js.map +1 -1
  208. package/dist/services/SelectionServiceProxy.js +2 -6
  209. package/dist/services/SelectionServiceProxy.js.map +1 -1
  210. package/dist/services/SelectionServiceProxy.test.js +20 -22
  211. package/dist/services/SelectionServiceProxy.test.js.map +1 -1
  212. package/dist/services/SettingsServiceProxy.js +2 -6
  213. package/dist/services/SettingsServiceProxy.js.map +1 -1
  214. package/dist/services/SettingsServiceProxy.test.js +18 -20
  215. package/dist/services/SettingsServiceProxy.test.js.map +1 -1
  216. package/dist/services/ShellServiceProxy.js +2 -6
  217. package/dist/services/ShellServiceProxy.js.map +1 -1
  218. package/dist/services/ShellServiceProxy.test.js +92 -94
  219. package/dist/services/ShellServiceProxy.test.js.map +1 -1
  220. package/dist/services/StatusBarServiceProxy.js +9 -13
  221. package/dist/services/StatusBarServiceProxy.js.map +1 -1
  222. package/dist/services/StatusBarServiceProxy.test.js +68 -70
  223. package/dist/services/StatusBarServiceProxy.test.js.map +1 -1
  224. package/dist/services/StorageServiceProxy.js +2 -6
  225. package/dist/services/StorageServiceProxy.js.map +1 -1
  226. package/dist/services/StorageServiceProxy.test.js +31 -33
  227. package/dist/services/StorageServiceProxy.test.js.map +1 -1
  228. package/dist/services/SystemEventsServiceProxy.js +2 -6
  229. package/dist/services/SystemEventsServiceProxy.js.map +1 -1
  230. package/dist/services/SystemEventsServiceProxy.test.js +50 -52
  231. package/dist/services/SystemEventsServiceProxy.test.js.map +1 -1
  232. package/dist/services/TimerServiceProxy.js +2 -6
  233. package/dist/services/TimerServiceProxy.js.map +1 -1
  234. package/dist/services/TimerServiceProxy.test.js +33 -35
  235. package/dist/services/TimerServiceProxy.test.js.map +1 -1
  236. package/dist/services/WindowManagementService.js +2 -6
  237. package/dist/services/WindowManagementService.js.map +1 -1
  238. package/dist/services/WindowManagementService.test.js +23 -25
  239. package/dist/services/WindowManagementService.test.js.map +1 -1
  240. package/dist/services/index.js +36 -76
  241. package/dist/services/index.js.map +1 -1
  242. package/dist/services/statusBarValidation.js +7 -14
  243. package/dist/services/statusBarValidation.js.map +1 -1
  244. package/dist/types/ActionType.js +3 -6
  245. package/dist/types/ActionType.js.map +1 -1
  246. package/dist/types/ApplicationType.js +1 -2
  247. package/dist/types/ClipboardType.js +2 -5
  248. package/dist/types/ClipboardType.js.map +1 -1
  249. package/dist/types/CommandType.js +1 -2
  250. package/dist/types/ExtensionType.d.ts +40 -5
  251. package/dist/types/ExtensionType.d.ts.map +1 -1
  252. package/dist/types/ExtensionType.js +1 -2
  253. package/dist/types/NetworkType.js +1 -2
  254. package/dist/types/NotificationType.js +1 -2
  255. package/dist/types/SyncType.js +1 -2
  256. package/dist/types/index.js +2 -18
  257. package/dist/types/index.js.map +1 -1
  258. package/dist/view.d.ts +12 -0
  259. package/dist/view.d.ts.map +1 -0
  260. package/dist/view.js +19 -0
  261. package/dist/view.js.map +1 -0
  262. package/dist/view.test.d.ts +2 -0
  263. package/dist/view.test.d.ts.map +1 -0
  264. package/dist/view.test.js +114 -0
  265. package/dist/view.test.js.map +1 -0
  266. package/dist/worker.bundle-size.test.d.ts +2 -0
  267. package/dist/worker.bundle-size.test.d.ts.map +1 -0
  268. package/dist/worker.bundle-size.test.js +96 -0
  269. package/dist/worker.bundle-size.test.js.map +1 -0
  270. package/dist/worker.d.ts +37 -0
  271. package/dist/worker.d.ts.map +1 -0
  272. package/dist/worker.js +122 -0
  273. package/dist/worker.js.map +1 -0
  274. package/dist/worker.test.d.ts +2 -0
  275. package/dist/worker.test.d.ts.map +1 -0
  276. package/dist/worker.test.js +136 -0
  277. package/dist/worker.test.js.map +1 -0
  278. package/package.json +12 -4
  279. package/dist/index.d.ts.map +0 -1
  280. package/dist/index.js +0 -47
  281. package/dist/index.js.map +0 -1
@@ -0,0 +1,277 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { BaseServiceProxy } from './BaseServiceProxy';
11
+ import { emitRpcLog } from '../ipc/devInspectorBridge';
12
+ const DEFAULT_TIMEOUT_MS = 5000;
13
+ export class ExtensionRpc extends BaseServiceProxy {
14
+ constructor() {
15
+ super(...arguments);
16
+ // ── view-side state ─────────────────────────────────────────────────────
17
+ this.pending = new Map();
18
+ this.viewListenerInstalled = false;
19
+ this.pagehideInstalled = false;
20
+ // ── worker-side state ───────────────────────────────────────────────────
21
+ this.handlers = new Map();
22
+ this.inFlight = new Map();
23
+ }
24
+ // ── view-side: request / abort ──────────────────────────────────────────
25
+ /**
26
+ * Send a request to this extension's worker. Resolves with the worker's
27
+ * return value; rejects on worker-side throw, on host RPC error, or on
28
+ * timeout (default 5000 ms, overridable via `opts.timeoutMs`).
29
+ *
30
+ * Generates a correlation id, enqueues via `state:rpcRequest`, stores a
31
+ * pending-reply entry keyed by the id, starts a timer. Reply arrival
32
+ * (via `asyar:event:state:rpc-reply:push`) resolves/rejects the entry
33
+ * and cancels the timer. Timeout rejects, fires `state:rpcAbort` so the
34
+ * worker handler's AbortSignal trips, and removes the entry so a stale
35
+ * reply is silently dropped.
36
+ */
37
+ request(id, payload, opts) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ var _a;
40
+ this.ensureViewListener();
41
+ const timeoutMs = (_a = opts === null || opts === void 0 ? void 0 : opts.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;
42
+ const correlationId = this.generateCorrelationId();
43
+ const startedAt = Date.now();
44
+ emitRpcLog({
45
+ phase: 'request',
46
+ id,
47
+ correlationId,
48
+ payload,
49
+ timeoutMs,
50
+ timestamp: startedAt,
51
+ extensionId: this.extensionId || undefined,
52
+ });
53
+ return new Promise((resolve, reject) => {
54
+ const timer = setTimeout(() => {
55
+ const entry = this.pending.get(correlationId);
56
+ if (!entry || entry.settled)
57
+ return;
58
+ entry.settled = true;
59
+ this.pending.delete(correlationId);
60
+ emitRpcLog({
61
+ phase: 'timeout',
62
+ id: entry.id,
63
+ correlationId,
64
+ elapsedMs: Date.now() - entry.startedAt,
65
+ timestamp: Date.now(),
66
+ extensionId: this.extensionId || undefined,
67
+ });
68
+ // Best-effort abort notification to the worker.
69
+ this.broker
70
+ .invoke('state:rpcAbort', { correlationId })
71
+ .catch(() => { });
72
+ reject(new Error(`RPC timeout after ${timeoutMs}ms for id=${id}`));
73
+ }, timeoutMs);
74
+ this.pending.set(correlationId, {
75
+ resolve,
76
+ reject,
77
+ timer,
78
+ settled: false,
79
+ startedAt,
80
+ id,
81
+ timeoutMs,
82
+ });
83
+ // Fire-and-forget the enqueue; the reply comes back through the
84
+ // push listener, not this invoke's resolution.
85
+ this.broker
86
+ .invoke('state:rpcRequest', { id, correlationId, payload })
87
+ .catch((err) => {
88
+ const entry = this.pending.get(correlationId);
89
+ if (!entry || entry.settled)
90
+ return;
91
+ entry.settled = true;
92
+ clearTimeout(entry.timer);
93
+ this.pending.delete(correlationId);
94
+ const msg = err instanceof Error ? err.message : String(err);
95
+ emitRpcLog({
96
+ phase: 'rejected',
97
+ id: entry.id,
98
+ correlationId,
99
+ error: msg,
100
+ elapsedMs: Date.now() - entry.startedAt,
101
+ timestamp: Date.now(),
102
+ extensionId: this.extensionId || undefined,
103
+ });
104
+ reject(err instanceof Error ? err : new Error(String(err)));
105
+ });
106
+ });
107
+ });
108
+ }
109
+ /**
110
+ * Install the view-side `asyar:event:state:rpc-reply:push` listener.
111
+ * Idempotent. Callers: the view-entry factory.
112
+ */
113
+ installViewMessageListener() {
114
+ this.ensureViewListener();
115
+ }
116
+ /**
117
+ * Install a `pagehide` listener that drops every pending reply so the
118
+ * next view mount sees no zombie state. Stale replies arriving post-
119
+ * pagehide are dropped silently.
120
+ */
121
+ installViewAutoCleanup() {
122
+ if (this.pagehideInstalled)
123
+ return;
124
+ this.pagehideInstalled = true;
125
+ if (typeof window === 'undefined')
126
+ return;
127
+ window.addEventListener('pagehide', () => this.disposeAllPending());
128
+ }
129
+ /**
130
+ * Clear every pending-reply entry. Exposed (not private) so tests can
131
+ * trigger the same cleanup pagehide would run.
132
+ */
133
+ disposeAllPending() {
134
+ for (const entry of this.pending.values()) {
135
+ entry.settled = true;
136
+ clearTimeout(entry.timer);
137
+ }
138
+ this.pending.clear();
139
+ }
140
+ ensureViewListener() {
141
+ if (this.viewListenerInstalled)
142
+ return;
143
+ this.viewListenerInstalled = true;
144
+ this.broker.on('asyar:event:state:rpc-reply:push', (payload) => {
145
+ if (!payload || typeof payload !== 'object')
146
+ return;
147
+ const p = payload;
148
+ if (typeof p.correlationId !== 'string')
149
+ return;
150
+ const entry = this.pending.get(p.correlationId);
151
+ if (!entry || entry.settled)
152
+ return;
153
+ entry.settled = true;
154
+ clearTimeout(entry.timer);
155
+ this.pending.delete(p.correlationId);
156
+ const elapsedMs = Date.now() - entry.startedAt;
157
+ if (typeof p.error === 'string') {
158
+ emitRpcLog({
159
+ phase: 'rejected',
160
+ id: entry.id,
161
+ correlationId: p.correlationId,
162
+ error: p.error,
163
+ elapsedMs,
164
+ timestamp: Date.now(),
165
+ extensionId: this.extensionId || undefined,
166
+ });
167
+ entry.reject(new Error(p.error));
168
+ }
169
+ else {
170
+ emitRpcLog({
171
+ phase: 'resolved',
172
+ id: entry.id,
173
+ correlationId: p.correlationId,
174
+ result: p.result,
175
+ elapsedMs,
176
+ timestamp: Date.now(),
177
+ extensionId: this.extensionId || undefined,
178
+ });
179
+ entry.resolve(p.result);
180
+ }
181
+ });
182
+ }
183
+ generateCorrelationId() {
184
+ // Correlation ids only need to be unique within one extension's view
185
+ // iframe for the lifetime of one pending request. Math.random twice
186
+ // concatenated gives ~15 bytes of entropy which is more than enough.
187
+ return (Math.random().toString(36).slice(2, 15) +
188
+ Math.random().toString(36).slice(2, 15));
189
+ }
190
+ // ── worker-side: onRequest / delivery / abort ──────────────────────────
191
+ /**
192
+ * Register a handler for `id`. Overwrites any previous handler for the
193
+ * same id; extensions that need fan-out can branch inside the handler.
194
+ */
195
+ onRequest(id, handler) {
196
+ this.handlers.set(id, handler);
197
+ return () => {
198
+ if (this.handlers.get(id) === handler)
199
+ this.handlers.delete(id);
200
+ };
201
+ }
202
+ /**
203
+ * Install the worker-side delivery shim. This method exists so tests can
204
+ * trigger the listener installation explicitly; the worker entry-point
205
+ * factory calls it once at bootstrap.
206
+ *
207
+ * The SDK inspects every `asyar:action:execute` message for a top-level
208
+ * `__rpc__` discriminator and routes RPC envelopes here. The glue lives
209
+ * in the worker entry factory (it has the `window` handle). This class
210
+ * only exposes [`deliverActionPayload`] so the factory can feed one
211
+ * payload at a time.
212
+ */
213
+ installWorkerMessageListener() {
214
+ // No-op: the wiring lives in the worker entry factory. This method
215
+ // makes the SDK surface symmetric with the view-side equivalent and
216
+ // gives tests a stable hook that doesn't drag in the factory.
217
+ }
218
+ /**
219
+ * Test + factory entry: hand one `asyar:action:execute` payload to the
220
+ * RPC dispatcher. Non-RPC payloads are ignored (the factory should not
221
+ * call this for those; tests do).
222
+ */
223
+ deliverActionPayload(payload) {
224
+ if (!payload || typeof payload !== 'object')
225
+ return;
226
+ const p = payload;
227
+ if (p.__rpc__ === 'request') {
228
+ if (typeof p.id !== 'string' || typeof p.correlationId !== 'string')
229
+ return;
230
+ this.dispatchRequest(p.id, p.correlationId, p.payload);
231
+ }
232
+ else if (p.__rpc__ === 'abort') {
233
+ if (typeof p.correlationId !== 'string')
234
+ return;
235
+ this.dispatchAbort(p.correlationId);
236
+ }
237
+ }
238
+ dispatchRequest(id, correlationId, payload) {
239
+ const handler = this.handlers.get(id);
240
+ if (!handler) {
241
+ this.broker
242
+ .invoke('state:rpcReply', {
243
+ correlationId,
244
+ error: `No handler registered for RPC id "${id}"`,
245
+ })
246
+ .catch(() => { });
247
+ return;
248
+ }
249
+ const controller = new AbortController();
250
+ this.inFlight.set(correlationId, { controller });
251
+ void (() => __awaiter(this, void 0, void 0, function* () {
252
+ try {
253
+ const result = yield handler(payload, controller.signal);
254
+ this.inFlight.delete(correlationId);
255
+ yield this.broker
256
+ .invoke('state:rpcReply', { correlationId, result })
257
+ .catch(() => { });
258
+ }
259
+ catch (err) {
260
+ this.inFlight.delete(correlationId);
261
+ const msg = err instanceof Error ? err.message : String(err);
262
+ yield this.broker
263
+ .invoke('state:rpcReply', { correlationId, error: msg })
264
+ .catch(() => { });
265
+ }
266
+ }))();
267
+ }
268
+ dispatchAbort(correlationId) {
269
+ const h = this.inFlight.get(correlationId);
270
+ if (!h)
271
+ return;
272
+ h.controller.abort();
273
+ this.inFlight.delete(correlationId);
274
+ }
275
+ }
276
+ export const extensionRpc = new ExtensionRpc();
277
+ //# sourceMappingURL=ExtensionRpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRpc.js","sourceRoot":"","sources":["../../src/services/ExtensionRpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExtensionRpc.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRpc.test.d.ts","sourceRoot":"","sources":["../../src/services/ExtensionRpc.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,259 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /** @vitest-environment jsdom */
11
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
12
+ import { messageBroker } from '../ipc/MessageBroker';
13
+ import { ExtensionRpc, extensionRpc } from './ExtensionRpc';
14
+ describe('ExtensionRpc', () => {
15
+ let invokeSpy;
16
+ let onSpy;
17
+ let pushHandlers;
18
+ beforeEach(() => {
19
+ vi.useFakeTimers();
20
+ invokeSpy = vi.spyOn(messageBroker, 'invoke');
21
+ pushHandlers = new Map();
22
+ onSpy = vi.spyOn(messageBroker, 'on').mockImplementation(((event, handler) => {
23
+ var _a;
24
+ const list = (_a = pushHandlers.get(event)) !== null && _a !== void 0 ? _a : [];
25
+ list.push(handler);
26
+ pushHandlers.set(event, list);
27
+ }));
28
+ });
29
+ afterEach(() => {
30
+ vi.useRealTimers();
31
+ invokeSpy.mockRestore();
32
+ onSpy.mockRestore();
33
+ });
34
+ function deliverPush(event, payload) {
35
+ var _a;
36
+ for (const h of (_a = pushHandlers.get(event)) !== null && _a !== void 0 ? _a : [])
37
+ h(payload);
38
+ }
39
+ // ── view-side: request → reply happy path ──────────────────────────────
40
+ it('request invokes state:rpcRequest with id, correlationId, payload', () => __awaiter(void 0, void 0, void 0, function* () {
41
+ invokeSpy.mockResolvedValue(undefined);
42
+ const rpc = new ExtensionRpc();
43
+ rpc.installViewMessageListener();
44
+ const promise = rpc.request('start', { minutes: 25 });
45
+ // Microtask for the await on broker.invoke inside request.
46
+ yield Promise.resolve();
47
+ expect(invokeSpy).toHaveBeenCalledTimes(1);
48
+ const [type, payload] = invokeSpy.mock.calls[0];
49
+ expect(type).toBe('state:rpcRequest');
50
+ expect(payload).toMatchObject({
51
+ id: 'start',
52
+ payload: { minutes: 25 },
53
+ });
54
+ const correlationId = payload.correlationId;
55
+ expect(typeof correlationId).toBe('string');
56
+ expect(correlationId.length).toBeGreaterThan(0);
57
+ // Deliver the reply.
58
+ deliverPush('asyar:event:state:rpc-reply:push', {
59
+ correlationId,
60
+ result: { ok: true },
61
+ });
62
+ expect(yield promise).toEqual({ ok: true });
63
+ }));
64
+ it('request rejects when the reply carries an error', () => __awaiter(void 0, void 0, void 0, function* () {
65
+ invokeSpy.mockResolvedValue(undefined);
66
+ const rpc = new ExtensionRpc();
67
+ rpc.installViewMessageListener();
68
+ const promise = rpc.request('start', {});
69
+ yield Promise.resolve();
70
+ const correlationId = invokeSpy.mock.calls[0][1].correlationId;
71
+ deliverPush('asyar:event:state:rpc-reply:push', {
72
+ correlationId,
73
+ error: 'handler threw',
74
+ });
75
+ yield expect(promise).rejects.toThrow(/handler threw/);
76
+ }));
77
+ // ── timeout & abort ────────────────────────────────────────────────────
78
+ it('request rejects after default 5000ms timeout', () => __awaiter(void 0, void 0, void 0, function* () {
79
+ invokeSpy.mockResolvedValue(undefined);
80
+ const rpc = new ExtensionRpc();
81
+ rpc.installViewMessageListener();
82
+ const promise = rpc.request('slow', {});
83
+ yield Promise.resolve();
84
+ vi.advanceTimersByTime(4999);
85
+ // Still pending.
86
+ let settled = false;
87
+ promise.catch(() => {
88
+ settled = true;
89
+ });
90
+ yield Promise.resolve();
91
+ expect(settled).toBe(false);
92
+ vi.advanceTimersByTime(2);
93
+ yield expect(promise).rejects.toThrow(/timeout/i);
94
+ }));
95
+ it('request honours per-call timeoutMs override', () => __awaiter(void 0, void 0, void 0, function* () {
96
+ invokeSpy.mockResolvedValue(undefined);
97
+ const rpc = new ExtensionRpc();
98
+ rpc.installViewMessageListener();
99
+ const promise = rpc.request('slow', {}, { timeoutMs: 100 });
100
+ yield Promise.resolve();
101
+ vi.advanceTimersByTime(101);
102
+ yield expect(promise).rejects.toThrow(/timeout/i);
103
+ }));
104
+ it('on timeout, fires state:rpcAbort to the worker so the in-flight handler can bail', () => __awaiter(void 0, void 0, void 0, function* () {
105
+ invokeSpy.mockResolvedValue(undefined);
106
+ const rpc = new ExtensionRpc();
107
+ rpc.installViewMessageListener();
108
+ const promise = rpc.request('slow', {}, { timeoutMs: 50 });
109
+ yield Promise.resolve();
110
+ const corrId = invokeSpy.mock.calls[0][1].correlationId;
111
+ invokeSpy.mockClear();
112
+ vi.advanceTimersByTime(60);
113
+ yield promise.catch(() => { });
114
+ const abortCall = invokeSpy.mock.calls.find((c) => c[0] === 'state:rpcAbort');
115
+ expect(abortCall).toBeDefined();
116
+ expect(abortCall[1]).toEqual({ correlationId: corrId });
117
+ }));
118
+ it('stale reply arriving after timeout is silently dropped (no double settle)', () => __awaiter(void 0, void 0, void 0, function* () {
119
+ invokeSpy.mockResolvedValue(undefined);
120
+ const rpc = new ExtensionRpc();
121
+ rpc.installViewMessageListener();
122
+ const promise = rpc.request('slow', {}, { timeoutMs: 10 });
123
+ yield Promise.resolve();
124
+ const corrId = invokeSpy.mock.calls[0][1].correlationId;
125
+ vi.advanceTimersByTime(20);
126
+ yield expect(promise).rejects.toThrow(/timeout/i);
127
+ // Stale reply arrives: must not throw, must not warn loudly.
128
+ expect(() => deliverPush('asyar:event:state:rpc-reply:push', {
129
+ correlationId: corrId,
130
+ result: { tooLate: true },
131
+ })).not.toThrow();
132
+ }));
133
+ it('pagehide clears pending-reply entries silently', () => __awaiter(void 0, void 0, void 0, function* () {
134
+ invokeSpy.mockResolvedValue(undefined);
135
+ const rpc = new ExtensionRpc();
136
+ rpc.installViewMessageListener();
137
+ const promise = rpc.request('slow', {}, { timeoutMs: 60000 });
138
+ yield Promise.resolve();
139
+ rpc.disposeAllPending();
140
+ // pagehide cleanup leaves the promise pending until next mount; the
141
+ // contract is "no zombie state survives". We assert by attempting to
142
+ // settle with a stale reply and observing nothing fires.
143
+ deliverPush('asyar:event:state:rpc-reply:push', {
144
+ correlationId: invokeSpy.mock.calls[0][1].correlationId,
145
+ result: 'should be dropped',
146
+ });
147
+ let resolved = undefined;
148
+ promise.then((r) => (resolved = r)).catch(() => { });
149
+ yield Promise.resolve();
150
+ expect(resolved).toBeUndefined();
151
+ }));
152
+ // ── worker-side: onRequest dispatches matching id with abort signal ────
153
+ it('onRequest registers a handler that fires when matching __rpc__:request arrives', () => __awaiter(void 0, void 0, void 0, function* () {
154
+ const rpc = new ExtensionRpc();
155
+ rpc.installWorkerMessageListener();
156
+ const handler = vi.fn().mockResolvedValue({ done: true });
157
+ rpc.onRequest('start', handler);
158
+ invokeSpy.mockResolvedValue(undefined);
159
+ rpc.deliverActionPayload({
160
+ __rpc__: 'request',
161
+ id: 'start',
162
+ correlationId: 'c1',
163
+ payload: { x: 1 },
164
+ });
165
+ yield Promise.resolve();
166
+ yield Promise.resolve();
167
+ expect(handler).toHaveBeenCalledTimes(1);
168
+ const [callPayload, signal] = handler.mock.calls[0];
169
+ expect(callPayload).toEqual({ x: 1 });
170
+ expect(signal).toBeInstanceOf(AbortSignal);
171
+ expect(signal.aborted).toBe(false);
172
+ }));
173
+ it('worker-side handler reply is sent via state:rpcReply', () => __awaiter(void 0, void 0, void 0, function* () {
174
+ const rpc = new ExtensionRpc();
175
+ rpc.installWorkerMessageListener();
176
+ rpc.onRequest('start', () => __awaiter(void 0, void 0, void 0, function* () { return ({ done: true }); }));
177
+ invokeSpy.mockResolvedValue(undefined);
178
+ rpc.deliverActionPayload({
179
+ __rpc__: 'request',
180
+ id: 'start',
181
+ correlationId: 'c1',
182
+ payload: {},
183
+ });
184
+ // Wait for the async handler to resolve and the reply to be sent.
185
+ yield Promise.resolve();
186
+ yield Promise.resolve();
187
+ yield Promise.resolve();
188
+ const reply = invokeSpy.mock.calls.find((c) => c[0] === 'state:rpcReply');
189
+ expect(reply).toBeDefined();
190
+ expect(reply[1]).toEqual({
191
+ correlationId: 'c1',
192
+ result: { done: true },
193
+ });
194
+ }));
195
+ it('worker-side handler error is forwarded as { error } in state:rpcReply', () => __awaiter(void 0, void 0, void 0, function* () {
196
+ const rpc = new ExtensionRpc();
197
+ rpc.installWorkerMessageListener();
198
+ rpc.onRequest('start', () => __awaiter(void 0, void 0, void 0, function* () {
199
+ throw new Error('boom');
200
+ }));
201
+ invokeSpy.mockResolvedValue(undefined);
202
+ rpc.deliverActionPayload({
203
+ __rpc__: 'request',
204
+ id: 'start',
205
+ correlationId: 'c1',
206
+ payload: {},
207
+ });
208
+ yield Promise.resolve();
209
+ yield Promise.resolve();
210
+ yield Promise.resolve();
211
+ const reply = invokeSpy.mock.calls.find((c) => c[0] === 'state:rpcReply');
212
+ expect(reply).toBeDefined();
213
+ expect(reply[1].error).toMatch(/boom/);
214
+ }));
215
+ it('__rpc__:abort fires the AbortSignal on the in-flight handler', () => __awaiter(void 0, void 0, void 0, function* () {
216
+ const rpc = new ExtensionRpc();
217
+ rpc.installWorkerMessageListener();
218
+ let capturedSignal;
219
+ rpc.onRequest('slow', (_payload, signal) => new Promise(() => {
220
+ capturedSignal = signal;
221
+ }));
222
+ invokeSpy.mockResolvedValue(undefined);
223
+ rpc.deliverActionPayload({
224
+ __rpc__: 'request',
225
+ id: 'slow',
226
+ correlationId: 'c1',
227
+ payload: {},
228
+ });
229
+ yield Promise.resolve();
230
+ expect(capturedSignal).toBeDefined();
231
+ expect(capturedSignal.aborted).toBe(false);
232
+ rpc.deliverActionPayload({
233
+ __rpc__: 'abort',
234
+ correlationId: 'c1',
235
+ });
236
+ expect(capturedSignal.aborted).toBe(true);
237
+ }));
238
+ it('worker-side: __rpc__:request for an unregistered id returns an error reply', () => __awaiter(void 0, void 0, void 0, function* () {
239
+ const rpc = new ExtensionRpc();
240
+ rpc.installWorkerMessageListener();
241
+ invokeSpy.mockResolvedValue(undefined);
242
+ rpc.deliverActionPayload({
243
+ __rpc__: 'request',
244
+ id: 'unregistered',
245
+ correlationId: 'c1',
246
+ payload: {},
247
+ });
248
+ yield Promise.resolve();
249
+ yield Promise.resolve();
250
+ const reply = invokeSpy.mock.calls.find((c) => c[0] === 'state:rpcReply');
251
+ expect(reply).toBeDefined();
252
+ expect(reply[1].error).toMatch(/unregistered|no handler/i);
253
+ }));
254
+ // ── singleton ──────────────────────────────────────────────────────────
255
+ it('exports a module-singleton instance', () => {
256
+ expect(extensionRpc).toBeInstanceOf(ExtensionRpc);
257
+ });
258
+ });
259
+ //# sourceMappingURL=ExtensionRpc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRpc.test.js","sourceRoot":"","sources":["../../src/services/ExtensionRpc.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { BaseServiceProxy } from './BaseServiceProxy';
2
+ /**
3
+ * SDK proxy for the launcher-brokered extension state store.
4
+ *
5
+ * Worker-side: `get`, `set`, `subscribe`, `unsubscribe`.
6
+ * View-side: `get`, `subscribe`, `unsubscribe` (no `set` — writes are
7
+ * worker-owned by convention, enforced at the role-scoped
8
+ * entry-point projection in `asyar-sdk/view` which omits `set`
9
+ * from the exposed surface).
10
+ *
11
+ * Per-extension scoping is enforced by the launcher's `ExtensionIpcRouter`,
12
+ * which auto-injects the calling extension's id from the iframe's verified
13
+ * origin (see `INJECTS_EXTENSION_ID`). The SDK proxy never passes an
14
+ * extensionId; the host rejects any attempt to cross extension boundaries
15
+ * without this proxy needing to know the id.
16
+ */
17
+ type StateHandler = (value: unknown) => void;
18
+ export declare class ExtensionStateProxy extends BaseServiceProxy {
19
+ private pushListenerInstalled;
20
+ private readonly subs;
21
+ private pagehideInstalled;
22
+ get(key: string): Promise<unknown>;
23
+ set(key: string, value: unknown): Promise<void>;
24
+ /**
25
+ * Register a subscriber for `(this-extension, key)` in the current role.
26
+ * Returns a disposer that issues `state:unsubscribe` when called. The
27
+ * disposer is idempotent — calling it twice is harmless.
28
+ */
29
+ subscribe(key: string, handler: StateHandler): Promise<() => Promise<void>>;
30
+ /**
31
+ * Install a one-shot `pagehide` listener on `window` that fires
32
+ * `state:unsubscribe` for every active subscription. Called by the
33
+ * view-side entry-point factory; worker-side projections skip this
34
+ * because the worker iframe only unmounts on disable/uninstall and the
35
+ * launcher's uninstall path calls `state:clear` which drops every
36
+ * subscription server-side anyway.
37
+ */
38
+ installViewAutoUnsubscribe(): void;
39
+ private ensurePushListener;
40
+ private resolveRole;
41
+ }
42
+ export declare const extensionStateProxy: ExtensionStateProxy;
43
+ export {};
44
+ //# sourceMappingURL=ExtensionStateProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionStateProxy.d.ts","sourceRoot":"","sources":["../../src/services/ExtensionStateProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AAEH,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAU7C,qBAAa,mBAAoB,SAAQ,gBAAgB;IACvD,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;IAC9D,OAAO,CAAC,iBAAiB,CAAS;IAE5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAoBjF;;;;;;;OAOG;IACH,0BAA0B,IAAI,IAAI;IAgBlC,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,WAAW;CAUpB;AAED,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}