@fairfox/polly 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/cli/polly.ts +564 -0
- package/dist/background/api-client.d.ts +7 -0
- package/dist/background/context-menu.d.ts +7 -0
- package/dist/background/index.d.ts +31 -0
- package/dist/background/index.js +1309 -0
- package/dist/background/index.js.map +25 -0
- package/dist/background/log-store.d.ts +22 -0
- package/dist/background/message-router.d.ts +30 -0
- package/dist/background/message-router.js +1300 -0
- package/dist/background/message-router.js.map +24 -0
- package/dist/background/offscreen-manager.d.ts +10 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1471 -0
- package/dist/index.js.map +27 -0
- package/dist/shared/adapters/chrome/context-menus.chrome.d.ts +8 -0
- package/dist/shared/adapters/chrome/offscreen.chrome.d.ts +6 -0
- package/dist/shared/adapters/chrome/runtime.chrome.d.ts +13 -0
- package/dist/shared/adapters/chrome/storage.chrome.d.ts +8 -0
- package/dist/shared/adapters/chrome/tabs.chrome.d.ts +16 -0
- package/dist/shared/adapters/chrome/window.chrome.d.ts +6 -0
- package/dist/shared/adapters/context-menus.adapter.d.ts +22 -0
- package/dist/shared/adapters/fetch.adapter.d.ts +6 -0
- package/dist/shared/adapters/index.d.ts +34 -0
- package/dist/shared/adapters/index.js +298 -0
- package/dist/shared/adapters/index.js.map +18 -0
- package/dist/shared/adapters/logger.adapter.d.ts +44 -0
- package/dist/shared/adapters/offscreen.adapter.d.ts +20 -0
- package/dist/shared/adapters/runtime.adapter.d.ts +66 -0
- package/dist/shared/adapters/storage.adapter.d.ts +29 -0
- package/dist/shared/adapters/tabs.adapter.d.ts +39 -0
- package/dist/shared/adapters/window.adapter.d.ts +14 -0
- package/dist/shared/lib/context-helpers.d.ts +64 -0
- package/dist/shared/lib/context-helpers.js +1086 -0
- package/dist/shared/lib/context-helpers.js.map +24 -0
- package/dist/shared/lib/context-specific-helpers.d.ts +160 -0
- package/dist/shared/lib/errors.d.ts +67 -0
- package/dist/shared/lib/errors.js +94 -0
- package/dist/shared/lib/errors.js.map +10 -0
- package/dist/shared/lib/handler-execution-tracker.d.ts +24 -0
- package/dist/shared/lib/message-bus.d.ts +233 -0
- package/dist/shared/lib/message-bus.js +1033 -0
- package/dist/shared/lib/message-bus.js.map +23 -0
- package/dist/shared/lib/state.d.ts +102 -0
- package/dist/shared/lib/state.js +1265 -0
- package/dist/shared/lib/state.js.map +24 -0
- package/dist/shared/lib/test-helpers.d.ts +133 -0
- package/dist/shared/lib/test-helpers.js +136 -0
- package/dist/shared/lib/test-helpers.js.map +10 -0
- package/dist/shared/state/app-state.d.ts +8 -0
- package/dist/shared/state/app-state.js +1272 -0
- package/dist/shared/state/app-state.js.map +25 -0
- package/dist/shared/types/messages.d.ts +341 -0
- package/dist/shared/types/messages.js +25 -0
- package/dist/shared/types/messages.js.map +10 -0
- package/package.json +110 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { ExtensionAdapters, MessageSender } from "../adapters";
|
|
2
|
+
import type { BaseMessage, Context, ExtensionMessage, MessageResponse, RoutedMessage, RoutedResponse } from "../types/messages";
|
|
3
|
+
import type { BackgroundHelpers, ContentScriptHelpers, DevToolsHelpers, OptionsHelpers, PopupHelpers, SidePanelHelpers } from "./context-specific-helpers";
|
|
4
|
+
export declare function isRoutedMessage<TMessage extends BaseMessage = BaseMessage>(value: unknown): value is RoutedMessage<TMessage>;
|
|
5
|
+
export declare function isRoutedResponse<TMessage extends BaseMessage = BaseMessage>(value: unknown): value is RoutedResponse<TMessage>;
|
|
6
|
+
type PendingRequest<TMessage extends BaseMessage = ExtensionMessage> = {
|
|
7
|
+
resolve: (value: MessageResponse<TMessage> | undefined) => void;
|
|
8
|
+
reject: (error: Error) => void;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
timeout: NodeJS.Timeout;
|
|
11
|
+
};
|
|
12
|
+
export declare class MessageBus<TMessage extends BaseMessage = ExtensionMessage> {
|
|
13
|
+
context: Context;
|
|
14
|
+
adapters: ExtensionAdapters;
|
|
15
|
+
helpers: ContentScriptHelpers | DevToolsHelpers | PopupHelpers | OptionsHelpers | SidePanelHelpers | BackgroundHelpers | Record<string, never>;
|
|
16
|
+
pendingRequests: Map<string, PendingRequest<TMessage>>;
|
|
17
|
+
private handlers;
|
|
18
|
+
private port;
|
|
19
|
+
private errorHandler;
|
|
20
|
+
private userErrorHandlers;
|
|
21
|
+
messageListener: ((message: unknown, sender: MessageSender, sendResponse: (response: unknown) => void) => boolean) | null;
|
|
22
|
+
constructor(context: Context, adapters?: ExtensionAdapters, options?: {
|
|
23
|
+
skipListenerSetup?: boolean;
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Send a message with type safety.
|
|
27
|
+
* Response type is inferred from message type, though TypeScript requires
|
|
28
|
+
* the return type to be widened due to Map storage limitations.
|
|
29
|
+
* Runtime type safety is ensured by handler registration and invocation.
|
|
30
|
+
*/
|
|
31
|
+
send<T extends TMessage>(payload: T, options?: {
|
|
32
|
+
target?: Context | Context[];
|
|
33
|
+
tabId?: number;
|
|
34
|
+
timeout?: number;
|
|
35
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
36
|
+
type: T extends {
|
|
37
|
+
type: infer TType;
|
|
38
|
+
} ? TType : never;
|
|
39
|
+
}>> | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Broadcast message to all contexts.
|
|
42
|
+
* Used for state synchronization.
|
|
43
|
+
*/
|
|
44
|
+
broadcast<T extends TMessage>(payload: T): void;
|
|
45
|
+
/**
|
|
46
|
+
* Register a typed message handler.
|
|
47
|
+
* Handler signature is enforced based on message type.
|
|
48
|
+
* Multiple handlers can be registered for the same message type.
|
|
49
|
+
*/
|
|
50
|
+
on<T extends TMessage["type"]>(type: T, handler: (payload: Extract<TMessage, {
|
|
51
|
+
type: T;
|
|
52
|
+
}>, message: RoutedMessage<Extract<TMessage, {
|
|
53
|
+
type: T;
|
|
54
|
+
}>>) => Promise<MessageResponse<Extract<TMessage, {
|
|
55
|
+
type: T;
|
|
56
|
+
}>>> | MessageResponse<Extract<TMessage, {
|
|
57
|
+
type: T;
|
|
58
|
+
}>>): void;
|
|
59
|
+
/**
|
|
60
|
+
* Register multiple message handlers at once.
|
|
61
|
+
* Reduces boilerplate when defining many handlers.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* bus.registerHandlers({
|
|
66
|
+
* 'MY_MESSAGE': async (payload) => ({ success: true }),
|
|
67
|
+
* 'ANOTHER_MESSAGE': async (payload) => ({ data: payload }),
|
|
68
|
+
* })
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
registerHandlers(handlers: Record<string, Function | undefined>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Register a global error handler.
|
|
74
|
+
* Called when errors occur during message handling.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* bus.onError((error, bus) => {
|
|
79
|
+
* console.error(`[${bus.context}] Error:`, error)
|
|
80
|
+
* // Report to error tracking service
|
|
81
|
+
* })
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
onError(handler: (error: Error, bus: MessageBus<TMessage>) => void): void;
|
|
85
|
+
/**
|
|
86
|
+
* Send message to background context.
|
|
87
|
+
* Explicit routing API for better DX.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const result = await bus.sendToBackground({ type: 'GET_SETTINGS' })
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
sendToBackground<T extends TMessage>(payload: T, options?: {
|
|
95
|
+
timeout?: number;
|
|
96
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
97
|
+
type: T extends {
|
|
98
|
+
type: infer TType;
|
|
99
|
+
} ? TType : never;
|
|
100
|
+
}>> | undefined>;
|
|
101
|
+
/**
|
|
102
|
+
* Send message to a specific content script.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const result = await bus.sendToContentScript(tabId, { type: 'ANALYZE_PAGE' })
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
sendToContentScript<T extends TMessage>(tabId: number, payload: T, options?: {
|
|
110
|
+
timeout?: number;
|
|
111
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
112
|
+
type: T extends {
|
|
113
|
+
type: infer TType;
|
|
114
|
+
} ? TType : never;
|
|
115
|
+
}>> | undefined>;
|
|
116
|
+
/**
|
|
117
|
+
* Send message to all tabs.
|
|
118
|
+
* Useful for broadcasting updates to all content scripts.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* await bus.sendToAllTabs({ type: 'REFRESH_UI' })
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
sendToAllTabs<T extends TMessage>(payload: T, options?: {
|
|
126
|
+
timeout?: number;
|
|
127
|
+
}): Promise<Array<MessageResponse<Extract<TMessage, {
|
|
128
|
+
type: T extends {
|
|
129
|
+
type: infer TType;
|
|
130
|
+
} ? TType : never;
|
|
131
|
+
}>> | undefined>>;
|
|
132
|
+
/**
|
|
133
|
+
* Send message to popup context.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* await bus.sendToPopup({ type: 'UPDATE_UI', data: newData })
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
sendToPopup<T extends TMessage>(payload: T, options?: {
|
|
141
|
+
timeout?: number;
|
|
142
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
143
|
+
type: T extends {
|
|
144
|
+
type: infer TType;
|
|
145
|
+
} ? TType : never;
|
|
146
|
+
}>> | undefined>;
|
|
147
|
+
/**
|
|
148
|
+
* Send message to options page.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* await bus.sendToOptions({ type: 'SETTINGS_UPDATED' })
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
sendToOptions<T extends TMessage>(payload: T, options?: {
|
|
156
|
+
timeout?: number;
|
|
157
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
158
|
+
type: T extends {
|
|
159
|
+
type: infer TType;
|
|
160
|
+
} ? TType : never;
|
|
161
|
+
}>> | undefined>;
|
|
162
|
+
/**
|
|
163
|
+
* Send message to devtools panel.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* await bus.sendToDevTools({ type: 'INSPECTION_DATA', data: pageData })
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
sendToDevTools<T extends TMessage>(payload: T, options?: {
|
|
171
|
+
timeout?: number;
|
|
172
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
173
|
+
type: T extends {
|
|
174
|
+
type: infer TType;
|
|
175
|
+
} ? TType : never;
|
|
176
|
+
}>> | undefined>;
|
|
177
|
+
/**
|
|
178
|
+
* Send message to side panel.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* await bus.sendToSidePanel({ type: 'UPDATE_ACTIVITY_LOG' })
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
sendToSidePanel<T extends TMessage>(payload: T, options?: {
|
|
186
|
+
timeout?: number;
|
|
187
|
+
}): Promise<MessageResponse<Extract<TMessage, {
|
|
188
|
+
type: T extends {
|
|
189
|
+
type: infer TType;
|
|
190
|
+
} ? TType : never;
|
|
191
|
+
}>> | undefined>;
|
|
192
|
+
/**
|
|
193
|
+
* Connect with long-lived port.
|
|
194
|
+
* Used for persistent connections (DevTools, Content Scripts).
|
|
195
|
+
*/
|
|
196
|
+
connect(name: string): void;
|
|
197
|
+
/**
|
|
198
|
+
* Disconnect port if connected.
|
|
199
|
+
*/
|
|
200
|
+
disconnect(): void;
|
|
201
|
+
/**
|
|
202
|
+
* Remove all handlers and clean up.
|
|
203
|
+
*/
|
|
204
|
+
destroy(): void;
|
|
205
|
+
private setupListeners;
|
|
206
|
+
handleMessage(message: RoutedMessage<TMessage> | RoutedResponse<TMessage>, _sender?: unknown): Promise<unknown>;
|
|
207
|
+
sendMessage<T extends TMessage = TMessage>(message: RoutedMessage<T>): void;
|
|
208
|
+
private sendResponse;
|
|
209
|
+
private inferTarget;
|
|
210
|
+
/**
|
|
211
|
+
* Create context-specific helpers based on current context.
|
|
212
|
+
* @private
|
|
213
|
+
*/
|
|
214
|
+
private createContextHelpers;
|
|
215
|
+
/**
|
|
216
|
+
* Notify all registered error handlers.
|
|
217
|
+
* @private
|
|
218
|
+
*/
|
|
219
|
+
private notifyErrorHandlers;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Create a MessageBus for the given context.
|
|
223
|
+
*
|
|
224
|
+
* IMPORTANT: Only call this ONCE per context in your application.
|
|
225
|
+
* Calling it multiple times will create multiple message listeners, causing
|
|
226
|
+
* handlers to execute multiple times. Store the returned bus and reuse it.
|
|
227
|
+
*
|
|
228
|
+
* For background scripts, use createBackground() instead.
|
|
229
|
+
*/
|
|
230
|
+
export declare function getMessageBus<TMessage extends BaseMessage = ExtensionMessage>(context: Context, adapters?: ExtensionAdapters, options?: {
|
|
231
|
+
skipListenerSetup?: boolean;
|
|
232
|
+
}): MessageBus<TMessage>;
|
|
233
|
+
export {};
|