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.
- package/README.md +95 -42
- package/dist/ExtensionBridge.d.ts +1 -1
- package/dist/ExtensionBridge.d.ts.map +1 -1
- package/dist/ExtensionBridge.js +17 -13
- package/dist/ExtensionBridge.js.map +1 -1
- package/dist/ExtensionBridge.test.js +76 -101
- package/dist/ExtensionBridge.test.js.map +1 -1
- package/dist/ExtensionContext.d.ts +22 -57
- package/dist/ExtensionContext.d.ts.map +1 -1
- package/dist/ExtensionContext.js +84 -207
- package/dist/ExtensionContext.js.map +1 -1
- package/dist/ExtensionContext.test.js +91 -66
- package/dist/ExtensionContext.test.js.map +1 -1
- package/dist/ExtensionContextCore.d.ts +46 -0
- package/dist/ExtensionContextCore.d.ts.map +1 -0
- package/dist/ExtensionContextCore.js +149 -0
- package/dist/ExtensionContextCore.js.map +1 -0
- package/dist/PreferencesFacade.js +4 -9
- package/dist/PreferencesFacade.js.map +1 -1
- package/dist/PreferencesFacade.test.js +53 -55
- package/dist/PreferencesFacade.test.js.map +1 -1
- package/dist/cli/commands/attach.js +1 -1
- package/dist/cli/commands/attach.js.map +1 -1
- package/dist/cli/commands/build.d.ts +5 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +43 -5
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/lib/manifest.d.ts +17 -5
- package/dist/cli/lib/manifest.d.ts.map +1 -1
- package/dist/cli/lib/manifest.js +125 -66
- package/dist/cli/lib/manifest.js.map +1 -1
- package/dist/{index.d.ts → contracts.d.ts} +23 -1
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +36 -0
- package/dist/contracts.js.map +1 -0
- package/dist/contracts.purity.test.d.ts +2 -0
- package/dist/contracts.purity.test.d.ts.map +1 -0
- package/dist/contracts.purity.test.js +42 -0
- package/dist/contracts.purity.test.js.map +1 -0
- package/dist/icons/AsyarIconElement.js +4 -9
- package/dist/icons/AsyarIconElement.js.map +1 -1
- package/dist/icons/AsyarIconElement.test.js +14 -16
- package/dist/icons/AsyarIconElement.test.js.map +1 -1
- package/dist/icons/IconRenderer.js +9 -15
- package/dist/icons/IconRenderer.js.map +1 -1
- package/dist/icons/IconRenderer.test.js +63 -65
- package/dist/icons/IconRenderer.test.js.map +1 -1
- package/dist/icons/iconData.js +2 -5
- package/dist/icons/iconData.js.map +1 -1
- package/dist/icons/index.js +3 -14
- package/dist/icons/index.js.map +1 -1
- package/dist/ipc/MessageBroker.d.ts.map +1 -1
- package/dist/ipc/MessageBroker.js +33 -6
- package/dist/ipc/MessageBroker.js.map +1 -1
- package/dist/ipc/MessageBroker.test.js +26 -28
- package/dist/ipc/MessageBroker.test.js.map +1 -1
- package/dist/ipc/devInspectorBridge.d.ts +57 -0
- package/dist/ipc/devInspectorBridge.d.ts.map +1 -0
- package/dist/ipc/devInspectorBridge.js +70 -0
- package/dist/ipc/devInspectorBridge.js.map +1 -0
- package/dist/ipc/devInspectorBridge.test.d.ts +2 -0
- package/dist/ipc/devInspectorBridge.test.d.ts.map +1 -0
- package/dist/ipc/devInspectorBridge.test.js +128 -0
- package/dist/ipc/devInspectorBridge.test.js.map +1 -0
- package/dist/ipc/namespaces.d.ts +1 -1
- package/dist/ipc/namespaces.d.ts.map +1 -1
- package/dist/ipc/namespaces.js +4 -7
- package/dist/ipc/namespaces.js.map +1 -1
- package/dist/ipc/namespaces.test.js +11 -13
- package/dist/ipc/namespaces.test.js.map +1 -1
- package/dist/lib/focusTracker.js +1 -4
- package/dist/lib/focusTracker.js.map +1 -1
- package/dist/lib/focusTracker.test.js +32 -57
- package/dist/lib/focusTracker.test.js.map +1 -1
- package/dist/lib/syncProviderBridge.js +1 -4
- package/dist/lib/syncProviderBridge.js.map +1 -1
- package/dist/lib/syncProviderBridge.test.js +60 -85
- package/dist/lib/syncProviderBridge.test.js.map +1 -1
- package/dist/lib/themeInjector.js +3 -8
- package/dist/lib/themeInjector.js.map +1 -1
- package/dist/lib/themeInjector.test.js +42 -44
- package/dist/lib/themeInjector.test.js.map +1 -1
- package/dist/search/SearchEngine.js +3 -10
- package/dist/search/SearchEngine.js.map +1 -1
- package/dist/search/SearchEngine.test.js +53 -55
- package/dist/search/SearchEngine.test.js.map +1 -1
- package/dist/search/index.js +2 -8
- package/dist/search/index.js.map +1 -1
- package/dist/search/textUtils.js +2 -6
- package/dist/search/textUtils.js.map +1 -1
- package/dist/search/textUtils.test.js +73 -75
- package/dist/search/textUtils.test.js.map +1 -1
- package/dist/search/types.js +1 -2
- package/dist/services/AIServiceProxy.js +2 -6
- package/dist/services/AIServiceProxy.js.map +1 -1
- package/dist/services/AIServiceProxy.test.js +69 -71
- package/dist/services/AIServiceProxy.test.js.map +1 -1
- package/dist/services/ActionServiceProxy.d.ts.map +1 -1
- package/dist/services/ActionServiceProxy.js +14 -13
- package/dist/services/ActionServiceProxy.js.map +1 -1
- package/dist/services/ActionServiceProxy.test.js +28 -23
- package/dist/services/ActionServiceProxy.test.js.map +1 -1
- package/dist/services/ApplicationService.js +2 -6
- package/dist/services/ApplicationService.js.map +1 -1
- package/dist/services/ApplicationService.test.js +108 -110
- package/dist/services/ApplicationService.test.js.map +1 -1
- package/dist/services/BaseServiceProxy.js +3 -7
- package/dist/services/BaseServiceProxy.js.map +1 -1
- package/dist/services/CacheServiceProxy.js +2 -6
- package/dist/services/CacheServiceProxy.js.map +1 -1
- package/dist/services/CacheServiceProxy.test.js +21 -23
- package/dist/services/CacheServiceProxy.test.js.map +1 -1
- package/dist/services/ClipboardHistoryServiceProxy.js +6 -10
- package/dist/services/ClipboardHistoryServiceProxy.js.map +1 -1
- package/dist/services/ClipboardHistoryServiceProxy.test.js +106 -108
- package/dist/services/ClipboardHistoryServiceProxy.test.js.map +1 -1
- package/dist/services/CommandServiceProxy.js +7 -11
- package/dist/services/CommandServiceProxy.js.map +1 -1
- package/dist/services/CommandServiceProxy.test.js +37 -39
- package/dist/services/CommandServiceProxy.test.js.map +1 -1
- package/dist/services/EntitlementServiceProxy.js +2 -6
- package/dist/services/EntitlementServiceProxy.js.map +1 -1
- package/dist/services/EntitlementServiceProxy.test.js +16 -18
- package/dist/services/EntitlementServiceProxy.test.js.map +1 -1
- package/dist/services/ExtensionManagerProxy.js +2 -6
- package/dist/services/ExtensionManagerProxy.js.map +1 -1
- package/dist/services/ExtensionManagerProxy.test.js +42 -44
- package/dist/services/ExtensionManagerProxy.test.js.map +1 -1
- package/dist/services/ExtensionRpc.d.ts +90 -0
- package/dist/services/ExtensionRpc.d.ts.map +1 -0
- package/dist/services/ExtensionRpc.js +277 -0
- package/dist/services/ExtensionRpc.js.map +1 -0
- package/dist/services/ExtensionRpc.test.d.ts +2 -0
- package/dist/services/ExtensionRpc.test.d.ts.map +1 -0
- package/dist/services/ExtensionRpc.test.js +259 -0
- package/dist/services/ExtensionRpc.test.js.map +1 -0
- package/dist/services/ExtensionStateProxy.d.ts +44 -0
- package/dist/services/ExtensionStateProxy.d.ts.map +1 -0
- package/dist/services/ExtensionStateProxy.js +115 -0
- package/dist/services/ExtensionStateProxy.js.map +1 -0
- package/dist/services/ExtensionStateProxy.test.d.ts +2 -0
- package/dist/services/ExtensionStateProxy.test.d.ts.map +1 -0
- package/dist/services/ExtensionStateProxy.test.js +158 -0
- package/dist/services/ExtensionStateProxy.test.js.map +1 -0
- package/dist/services/FeedbackServiceProxy.js +2 -6
- package/dist/services/FeedbackServiceProxy.js.map +1 -1
- package/dist/services/FeedbackServiceProxy.test.js +31 -33
- package/dist/services/FeedbackServiceProxy.test.js.map +1 -1
- package/dist/services/FileManagerServiceProxy.js +2 -6
- package/dist/services/FileManagerServiceProxy.js.map +1 -1
- package/dist/services/FileManagerServiceProxy.test.js +21 -23
- package/dist/services/FileManagerServiceProxy.test.js.map +1 -1
- package/dist/services/FileSystemWatcherService.js +2 -6
- package/dist/services/FileSystemWatcherService.js.map +1 -1
- package/dist/services/FileSystemWatcherService.test.js +45 -47
- package/dist/services/FileSystemWatcherService.test.js.map +1 -1
- package/dist/services/IAIService.js +1 -2
- package/dist/services/ICacheService.js +1 -2
- package/dist/services/IClipboardHistoryService.js +1 -2
- package/dist/services/ICommandService.js +1 -2
- package/dist/services/IEntitlementService.js +1 -2
- package/dist/services/IExtensionManager.js +1 -2
- package/dist/services/IFeedbackService.js +1 -2
- package/dist/services/IFileManagerService.js +1 -2
- package/dist/services/IInteropService.js +1 -5
- package/dist/services/IInteropService.js.map +1 -1
- package/dist/services/INotificationService.js +1 -2
- package/dist/services/IOAuthService.js +1 -2
- package/dist/services/IPowerService.js +1 -2
- package/dist/services/IPreferencesService.js +1 -2
- package/dist/services/ISelectionService.js +1 -2
- package/dist/services/ISettingsService.js +1 -2
- package/dist/services/IShellService.js +1 -2
- package/dist/services/IStatusBarService.js +1 -2
- package/dist/services/IStorageService.js +1 -2
- package/dist/services/ISystemEventsService.js +1 -2
- package/dist/services/ISystemEventsService.js.map +1 -1
- package/dist/services/ITimerService.js +1 -2
- package/dist/services/InteropServiceProxy.js +2 -6
- package/dist/services/InteropServiceProxy.js.map +1 -1
- package/dist/services/InteropServiceProxy.test.js +19 -21
- package/dist/services/InteropServiceProxy.test.js.map +1 -1
- package/dist/services/LogService.js +1 -2
- package/dist/services/LogServiceProxy.js +2 -6
- package/dist/services/LogServiceProxy.js.map +1 -1
- package/dist/services/LogServiceProxy.test.js +43 -45
- package/dist/services/LogServiceProxy.test.js.map +1 -1
- package/dist/services/NetworkServiceProxy.js +2 -6
- package/dist/services/NetworkServiceProxy.js.map +1 -1
- package/dist/services/NetworkServiceProxy.test.js +20 -22
- package/dist/services/NetworkServiceProxy.test.js.map +1 -1
- package/dist/services/NotificationServiceProxy.js +2 -6
- package/dist/services/NotificationServiceProxy.js.map +1 -1
- package/dist/services/NotificationServiceProxy.test.js +39 -41
- package/dist/services/NotificationServiceProxy.test.js.map +1 -1
- package/dist/services/OAuthServiceProxy.js +2 -6
- package/dist/services/OAuthServiceProxy.js.map +1 -1
- package/dist/services/OAuthServiceProxy.test.js +42 -44
- package/dist/services/OAuthServiceProxy.test.js.map +1 -1
- package/dist/services/PowerServiceProxy.js +2 -6
- package/dist/services/PowerServiceProxy.js.map +1 -1
- package/dist/services/PowerServiceProxy.test.js +24 -26
- package/dist/services/PowerServiceProxy.test.js.map +1 -1
- package/dist/services/PreferencesServiceProxy.js +2 -6
- package/dist/services/PreferencesServiceProxy.js.map +1 -1
- package/dist/services/PreferencesServiceProxy.test.js +22 -24
- package/dist/services/PreferencesServiceProxy.test.js.map +1 -1
- package/dist/services/SelectionServiceProxy.js +2 -6
- package/dist/services/SelectionServiceProxy.js.map +1 -1
- package/dist/services/SelectionServiceProxy.test.js +20 -22
- package/dist/services/SelectionServiceProxy.test.js.map +1 -1
- package/dist/services/SettingsServiceProxy.js +2 -6
- package/dist/services/SettingsServiceProxy.js.map +1 -1
- package/dist/services/SettingsServiceProxy.test.js +18 -20
- package/dist/services/SettingsServiceProxy.test.js.map +1 -1
- package/dist/services/ShellServiceProxy.js +2 -6
- package/dist/services/ShellServiceProxy.js.map +1 -1
- package/dist/services/ShellServiceProxy.test.js +92 -94
- package/dist/services/ShellServiceProxy.test.js.map +1 -1
- package/dist/services/StatusBarServiceProxy.js +9 -13
- package/dist/services/StatusBarServiceProxy.js.map +1 -1
- package/dist/services/StatusBarServiceProxy.test.js +68 -70
- package/dist/services/StatusBarServiceProxy.test.js.map +1 -1
- package/dist/services/StorageServiceProxy.js +2 -6
- package/dist/services/StorageServiceProxy.js.map +1 -1
- package/dist/services/StorageServiceProxy.test.js +31 -33
- package/dist/services/StorageServiceProxy.test.js.map +1 -1
- package/dist/services/SystemEventsServiceProxy.js +2 -6
- package/dist/services/SystemEventsServiceProxy.js.map +1 -1
- package/dist/services/SystemEventsServiceProxy.test.js +50 -52
- package/dist/services/SystemEventsServiceProxy.test.js.map +1 -1
- package/dist/services/TimerServiceProxy.js +2 -6
- package/dist/services/TimerServiceProxy.js.map +1 -1
- package/dist/services/TimerServiceProxy.test.js +33 -35
- package/dist/services/TimerServiceProxy.test.js.map +1 -1
- package/dist/services/WindowManagementService.js +2 -6
- package/dist/services/WindowManagementService.js.map +1 -1
- package/dist/services/WindowManagementService.test.js +23 -25
- package/dist/services/WindowManagementService.test.js.map +1 -1
- package/dist/services/index.js +36 -76
- package/dist/services/index.js.map +1 -1
- package/dist/services/statusBarValidation.js +7 -14
- package/dist/services/statusBarValidation.js.map +1 -1
- package/dist/types/ActionType.js +3 -6
- package/dist/types/ActionType.js.map +1 -1
- package/dist/types/ApplicationType.js +1 -2
- package/dist/types/ClipboardType.js +2 -5
- package/dist/types/ClipboardType.js.map +1 -1
- package/dist/types/CommandType.js +1 -2
- package/dist/types/ExtensionType.d.ts +40 -5
- package/dist/types/ExtensionType.d.ts.map +1 -1
- package/dist/types/ExtensionType.js +1 -2
- package/dist/types/NetworkType.js +1 -2
- package/dist/types/NotificationType.js +1 -2
- package/dist/types/SyncType.js +1 -2
- package/dist/types/index.js +2 -18
- package/dist/types/index.js.map +1 -1
- package/dist/view.d.ts +12 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +19 -0
- package/dist/view.js.map +1 -0
- package/dist/view.test.d.ts +2 -0
- package/dist/view.test.d.ts.map +1 -0
- package/dist/view.test.js +114 -0
- package/dist/view.test.js.map +1 -0
- package/dist/worker.bundle-size.test.d.ts +2 -0
- package/dist/worker.bundle-size.test.d.ts.map +1 -0
- package/dist/worker.bundle-size.test.js +96 -0
- package/dist/worker.bundle-size.test.js.map +1 -0
- package/dist/worker.d.ts +37 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +122 -0
- package/dist/worker.js.map +1 -0
- package/dist/worker.test.d.ts +2 -0
- package/dist/worker.test.d.ts.map +1 -0
- package/dist/worker.test.js +136 -0
- package/dist/worker.test.js.map +1 -0
- package/package.json +12 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -47
- 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 @@
|
|
|
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"}
|