@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
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # @monetize.software/sdk-extension
2
+
3
+ SDK для Chrome-расширений. Один offscreen-документ держит BillingClient,
4
+ AuthClient, EventTracker — единственный source of truth для всех вкладок,
5
+ popup'ов, side-panel'ов и extension-страниц расширения.
6
+
7
+ Public API content-script'а **drop-in совместим** с `@monetize.software/sdk` —
8
+ host пишет `import { PaywallUI } from '@monetize.software/sdk-extension'` и получает
9
+ тот же класс, тот же метод-сет.
10
+
11
+ ## Архитектура
12
+
13
+ ```
14
+ content script (per tab) ──port──▶ service worker ──port──▶ offscreen
15
+ │ (forwarder) │
16
+ Shadow DOM modal BillingClient
17
+ RemoteBillingClient AuthClient
18
+ EventTracker
19
+ UserWatcher
20
+ ```
21
+
22
+ - **content-script:** UI + RemoteBillingClient (proxy через port в offscreen).
23
+ - **service worker:** маршрутизатор content↔offscreen, OAuth-флоу через
24
+ `chrome.identity` (offscreen его не видит).
25
+ - **offscreen:** реальный SDK state, переживает закрытие вкладок, единственная
26
+ точка координации auth-refresh / trial-counter / analytics-batch.
27
+
28
+ ## Статус
29
+
30
+ Phase 0 — скелет: package.json, vite multi-entry, wire-protocol типы,
31
+ заглушки на content/offscreen/sw + demo-extension манифест. Реальная
32
+ маршрутизация и RemoteBillingClient — следующие фазы.
33
+
34
+ См. TODO в репозитории и `src/shared/protocol.ts` для контракта сообщений.
35
+
36
+ ## Использование (целевое, в финале)
37
+
38
+ **В extension'е:**
39
+
40
+ ```ts
41
+ // service-worker.ts
42
+ import { installRouter } from '@monetize.software/sdk-extension/sw';
43
+ installRouter({ offscreenUrl: chrome.runtime.getURL('offscreen.html') });
44
+ ```
45
+
46
+ ```ts
47
+ // offscreen.html → offscreen.ts
48
+ import { startOffscreenServer } from '@monetize.software/sdk-extension/offscreen';
49
+ startOffscreenServer({ paywallId: '...', apiOrigin: 'https://...' });
50
+ ```
51
+
52
+ ```ts
53
+ // content-script.ts (на каждой вкладке)
54
+ import { PaywallUI } from '@monetize.software/sdk-extension';
55
+ const paywall = new PaywallUI({ paywallId: '...', apiOrigin: '...' });
56
+ paywall.open(); // ровно как в @monetize.software/sdk
57
+ ```
58
+
59
+ **На сайтах** — продолжаем использовать `@monetize.software/sdk`, не меняется.
60
+
61
+ ## Manifest: что прописывать в host extension'е
62
+
63
+ SDK сам по себе ничего в манифест не добавляет — host extension решает permissions
64
+ под свой UX. Минимум для работы SDK:
65
+
66
+ ```json
67
+ {
68
+ "permissions": ["offscreen", "storage"],
69
+ "host_permissions": ["https://api.monetize.software/*"],
70
+ "background": { "service_worker": "sw.js", "type": "module" }
71
+ }
72
+ ```
73
+
74
+ Опционально:
75
+
76
+ - `"permissions": ["identity"]` — если включаете OAuth-флоу (`auth: true` + Google/etc.).
77
+ - `web_accessible_resources` для `offscreen.html` **не нужен** — документ создаётся
78
+ service worker'ом через `chrome.offscreen.createDocument`, это chrome-API и WAR
79
+ не требует. Указывать его — лишняя attack surface (любой сайт сможет `<iframe>`-нить
80
+ ваш offscreen, плюс это fingerprint вашего extension ID).
81
+
82
+ ### `host_permissions` — что выбрать
83
+
84
+ `host_permissions` управляют двумя вещами: куда extension может делать `fetch` (из
85
+ offscreen / SW / content-script) и на какие origin'ы content-script может
86
+ инжектиться (вместе с `content_scripts.matches`).
87
+
88
+ | Сценарий | Рекомендация |
89
+ |---|---|
90
+ | **Host extension'у `<all_urls>` уже нужен** (рекордер, тулза-на-всех-сайтах, ассистент) | Оставляйте `<all_urls>`. SDK работает как есть. **Риск:** Chrome Web Store review для `<all_urls>` идёт через ручной audit и занимает дольше; AV-вендоры (Avast/Kaspersky/etc.) активнее метят такие расширения как PUA. Это «цена» широкого инжекта — не SDK'шный риск, а вашего use-case'а. |
91
+ | **Host extension ходит только на ваш бекенд и paywall'ит свои фичи** (popup-tool, side-panel app) | НЕ ставьте `<all_urls>`. Достаточно вашего apiOrigin: `["https://api.your-domain.com/*"]`. Никакого content-script инжекта на все сайты не нужно. |
92
+ | **Хотите гибрид** — popup-tool, но иногда content-script нужен на узком списке доменов | `host_permissions` + `content_scripts.matches` ограничьте до этих доменов: `["https://*.your-target.com/*", "https://api.your-domain.com/*"]`. |
93
+
94
+ Главный сигнал для CWS/AV: чем уже `host_permissions`, тем меньше подозрений.
95
+ `<all_urls>` оставляйте только если он реально нужен для UX, и будьте готовы
96
+ обосновать его в CWS review (поле "Permission justification").
97
+
98
+ ## Demo extension'а: build modes
99
+
100
+ Для self-проверки и e2e-тестов есть `demo-extension/` — reference-imple­ментация.
101
+ Билдов два:
102
+
103
+ ```bash
104
+ pnpm build:demo # production build (= шаблон, который можно копировать клиентам)
105
+ pnpm build:demo:e2e # debug build — экспонирует window.__paywall для playwright'а
106
+ ```
107
+
108
+ `build:demo` НЕ кладёт `window.__paywall` в bundle (dead-code elimination через
109
+ `import.meta.env.MODE !== 'e2e'`). Шаблон, который клиент копирует, остаётся
110
+ чистым: любой script на странице иначе мог бы дёрнуть `paywall.open()` /
111
+ `paywall.track()` и злоупотреблять чужим extension'ом.
112
+
113
+ `pnpm dev:demo` собирает в e2e-режиме (для удобной отладки из DevTools-консоли).