@monetize.software/sdk-extension 0.1.0-alpha.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 (65) hide show
  1. package/README.md +113 -0
  2. package/dist/chunks/chrome-port-BXHR4SOG.js +2014 -0
  3. package/dist/chunks/chrome-port-BXHR4SOG.js.map +1 -0
  4. package/dist/chunks/chrome-port-EtYqHf3p.js +2 -0
  5. package/dist/chunks/chrome-port-EtYqHf3p.js.map +1 -0
  6. package/dist/chunks/port-name-BPfQKtdb.js +5 -0
  7. package/dist/chunks/port-name-BPfQKtdb.js.map +1 -0
  8. package/dist/chunks/port-name-qwB109u9.js +2 -0
  9. package/dist/chunks/port-name-qwB109u9.js.map +1 -0
  10. package/dist/content/PaywallUI.d.ts +28 -0
  11. package/dist/content/PaywallUI.d.ts.map +1 -0
  12. package/dist/content/RemoteAuthClient.d.ts +91 -0
  13. package/dist/content/RemoteAuthClient.d.ts.map +1 -0
  14. package/dist/content/RemoteBillingClient.d.ts +126 -0
  15. package/dist/content/RemoteBillingClient.d.ts.map +1 -0
  16. package/dist/content/RemoteEventTracker.d.ts +9 -0
  17. package/dist/content/RemoteEventTracker.d.ts.map +1 -0
  18. package/dist/content/RemoteTrialStore.d.ts +13 -0
  19. package/dist/content/RemoteTrialStore.d.ts.map +1 -0
  20. package/dist/content/index.d.ts +11 -0
  21. package/dist/content/index.d.ts.map +1 -0
  22. package/dist/content/transport.d.ts +6 -0
  23. package/dist/content/transport.d.ts.map +1 -0
  24. package/dist/content.cjs +26 -0
  25. package/dist/content.cjs.map +1 -0
  26. package/dist/content.js +2723 -0
  27. package/dist/content.js.map +1 -0
  28. package/dist/offscreen/index.d.ts +21 -0
  29. package/dist/offscreen/index.d.ts.map +1 -0
  30. package/dist/offscreen/server.d.ts +26 -0
  31. package/dist/offscreen/server.d.ts.map +1 -0
  32. package/dist/offscreen.cjs +2 -0
  33. package/dist/offscreen.cjs.map +1 -0
  34. package/dist/offscreen.js +239 -0
  35. package/dist/offscreen.js.map +1 -0
  36. package/dist/shared/channel.d.ts +14 -0
  37. package/dist/shared/channel.d.ts.map +1 -0
  38. package/dist/shared/chrome-port.d.ts +8 -0
  39. package/dist/shared/chrome-port.d.ts.map +1 -0
  40. package/dist/shared/errors.d.ts +4 -0
  41. package/dist/shared/errors.d.ts.map +1 -0
  42. package/dist/shared/messages.d.ts +195 -0
  43. package/dist/shared/messages.d.ts.map +1 -0
  44. package/dist/shared/port-name.d.ts +2 -0
  45. package/dist/shared/port-name.d.ts.map +1 -0
  46. package/dist/shared/protocol.d.ts +59 -0
  47. package/dist/shared/protocol.d.ts.map +1 -0
  48. package/dist/shared/transport-client.d.ts +31 -0
  49. package/dist/shared/transport-client.d.ts.map +1 -0
  50. package/dist/shared/transport-server.d.ts +32 -0
  51. package/dist/shared/transport-server.d.ts.map +1 -0
  52. package/dist/sw/ensure-offscreen.d.ts +8 -0
  53. package/dist/sw/ensure-offscreen.d.ts.map +1 -0
  54. package/dist/sw/forwarder.d.ts +3 -0
  55. package/dist/sw/forwarder.d.ts.map +1 -0
  56. package/dist/sw/index.d.ts +4 -0
  57. package/dist/sw/index.d.ts.map +1 -0
  58. package/dist/sw/types.d.ts +19 -0
  59. package/dist/sw/types.d.ts.map +1 -0
  60. package/dist/sw.cjs +2 -0
  61. package/dist/sw.cjs.map +1 -0
  62. package/dist/sw.js +94 -0
  63. package/dist/sw.js.map +1 -0
  64. package/package.json +63 -0
  65. package/src/offscreen/offscreen.html +24 -0
