@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.
- package/README.md +113 -0
- package/dist/chunks/chrome-port-BXHR4SOG.js +2014 -0
- package/dist/chunks/chrome-port-BXHR4SOG.js.map +1 -0
- package/dist/chunks/chrome-port-EtYqHf3p.js +2 -0
- package/dist/chunks/chrome-port-EtYqHf3p.js.map +1 -0
- package/dist/chunks/port-name-BPfQKtdb.js +5 -0
- package/dist/chunks/port-name-BPfQKtdb.js.map +1 -0
- package/dist/chunks/port-name-qwB109u9.js +2 -0
- package/dist/chunks/port-name-qwB109u9.js.map +1 -0
- package/dist/content/PaywallUI.d.ts +28 -0
- package/dist/content/PaywallUI.d.ts.map +1 -0
- package/dist/content/RemoteAuthClient.d.ts +91 -0
- package/dist/content/RemoteAuthClient.d.ts.map +1 -0
- package/dist/content/RemoteBillingClient.d.ts +126 -0
- package/dist/content/RemoteBillingClient.d.ts.map +1 -0
- package/dist/content/RemoteEventTracker.d.ts +9 -0
- package/dist/content/RemoteEventTracker.d.ts.map +1 -0
- package/dist/content/RemoteTrialStore.d.ts +13 -0
- package/dist/content/RemoteTrialStore.d.ts.map +1 -0
- package/dist/content/index.d.ts +11 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/transport.d.ts +6 -0
- package/dist/content/transport.d.ts.map +1 -0
- package/dist/content.cjs +26 -0
- package/dist/content.cjs.map +1 -0
- package/dist/content.js +2723 -0
- package/dist/content.js.map +1 -0
- package/dist/offscreen/index.d.ts +21 -0
- package/dist/offscreen/index.d.ts.map +1 -0
- package/dist/offscreen/server.d.ts +26 -0
- package/dist/offscreen/server.d.ts.map +1 -0
- package/dist/offscreen.cjs +2 -0
- package/dist/offscreen.cjs.map +1 -0
- package/dist/offscreen.js +239 -0
- package/dist/offscreen.js.map +1 -0
- package/dist/shared/channel.d.ts +14 -0
- package/dist/shared/channel.d.ts.map +1 -0
- package/dist/shared/chrome-port.d.ts +8 -0
- package/dist/shared/chrome-port.d.ts.map +1 -0
- package/dist/shared/errors.d.ts +4 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/messages.d.ts +195 -0
- package/dist/shared/messages.d.ts.map +1 -0
- package/dist/shared/port-name.d.ts +2 -0
- package/dist/shared/port-name.d.ts.map +1 -0
- package/dist/shared/protocol.d.ts +59 -0
- package/dist/shared/protocol.d.ts.map +1 -0
- package/dist/shared/transport-client.d.ts +31 -0
- package/dist/shared/transport-client.d.ts.map +1 -0
- package/dist/shared/transport-server.d.ts +32 -0
- package/dist/shared/transport-server.d.ts.map +1 -0
- package/dist/sw/ensure-offscreen.d.ts +8 -0
- package/dist/sw/ensure-offscreen.d.ts.map +1 -0
- package/dist/sw/forwarder.d.ts +3 -0
- package/dist/sw/forwarder.d.ts.map +1 -0
- package/dist/sw/index.d.ts +4 -0
- package/dist/sw/index.d.ts.map +1 -0
- package/dist/sw/types.d.ts +19 -0
- package/dist/sw/types.d.ts.map +1 -0
- package/dist/sw.cjs +2 -0
- package/dist/sw.cjs.map +1 -0
- package/dist/sw.js +94 -0
- package/dist/sw.js.map +1 -0
- package/package.json +63 -0
- package/src/offscreen/offscreen.html +24 -0
|
@@ -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 @@
|
|
|
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"}
|