@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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/cli/polly.ts +564 -0
  4. package/dist/background/api-client.d.ts +7 -0
  5. package/dist/background/context-menu.d.ts +7 -0
  6. package/dist/background/index.d.ts +31 -0
  7. package/dist/background/index.js +1309 -0
  8. package/dist/background/index.js.map +25 -0
  9. package/dist/background/log-store.d.ts +22 -0
  10. package/dist/background/message-router.d.ts +30 -0
  11. package/dist/background/message-router.js +1300 -0
  12. package/dist/background/message-router.js.map +24 -0
  13. package/dist/background/offscreen-manager.d.ts +10 -0
  14. package/dist/index.d.ts +18 -0
  15. package/dist/index.js +1471 -0
  16. package/dist/index.js.map +27 -0
  17. package/dist/shared/adapters/chrome/context-menus.chrome.d.ts +8 -0
  18. package/dist/shared/adapters/chrome/offscreen.chrome.d.ts +6 -0
  19. package/dist/shared/adapters/chrome/runtime.chrome.d.ts +13 -0
  20. package/dist/shared/adapters/chrome/storage.chrome.d.ts +8 -0
  21. package/dist/shared/adapters/chrome/tabs.chrome.d.ts +16 -0
  22. package/dist/shared/adapters/chrome/window.chrome.d.ts +6 -0
  23. package/dist/shared/adapters/context-menus.adapter.d.ts +22 -0
  24. package/dist/shared/adapters/fetch.adapter.d.ts +6 -0
  25. package/dist/shared/adapters/index.d.ts +34 -0
  26. package/dist/shared/adapters/index.js +298 -0
  27. package/dist/shared/adapters/index.js.map +18 -0
  28. package/dist/shared/adapters/logger.adapter.d.ts +44 -0
  29. package/dist/shared/adapters/offscreen.adapter.d.ts +20 -0
  30. package/dist/shared/adapters/runtime.adapter.d.ts +66 -0
  31. package/dist/shared/adapters/storage.adapter.d.ts +29 -0
  32. package/dist/shared/adapters/tabs.adapter.d.ts +39 -0
  33. package/dist/shared/adapters/window.adapter.d.ts +14 -0
  34. package/dist/shared/lib/context-helpers.d.ts +64 -0
  35. package/dist/shared/lib/context-helpers.js +1086 -0
  36. package/dist/shared/lib/context-helpers.js.map +24 -0
  37. package/dist/shared/lib/context-specific-helpers.d.ts +160 -0
  38. package/dist/shared/lib/errors.d.ts +67 -0
  39. package/dist/shared/lib/errors.js +94 -0
  40. package/dist/shared/lib/errors.js.map +10 -0
  41. package/dist/shared/lib/handler-execution-tracker.d.ts +24 -0
  42. package/dist/shared/lib/message-bus.d.ts +233 -0
  43. package/dist/shared/lib/message-bus.js +1033 -0
  44. package/dist/shared/lib/message-bus.js.map +23 -0
  45. package/dist/shared/lib/state.d.ts +102 -0
  46. package/dist/shared/lib/state.js +1265 -0
  47. package/dist/shared/lib/state.js.map +24 -0
  48. package/dist/shared/lib/test-helpers.d.ts +133 -0
  49. package/dist/shared/lib/test-helpers.js +136 -0
  50. package/dist/shared/lib/test-helpers.js.map +10 -0
  51. package/dist/shared/state/app-state.d.ts +8 -0
  52. package/dist/shared/state/app-state.js +1272 -0
  53. package/dist/shared/state/app-state.js.map +25 -0
  54. package/dist/shared/types/messages.d.ts +341 -0
  55. package/dist/shared/types/messages.js +25 -0
  56. package/dist/shared/types/messages.js.map +10 -0
  57. 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 {};