@@ -0,0 +1,5 @@
1
+ const e = "@monetize.software/sdk-extension";
2
+ export {
3
+ e as P
4
+ };
5
+ //# sourceMappingURL=port-name-BPfQKtdb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-name-BPfQKtdb.js","sources":["../../src/shared/port-name.ts"],"sourcesContent":["// Имя port'а для chrome.runtime.connect. Отсеивает чужие подключения, чтобы\n// SW-forwarder и offscreen-server слушали только свои. Если host использует\n// runtime.connect для собственной логики — не будет ложных срабатываний.\nexport const PORT_NAME = '@monetize.software/sdk-extension';\n"],"names":["PORT_NAME"],"mappings":"AAGO,MAAMA,IAAY;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e="@monetize.software/sdk-extension";exports.PORT_NAME=e;
2
+ //# sourceMappingURL=port-name-qwB109u9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-name-qwB109u9.js","sources":["../../src/shared/port-name.ts"],"sourcesContent":["// Имя port'а для chrome.runtime.connect. Отсеивает чужие подключения, чтобы\n// SW-forwarder и offscreen-server слушали только свои. Если host использует\n// runtime.connect для собственной логики — не будет ложных срабатываний.\nexport const PORT_NAME = '@monetize.software/sdk-extension';\n"],"names":["PORT_NAME"],"mappings":"aAGO,MAAMA,EAAY"}
@@ -0,0 +1,28 @@
1
+ import { PaywallUI as BasePaywallUI, PaywallUIOptions } from '../../../sdk/src/ui/PaywallUI';
2
+ /** Опции extension'овского PaywallUI. Убраны:
3
+ * - `client` — RemoteBillingClient создаётся автоматически
4
+ * - `storage` — storage живёт в offscreen'е, content его не видит
5
+ * - `apiKey` — server-SDK key, не имеет смысла в content-script'е
6
+ * - `fetch` — все сетевые запросы идут через offscreen
7
+ *
8
+ * `auth: true` подключит RemoteAuthClient. Передавать готовый AuthClient
9
+ * из @monetize.software/sdk сюда не имеет смысла (мы хотим именно offscreen'овский). */
10
+ export interface ExtensionPaywallUIOptions extends Omit<PaywallUIOptions, 'client' | 'storage' | 'apiKey' | 'fetch'> {
11
+ }
12
+ export declare class PaywallUI extends BasePaywallUI {
13
+ /** RemoteEventTracker (proxy в offscreen-EventTracker). Не путать с
14
+ * base-классовым `tracker` (там null — мы отключили внутренний). */
15
+ private remoteTracker;
16
+ private trackerUnsubs;
17
+ constructor(opts: ExtensionPaywallUIOptions);
18
+ /** Зеркало sdk/PaywallUI.initTracker'овских биндингов, но с RemoteEventTracker.
19
+ * Когда @monetize.software/sdk экспоузнет публичный hook для inject'а tracker'а,
20
+ * этот метод заменится на одну строку. */
21
+ private bindAnalytics;
22
+ /** Прокси через RemoteEventTracker. Hosts могут вызывать paywall.track
23
+ * для произвольных аналитических событий — летит в единственный
24
+ * offscreen-tracker наряду с auto-emit'ами PaywallUI. */
25
+ track(name: string, props?: Record<string, unknown>): void;
26
+ destroy(): void;
27
+ }
28
+ //# sourceMappingURL=PaywallUI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaywallUI.d.ts","sourceRoot":"","sources":["../../src/content/PaywallUI.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQtF;;;;;;;yFAOyF;AACzF,MAAM,WAAW,yBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAAG;AAE9E,qBAAa,SAAU,SAAQ,aAAa;IAC1C;yEACqE;IACrE,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,aAAa,CAAyB;gBAElC,IAAI,EAAE,yBAAyB;IAqD3C;;+CAE2C;IAC3C,OAAO,CAAC,aAAa;IAgDrB;;8DAE0D;IAC1D,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI1D,OAAO,IAAI,IAAI;CAMhB"}
@@ -0,0 +1,91 @@
1
+ import { AuthSession, AuthUser, OAuthProvider, OtpVerifyType, SignUpResult } from '../../../sdk/src/core/auth';
2
+ import { TransportClient } from '../shared/transport-client';
3
+ export type AuthChangeListener = (session: AuthSession | null) => void;
4
+ export interface RemoteAuthClientOptions {
5
+ paywallId: string;
6
+ apiOrigin?: string;
7
+ }
8
+ export declare class RemoteAuthClient {
9
+ private readonly transport;
10
+ readonly paywallId: string;
11
+ readonly apiOrigin: string | undefined;
12
+ private session;
13
+ private listeners;
14
+ private unsubBroadcast;
15
+ private hydrated;
16
+ constructor(transport: TransportClient, opts: RemoteAuthClientOptions);
17
+ /** Promise, который резолвится после первичной синхронизации session с
18
+ * offscreen'а. Аналог AuthClient.ready(). */
19
+ ready(): Promise<void>;
20
+ getCachedSession(): AuthSession | null;
21
+ getCachedUser(): AuthUser | null;
22
+ onAuthChange(cb: AuthChangeListener): () => void;
23
+ signInWithEmail(input: {
24
+ email: string;
25
+ password: string;
26
+ }): Promise<AuthSession>;
27
+ signUp(input: {
28
+ email: string;
29
+ password: string;
30
+ userMeta?: Record<string, string>;
31
+ }): Promise<SignUpResult>;
32
+ signOut(): Promise<void>;
33
+ refresh(): Promise<AuthSession | null>;
34
+ sendOtp(input: {
35
+ email: string;
36
+ createUser?: boolean;
37
+ userMeta?: Record<string, unknown>;
38
+ }): Promise<void>;
39
+ verifyOtp(input: {
40
+ email: string;
41
+ token: string;
42
+ type: OtpVerifyType;
43
+ }): Promise<AuthSession>;
44
+ resendConfirmation(input: {
45
+ email: string;
46
+ }): Promise<void>;
47
+ requestPasswordReset(input: {
48
+ email: string;
49
+ }): Promise<void>;
50
+ updatePassword(input: {
51
+ password: string;
52
+ }): Promise<void>;
53
+ revokeAllSessions(): Promise<void>;
54
+ /** Анонимный sign-in (Supabase user без email). Логика (idempotent-check +
55
+ * resume через сохранённый refresh_token + fresh signin) живёт в
56
+ * offscreen-AuthClient'е — content только проксирует. captchaToken и
57
+ * forceCaptcha — pass-through для forward-compat / switch-account flow. */
58
+ signInAnonymously(input?: {
59
+ captchaToken?: string;
60
+ userMeta?: Record<string, string>;
61
+ forceCaptcha?: boolean;
62
+ }): Promise<AuthSession>;
63
+ /** Текущий access token (lazy-refreshable в offscreen'е). content/popup
64
+ * использует для Bearer'а в внешние fetch'и — ApiGatewayClient в
65
+ * content-script'е, прямые запросы из demo-UI. null если разлогинен или
66
+ * offscreen'овский AuthClient не смог рефрешнуть. */
67
+ getAccessToken(): Promise<string | null>;
68
+ /** OAuth через web-вариант: window.open в content-script'е, provider
69
+ * redirect, callback page постит code в opener. Под капотом split на
70
+ * два request'а в offscreen — startOAuthFlow (дёргаем /init, получаем
71
+ * authorize_url) → открываем popup → waitForOAuthCode → exchange.
72
+ *
73
+ * PKCE verifier живёт ТОЛЬКО в offscreen'е (внутри AuthClient'а), через
74
+ * runtime-границу не идёт. Content получает только authorize_url и state.
75
+ *
76
+ * Popup-gesture: `window.open(authorize_url, ...)` идёт в том же synchronous
77
+ * flow'е, что startOAuthFlow ответ; user-gesture сохраняется потому что
78
+ * content-script unloaded не за этот tick (gesture сохраняется через все
79
+ * microtask'и одного call stack'а). Если в каком-то браузере gesture
80
+ * всё-таки теряется — host получит `popup_blocked` (тот же что в @monetize.software/sdk).
81
+ */
82
+ signInWithOAuth(input: {
83
+ provider: OAuthProvider;
84
+ scopes?: string;
85
+ userMeta?: Record<string, string>;
86
+ onPopupOpened?: () => void;
87
+ }): Promise<AuthSession>;
88
+ destroy(): void;
89
+ private applySession;
90
+ }
91
+ //# sourceMappingURL=RemoteAuthClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteAuthClient.d.ts","sourceRoot":"","sources":["../../src/content/RemoteAuthClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { Balance, CheckoutResult, Identity, PaywallBootstrap, PaywallPrice, PaywallPurchaseDetailed, PaywallUser, TrialConfig } from '../../../sdk/src/core/types';
2
+ import { StorageAdapter } from '../../../sdk/src/core/storage';
3
+ import { TrialStore } from '../../../sdk/src/core/trial';
4
+ import { TransportClient } from '../shared/transport-client';
5
+ export type UserListener = (user: PaywallUser) => void;
6
+ export type BalanceListener = (balances: Balance[]) => void;
7
+ export interface RemoteBillingClientOptions {
8
+ paywallId: string;
9
+ apiOrigin?: string;
10
+ }
11
+ export declare class RemoteBillingClient {
12
+ private readonly transport;
13
+ readonly paywallId: string;
14
+ readonly apiOrigin: string | undefined;
15
+ private cachedBootstrap;
16
+ private cachedUser;
17
+ private cachedBalances;
18
+ private identity;
19
+ /** Storage proxy через transport: get/set/remove идут в offscreen'овский
20
+ * StorageAdapter (single source of truth для всех вкладок). Trial-state
21
+ * PaywallUI пишет сюда — все табы видят один и тот же counter, не
22
+ * drift'ит между вкладками.
23
+ *
24
+ * Race-окно read-modify-write всё ещё существует (две вкладки одновременно
25
+ * читают N → пишут N-1, drift 1). Для exact atomicity нужен Phase 9:
26
+ * TrialStore целиком переехать в offscreen и делать recordBlock как
27
+ * single-handler с одной atomic-операцией. Это редкий edge case
28
+ * (одновременное открытие пейвола в нескольких вкладках в рамках мс). */
29
+ private remoteStorageAdapter;
30
+ private userListeners;
31
+ private balanceListeners;
32
+ private unsubUserBroadcast;
33
+ private unsubBalancesBroadcast;
34
+ constructor(transport: TransportClient, opts: RemoteBillingClientOptions);
35
+ bootstrap(opts?: {
36
+ force?: boolean;
37
+ signal?: AbortSignal;
38
+ }): Promise<PaywallBootstrap>;
39
+ getCachedBootstrap(): PaywallBootstrap | null;
40
+ /** Шорткат над `bootstrap()` — возвращает цены пейвола (locale-оверрайды
41
+ * уже применены в offscreen'е). Те же кэш-семантики, что у `bootstrap()`. */
42
+ getPrices(opts?: {
43
+ force?: boolean;
44
+ signal?: AbortSignal;
45
+ }): Promise<PaywallPrice[]>;
46
+ /** Sync-снимок цен из локального mirror'а bootstrap'а. null = ещё не грузили. */
47
+ getCachedPrices(): PaywallPrice[] | null;
48
+ getVisitorId(): Promise<string>;
49
+ getUser(opts?: {
50
+ force?: boolean;
51
+ signal?: AbortSignal;
52
+ }): Promise<PaywallUser>;
53
+ getCachedUser(): PaywallUser | null;
54
+ /** Подписка на user-state. Mirror'имся на broadcast'ы offscreen'а; initial
55
+ * snapshot отдаётся через microtask из локального cache (если есть) —
56
+ * ровно как в BillingClient.onUserChange. Возвращает функцию отписки. */
57
+ onUserChange(cb: UserListener, opts?: {
58
+ immediate?: 'microtask' | 'sync' | 'none';
59
+ }): () => void;
60
+ getBalances(opts?: {
61
+ force?: boolean;
62
+ signal?: AbortSignal;
63
+ }): Promise<Balance[]>;
64
+ getCachedBalances(): Balance[] | null;
65
+ onBalanceChange(cb: BalanceListener, opts?: {
66
+ immediate?: 'microtask' | 'sync' | 'none';
67
+ }): () => void;
68
+ createCheckout(params: {
69
+ priceId: string;
70
+ successUrl?: string;
71
+ errorUrl?: string;
72
+ shopUrl?: string;
73
+ trialDays?: number;
74
+ idempotencyKey?: string;
75
+ ignoreActivePurchase?: boolean;
76
+ signal?: AbortSignal;
77
+ }): Promise<CheckoutResult>;
78
+ /** Rich-shape список покупок юзера (с ценой, валютой, interval, discount,
79
+ * cancel-метаданными). Через offscreen — там настоящий BillingClient
80
+ * ходит на `/api/v1/paywall/[id]/user` с Bearer'ом. Полезно для
81
+ * customer-portal UI: cards + Cancel/Renew кнопки. */
82
+ listPurchases(opts?: {
83
+ signal?: AbortSignal;
84
+ }): Promise<PaywallPurchaseDetailed[]>;
85
+ /** Отменить подписку через бэк. По умолчанию cancel в конце текущего
86
+ * периода (юзер сохраняет access до renewal date'ы). reason обязательна
87
+ * (валидируется бэком) — собирается через select причин в host-UI. */
88
+ cancelSubscription(params: {
89
+ subscriptionId: string;
90
+ reason: string;
91
+ signal?: AbortSignal;
92
+ }): Promise<{
93
+ subscription: {
94
+ status: string | null;
95
+ canceled_at: string | null;
96
+ cancel_at: string | null;
97
+ cancel_at_period_end: boolean | null;
98
+ };
99
+ }>;
100
+ /** PaywallUI просит storage у billing-клиента для TrialStore и других
101
+ * consumer'ов. Возвращает proxy: get/set/remove идут через transport
102
+ * в offscreen'овский storage = single source of truth для всех вкладок. */
103
+ getStorage(): StorageAdapter;
104
+ /** Factory-метод для PaywallUI: вместо локального createTrialStore'а на
105
+ * storage-proxy, возвращаем RemoteTrialStore — он шлёт каждую операцию
106
+ * одним атомарным RPC в offscreen, где navigator.locks сериализуют
107
+ * read-modify-write. PaywallUI duck-types этот метод и предпочитает его
108
+ * локальной фабрике, если он есть. */
109
+ createTrialStore(config: TrialConfig): TrialStore;
110
+ getIdentity(): Identity | null;
111
+ setIdentity(identity: Identity | null): Promise<void>;
112
+ /** Подгрузить identity с offscreen'а. Используется при первом подключении
113
+ * content-script'а — если другая вкладка уже залогинила юзера, текущая
114
+ * тут же подхватит identity без ожидания authChange. */
115
+ syncIdentity(): Promise<Identity | null>;
116
+ destroy(): void;
117
+ /** Обновить mirror user'а и эмитнуть listener'ам если он реально изменился.
118
+ * Используется и для self-инициированных RPC (bootstrap/getUser), и для
119
+ * broadcast'ов от offscreen — чтобы host'овский onUserChange handler
120
+ * получил signal независимо от того, кто триггернул обновление. */
121
+ private applyUser;
122
+ private applyBalances;
123
+ private fireUserListeners;
124
+ private fireBalanceListeners;
125
+ }
126
+ //# sourceMappingURL=RemoteBillingClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteBillingClient.d.ts","sourceRoot":"","sources":["../../src/content/RemoteBillingClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { TransportClient } from '../shared/transport-client';
2
+ export declare class RemoteEventTracker {
3
+ private readonly transport;
4
+ constructor(transport: TransportClient);
5
+ /** Отправить событие. Fire-and-forget — не возвращает Promise, не throw'ает.
6
+ * Сетевые/транспортные ошибки логируются в console и не блокируют caller. */
7
+ track(name: string, props?: Record<string, unknown>): void;
8
+ }
9
+ //# sourceMappingURL=RemoteEventTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteEventTracker.d.ts","sourceRoot":"","sources":["../../src/content/RemoteEventTracker.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,eAAe;IAEvD;kFAC8E;IAC9E,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAM3D"}
@@ -0,0 +1,13 @@
1
+ import { TrialStore } from '../../../sdk/src/core/trial';
2
+ import { TrialConfig, TrialStatus } from '../../../sdk/src/core/types';
3
+ import { TransportClient } from '../shared/transport-client';
4
+ export declare class RemoteTrialStore implements TrialStore {
5
+ private readonly transport;
6
+ private readonly paywallId;
7
+ private readonly config;
8
+ constructor(transport: TransportClient, paywallId: string, config: TrialConfig);
9
+ check(): Promise<TrialStatus>;
10
+ recordBlock(): Promise<TrialStatus>;
11
+ reset(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=RemoteTrialStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteTrialStore.d.ts","sourceRoot":"","sources":["../../src/content/RemoteTrialStore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,qBAAa,gBAAiB,YAAW,UAAU;IAE/C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW;IAGhC,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAO7B,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAOnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,11 @@
1
+ export { PaywallUI } from './PaywallUI';
2
+ export type { ExtensionPaywallUIOptions } from './PaywallUI';
3
+ export { RemoteBillingClient } from './RemoteBillingClient';
4
+ export type { RemoteBillingClientOptions } from './RemoteBillingClient';
5
+ export { RemoteAuthClient } from './RemoteAuthClient';
6
+ export type { RemoteAuthClientOptions, AuthChangeListener } from './RemoteAuthClient';
7
+ export { RemoteEventTracker } from './RemoteEventTracker';
8
+ export { getContentTransport } from './transport';
9
+ export { PROTOCOL_VERSION } from '../shared/protocol';
10
+ export type { RequestKind, EventKind } from '../shared/protocol';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { TransportClient } from '../shared/transport-client';
2
+ export declare function getContentTransport(): TransportClient;
3
+ /** Тестовая инжекция — для unit-тестов RemoteBillingClient'а с фейковым
4
+ * каналом (без chrome.runtime). В проде не используется. */
5
+ export declare function _setContentTransportForTests(client: TransportClient | null): void;
6
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/content/transport.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAM7D,wBAAgB,mBAAmB,IAAI,eAAe,CAIrD;AAED;6DAC6D;AAC7D,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,CAEjF"}