@dashgram/javascript 1.0.0 → 1.0.1
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 +117 -174
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +5 -4
- package/dist/core/context.d.ts +4 -8
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +6 -17
- package/dist/core/event-queue.d.ts +4 -4
- package/dist/core/event-queue.d.ts.map +1 -1
- package/dist/dashgram.min.js +1 -0
- package/dist/errors.d.ts +0 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +0 -10
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -32
- package/dist/trackers/base-tracker.d.ts +3 -3
- package/dist/trackers/base-tracker.d.ts.map +1 -1
- package/dist/trackers/base-tracker.js +1 -4
- package/dist/trackers/core-tracker.d.ts +3 -3
- package/dist/trackers/core-tracker.d.ts.map +1 -1
- package/dist/trackers/core-tracker.js +19 -21
- package/dist/trackers/deep-tracker.d.ts +6 -0
- package/dist/trackers/deep-tracker.d.ts.map +1 -1
- package/dist/trackers/deep-tracker.js +562 -12
- package/dist/trackers/interaction-tracker.d.ts +7 -3
- package/dist/trackers/interaction-tracker.d.ts.map +1 -1
- package/dist/trackers/interaction-tracker.js +142 -37
- package/dist/transport/batch-processor.d.ts +4 -4
- package/dist/transport/batch-processor.d.ts.map +1 -1
- package/dist/transport/batch-processor.js +8 -8
- package/dist/transport/transport.d.ts +4 -3
- package/dist/transport/transport.d.ts.map +1 -1
- package/dist/transport/transport.js +17 -24
- package/dist/types/index.d.ts +100 -25
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/device.d.ts +3 -7
- package/dist/utils/device.d.ts.map +1 -1
- package/dist/utils/device.js +19 -53
- package/dist/utils/telegram.d.ts +4 -6
- package/dist/utils/telegram.d.ts.map +1 -1
- package/dist/utils/telegram.js +45 -29
- package/package.json +5 -3
- package/dist/core/session.d.ts +0 -13
- package/dist/core/session.d.ts.map +0 -1
- package/dist/core/session.js +0 -63
package/README.md
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
# Dashgram JavaScript SDK
|
|
2
2
|
|
|
3
|
-
Analytics SDK for Telegram Mini Apps.
|
|
3
|
+
Analytics SDK for **Telegram Mini Apps**. Automatically captures user interactions and sends events to the Dashgram backend.
|
|
4
|
+
|
|
5
|
+
> ⚠️ **Important**: This SDK is designed exclusively for **Telegram Mini Apps** (WebApps).
|
|
6
|
+
> It is **NOT** for Telegram bots. For bot analytics, use the [Python SDK](../sdk-python) or [Go SDK](../go-dashgram).
|
|
4
7
|
|
|
5
8
|
## Installation
|
|
6
9
|
|
|
7
10
|
```bash
|
|
8
11
|
npm install @dashgram/javascript
|
|
12
|
+
# or
|
|
13
|
+
pnpm add @dashgram/javascript
|
|
14
|
+
# or
|
|
15
|
+
yarn add @dashgram/javascript
|
|
9
16
|
```
|
|
10
17
|
|
|
11
18
|
## Quick Start
|
|
@@ -16,241 +23,177 @@ import DashgramMini from "@dashgram/javascript"
|
|
|
16
23
|
// Initialize SDK
|
|
17
24
|
DashgramMini.init({
|
|
18
25
|
projectId: "your-project-id",
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
debug: true // for development
|
|
26
|
+
trackLevel: 2, // 1 = core, 2 = interactions, 3 = deep analytics
|
|
27
|
+
debug: true // Enable in development
|
|
22
28
|
})
|
|
23
29
|
|
|
24
30
|
// Track custom events
|
|
25
|
-
DashgramMini.track("
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
DashgramMini.track("purchase_completed", {
|
|
32
|
+
product_id: "premium-plan",
|
|
33
|
+
price: 9.99,
|
|
34
|
+
currency: "USD"
|
|
28
35
|
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Configuration
|
|
29
39
|
|
|
30
|
-
|
|
31
|
-
DashgramMini.
|
|
32
|
-
|
|
33
|
-
|
|
40
|
+
```typescript
|
|
41
|
+
DashgramMini.init({
|
|
42
|
+
projectId: "your-project-id", // Required
|
|
43
|
+
trackLevel: 2, // Optional: 1, 2, or 3 (default: 1)
|
|
44
|
+
debug: false, // Optional: enable console logs
|
|
45
|
+
disabled: false, // Optional: disable tracking entirely
|
|
46
|
+
batchSize: 10, // Optional: events per batch
|
|
47
|
+
flushInterval: 5000 // Optional: flush interval in ms
|
|
34
48
|
})
|
|
35
49
|
```
|
|
36
50
|
|
|
37
51
|
## Track Levels
|
|
38
52
|
|
|
39
|
-
### Level 1 — Core (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
53
|
+
### Level 1 — Core (Default)
|
|
54
|
+
|
|
55
|
+
Minimal tracking:
|
|
56
|
+
|
|
57
|
+
| Event | Description |
|
|
58
|
+
| ----------- | --------------------------------- |
|
|
59
|
+
| `app_open` | Mini App opened or became visible |
|
|
60
|
+
| `app_close` | Mini App closed or hidden |
|
|
61
|
+
|
|
62
|
+
### Level 2 — Interactions
|
|
63
|
+
|
|
64
|
+
Adds user interaction tracking:
|
|
65
|
+
|
|
66
|
+
| Event | Description |
|
|
67
|
+
| --------------------- | -------------------------------- |
|
|
68
|
+
| `screen_view` | Page/route navigation |
|
|
69
|
+
| `button_click` | Button clicks |
|
|
70
|
+
| `link_click` | Link clicks (external detection) |
|
|
71
|
+
| `form_submit` | Form submissions |
|
|
72
|
+
| `input_focus` | Input field focus |
|
|
73
|
+
| `input_change` | Input field value changed |
|
|
74
|
+
| `copy` | Text copied to clipboard |
|
|
75
|
+
| `cut` | Text cut to clipboard |
|
|
76
|
+
| `paste` | Text pasted from clipboard |
|
|
77
|
+
| `text_select` | Text selection |
|
|
78
|
+
| `js_error` | JavaScript errors |
|
|
79
|
+
| `unhandled_rejection` | Unhandled Promise rejections |
|
|
80
|
+
|
|
81
|
+
### Level 3 — Deep Analytics
|
|
82
|
+
|
|
83
|
+
Adds performance and Telegram-specific tracking:
|
|
84
|
+
|
|
85
|
+
| Event | Description |
|
|
86
|
+
| -------------------------------- | ------------------------------ |
|
|
87
|
+
| `scroll_depth` | Scroll milestone reached |
|
|
88
|
+
| `element_visible` | Tracked element became visible |
|
|
89
|
+
| `rage_click` | Rapid repeated clicks |
|
|
90
|
+
| `long_task` | JS task >50ms |
|
|
91
|
+
| `web_vital_lcp` | Largest Contentful Paint |
|
|
92
|
+
| `web_vital_fid` | First Input Delay |
|
|
93
|
+
| `web_vital_cls` | Cumulative Layout Shift |
|
|
94
|
+
| `network_status` | Online/offline status |
|
|
95
|
+
| `orientation_change` | Device orientation change |
|
|
96
|
+
| `media_play/pause/ended` | Video/audio events |
|
|
97
|
+
| `telegram_theme_changed` | Telegram theme change |
|
|
98
|
+
| `telegram_viewport_changed` | Viewport size change |
|
|
99
|
+
| `telegram_main_button_clicked` | Main button pressed |
|
|
100
|
+
| `telegram_back_button_clicked` | Back button pressed |
|
|
101
|
+
| `telegram_invoice_closed` | Invoice closed |
|
|
102
|
+
| ...and all other Telegram events | |
|
|
78
103
|
|
|
79
104
|
## API
|
|
80
105
|
|
|
81
106
|
### `DashgramMini.init(config)`
|
|
82
107
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
interface DashgramConfig {
|
|
87
|
-
projectId: string // Project ID from Dashgram dashboard
|
|
88
|
-
apiKey: string // API key for authentication
|
|
89
|
-
trackLevel?: 1 | 2 | 3 // Track level (default: 1)
|
|
90
|
-
apiUrl?: string // API endpoint URL (optional)
|
|
91
|
-
batchSize?: number // Batch size (default: 10)
|
|
92
|
-
flushInterval?: number // Flush interval in ms (default: 5000)
|
|
93
|
-
debug?: boolean // Debug mode (default: false)
|
|
94
|
-
disabled?: boolean // Disable tracking (default: false)
|
|
95
|
-
onError?: (error: DashgramError) => void // Optional error handler
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### `DashgramMini.track(event, properties?)`
|
|
100
|
-
|
|
101
|
-
Tracks a custom event.
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
DashgramMini.track("purchase_completed", {
|
|
105
|
-
product_id: "123",
|
|
106
|
-
amount: 99.99,
|
|
107
|
-
currency: "USD"
|
|
108
|
-
})
|
|
109
|
-
```
|
|
108
|
+
Initialize the SDK. Call once when your app loads.
|
|
110
109
|
|
|
111
|
-
### `DashgramMini.
|
|
110
|
+
### `DashgramMini.track(event, properties)`
|
|
112
111
|
|
|
113
|
-
|
|
112
|
+
Track a custom event.
|
|
114
113
|
|
|
115
114
|
```typescript
|
|
116
|
-
DashgramMini.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
signup_date: "2024-01-01"
|
|
115
|
+
DashgramMini.track("checkout_started", {
|
|
116
|
+
cart_value: 49.99,
|
|
117
|
+
item_count: 3
|
|
120
118
|
})
|
|
121
119
|
```
|
|
122
120
|
|
|
123
121
|
### `DashgramMini.setTrackLevel(level)`
|
|
124
122
|
|
|
125
|
-
|
|
123
|
+
Change the track level at runtime.
|
|
126
124
|
|
|
127
125
|
```typescript
|
|
128
|
-
DashgramMini.setTrackLevel(3) // Enable
|
|
126
|
+
DashgramMini.setTrackLevel(3) // Enable deep analytics
|
|
129
127
|
```
|
|
130
128
|
|
|
131
129
|
### `DashgramMini.flush()`
|
|
132
130
|
|
|
133
|
-
|
|
131
|
+
Force send all pending events.
|
|
134
132
|
|
|
135
133
|
```typescript
|
|
136
134
|
await DashgramMini.flush()
|
|
137
135
|
```
|
|
138
136
|
|
|
139
|
-
### `DashgramMini.reset()`
|
|
140
|
-
|
|
141
|
-
Resets the session and user information.
|
|
142
|
-
|
|
143
|
-
```typescript
|
|
144
|
-
DashgramMini.reset()
|
|
145
|
-
```
|
|
146
|
-
|
|
147
137
|
### `DashgramMini.shutdown()`
|
|
148
138
|
|
|
149
|
-
|
|
139
|
+
Stop tracking and clean up.
|
|
150
140
|
|
|
151
141
|
```typescript
|
|
152
142
|
DashgramMini.shutdown()
|
|
153
143
|
```
|
|
154
144
|
|
|
155
|
-
##
|
|
145
|
+
## User Identification
|
|
156
146
|
|
|
157
|
-
|
|
147
|
+
User identification is handled **automatically** via Telegram's `initData`. The SDK sends the raw `initData` string with every event, allowing the backend to validate and extract user information securely.
|
|
158
148
|
|
|
159
|
-
|
|
160
|
-
<div data-track-visible="hero-banner">
|
|
161
|
-
<!-- Content -->
|
|
162
|
-
</div>
|
|
163
|
-
```
|
|
149
|
+
You do **not** need to call any identify method.
|
|
164
150
|
|
|
165
|
-
|
|
151
|
+
## How It Works
|
|
166
152
|
|
|
167
|
-
|
|
153
|
+
1. SDK captures events based on `trackLevel`
|
|
154
|
+
2. Events are batched for efficiency
|
|
155
|
+
3. Each event includes:
|
|
156
|
+
- `eventId`: UUID for deduplication
|
|
157
|
+
- `type`: Event name
|
|
158
|
+
- `initData`: Raw Telegram initData (for backend validation)
|
|
159
|
+
- `properties`: Custom event data
|
|
160
|
+
- `telemetry`: Platform, user agent, timezone, theme
|
|
161
|
+
- `timestamp`: Unix milliseconds
|
|
162
|
+
4. Events are sent to `POST /v1/{projectId}/webapp/track`
|
|
168
163
|
|
|
169
|
-
|
|
164
|
+
## TypeScript Support
|
|
170
165
|
|
|
171
|
-
|
|
172
|
-
{
|
|
173
|
-
"event": "event_name",
|
|
174
|
-
"properties": { /* custom properties */ },
|
|
175
|
-
"timestamp": "2024-01-01T12:00:00.000Z",
|
|
176
|
-
"source": "auto" | "manual",
|
|
177
|
-
"level": 1 | 2 | 3,
|
|
178
|
-
"session_id": "uuid",
|
|
179
|
-
"user_id": "telegram_user_id | null",
|
|
180
|
-
"context": {
|
|
181
|
-
"platform": "...",
|
|
182
|
-
"app_version": "...",
|
|
183
|
-
"language": "...",
|
|
184
|
-
"screen_width": 1920,
|
|
185
|
-
"screen_height": 1080,
|
|
186
|
-
"viewport_width": 1200,
|
|
187
|
-
"viewport_height": 800,
|
|
188
|
-
"user_agent": "...",
|
|
189
|
-
"timezone": "Europe/Moscow",
|
|
190
|
-
"telegram_version": "...",
|
|
191
|
-
"theme": "dark"
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## TypeScript
|
|
197
|
-
|
|
198
|
-
The SDK is written in TypeScript and includes all types:
|
|
166
|
+
Full TypeScript support with exported types:
|
|
199
167
|
|
|
200
168
|
```typescript
|
|
201
|
-
import
|
|
202
|
-
DashgramConfig,
|
|
203
|
-
EventProperties,
|
|
204
|
-
UserTraits,
|
|
205
|
-
DashgramError,
|
|
206
|
-
InvalidCredentialsError,
|
|
207
|
-
DashgramAPIError,
|
|
208
|
-
NetworkError,
|
|
209
|
-
DashgramConfigurationError
|
|
210
|
-
} from "@dashgram/javascript"
|
|
169
|
+
import type { DashgramConfig, WebAppEvent, EventProperties, TrackLevel } from "@dashgram/javascript"
|
|
211
170
|
```
|
|
212
171
|
|
|
213
172
|
## Error Handling
|
|
214
173
|
|
|
215
|
-
The SDK provides typed error classes for better error handling:
|
|
216
|
-
|
|
217
174
|
```typescript
|
|
218
|
-
import {
|
|
219
|
-
|
|
220
|
-
InvalidCredentialsError,
|
|
221
|
-
DashgramAPIError,
|
|
222
|
-
NetworkError,
|
|
223
|
-
DashgramConfigurationError
|
|
224
|
-
} from "@dashgram/javascript"
|
|
225
|
-
|
|
226
|
-
// Optional error handler callback
|
|
175
|
+
import { DashgramMini, DashgramAPIError, NetworkError } from "@dashgram/javascript"
|
|
176
|
+
|
|
227
177
|
DashgramMini.init({
|
|
228
|
-
projectId: "
|
|
229
|
-
apiKey: "yyy",
|
|
178
|
+
projectId: "your-project-id",
|
|
230
179
|
onError: error => {
|
|
231
|
-
if (error instanceof
|
|
232
|
-
console.
|
|
233
|
-
} else if (error instanceof
|
|
234
|
-
console.
|
|
235
|
-
} else if (error instanceof DashgramConfigurationError) {
|
|
236
|
-
console.error("Configuration error:", error.message)
|
|
180
|
+
if (error instanceof NetworkError) {
|
|
181
|
+
console.log("Network issue:", error.message)
|
|
182
|
+
} else if (error instanceof DashgramAPIError) {
|
|
183
|
+
console.log("API error:", error.statusCode, error.details)
|
|
237
184
|
}
|
|
238
185
|
}
|
|
239
186
|
})
|
|
240
187
|
```
|
|
241
188
|
|
|
242
|
-
##
|
|
243
|
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
246
|
-
-
|
|
247
|
-
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
- ✅ Throttling and debouncing for performance optimization
|
|
251
|
-
- ✅ Offline mode support
|
|
252
|
-
- ✅ Typed error classes
|
|
253
|
-
- ✅ Optional error handler callback
|
|
189
|
+
## Browser Support
|
|
190
|
+
|
|
191
|
+
- Chrome 64+
|
|
192
|
+
- Firefox 67+
|
|
193
|
+
- Safari 12+
|
|
194
|
+
- Edge 79+
|
|
195
|
+
|
|
196
|
+
Works in all environments that support Telegram Mini Apps.
|
|
254
197
|
|
|
255
198
|
## License
|
|
256
199
|
|
package/dist/core/config.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class Config {
|
|
|
5
5
|
private validate;
|
|
6
6
|
get<K extends keyof Required<Omit<DashgramConfig, "onError">>>(key: K): Required<Omit<DashgramConfig, "onError">>[K];
|
|
7
7
|
getOnError(): DashgramConfig["onError"];
|
|
8
|
+
getTrackUrl(): string;
|
|
8
9
|
setTrackLevel(level: TrackLevel): void;
|
|
9
10
|
getTrackLevel(): TrackLevel;
|
|
10
11
|
isDebug(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkB1D,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA6E;gBAE/E,UAAU,EAAE,cAAc;IAYtC,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkB1D,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAA6E;gBAE/E,UAAU,EAAE,cAAc;IAYtC,OAAO,CAAC,QAAQ;IAahB,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAOpH,UAAU,IAAI,cAAc,CAAC,SAAS,CAAC;IAOvC,WAAW,IAAI,MAAM;IAQrB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAUtC,aAAa,IAAI,UAAU;IAO3B,OAAO,IAAI,OAAO;IAOlB,UAAU,IAAI,OAAO;CAGtB"}
|
package/dist/core/config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DashgramConfigurationError } from "../errors";
|
|
2
2
|
const DEFAULT_CONFIG = {
|
|
3
3
|
trackLevel: 1,
|
|
4
|
-
apiUrl: "https://api.dashgram.
|
|
4
|
+
apiUrl: "https://api.dashgram.io/v1",
|
|
5
5
|
batchSize: 10,
|
|
6
6
|
flushInterval: 5000,
|
|
7
7
|
debug: false,
|
|
@@ -19,9 +19,6 @@ export class Config {
|
|
|
19
19
|
if (!this.config.projectId) {
|
|
20
20
|
throw new DashgramConfigurationError("projectId is required");
|
|
21
21
|
}
|
|
22
|
-
if (!this.config.apiKey) {
|
|
23
|
-
throw new DashgramConfigurationError("apiKey is required");
|
|
24
|
-
}
|
|
25
22
|
if (![1, 2, 3].includes(this.config.trackLevel)) {
|
|
26
23
|
throw new DashgramConfigurationError("trackLevel must be 1, 2, or 3");
|
|
27
24
|
}
|
|
@@ -32,6 +29,10 @@ export class Config {
|
|
|
32
29
|
getOnError() {
|
|
33
30
|
return this.config.onError;
|
|
34
31
|
}
|
|
32
|
+
getTrackUrl() {
|
|
33
|
+
const baseUrl = this.config.apiUrl.replace(/\/$/, "");
|
|
34
|
+
return `${baseUrl}/${this.config.projectId}/webapp/track`;
|
|
35
|
+
}
|
|
35
36
|
setTrackLevel(level) {
|
|
36
37
|
if (![1, 2, 3].includes(level)) {
|
|
37
38
|
throw new DashgramConfigurationError("trackLevel must be 1, 2, or 3");
|
package/dist/core/context.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Telemetry } from "../types";
|
|
2
2
|
export declare class Context {
|
|
3
|
-
private
|
|
4
|
-
private userId;
|
|
3
|
+
private telemetry;
|
|
5
4
|
constructor();
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
getUserId(): string | null;
|
|
9
|
-
setUserId(userId: string): void;
|
|
10
|
-
clearUserId(): void;
|
|
5
|
+
getTelemetry(): Telemetry;
|
|
6
|
+
updateTelemetry(): void;
|
|
11
7
|
}
|
|
12
8
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAMzC,qBAAa,OAAO;IAClB,OAAO,CAAC,SAAS,CAAW;;IAS5B,YAAY,IAAI,SAAS;IAOzB,eAAe,IAAI,IAAI;CAGxB"}
|
package/dist/core/context.js
CHANGED
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getTelegramUserId } from '../utils/telegram';
|
|
1
|
+
import { getTelemetry } from "../utils/device";
|
|
3
2
|
export class Context {
|
|
4
3
|
constructor() {
|
|
5
|
-
this.
|
|
6
|
-
this.userId = getTelegramUserId();
|
|
4
|
+
this.telemetry = getTelemetry();
|
|
7
5
|
}
|
|
8
|
-
|
|
9
|
-
return { ...this.
|
|
6
|
+
getTelemetry() {
|
|
7
|
+
return { ...this.telemetry };
|
|
10
8
|
}
|
|
11
|
-
|
|
12
|
-
this.
|
|
13
|
-
}
|
|
14
|
-
getUserId() {
|
|
15
|
-
return this.userId;
|
|
16
|
-
}
|
|
17
|
-
setUserId(userId) {
|
|
18
|
-
this.userId = userId;
|
|
19
|
-
}
|
|
20
|
-
clearUserId() {
|
|
21
|
-
this.userId = null;
|
|
9
|
+
updateTelemetry() {
|
|
10
|
+
this.telemetry = getTelemetry();
|
|
22
11
|
}
|
|
23
12
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { WebAppEvent } from "../types";
|
|
2
2
|
export declare class EventQueue {
|
|
3
3
|
private queue;
|
|
4
4
|
private maxSize;
|
|
5
5
|
constructor(maxSize?: number);
|
|
6
|
-
enqueue(event:
|
|
7
|
-
flush():
|
|
8
|
-
peek():
|
|
6
|
+
enqueue(event: WebAppEvent): void;
|
|
7
|
+
flush(): WebAppEvent[];
|
|
8
|
+
peek(): WebAppEvent[];
|
|
9
9
|
size(): number;
|
|
10
10
|
isEmpty(): boolean;
|
|
11
11
|
clear(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/core/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/core/event-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAK3C,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,GAAE,MAAY;IAOjC,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAYjC,KAAK,IAAI,WAAW,EAAE;IAStB,IAAI,IAAI,WAAW,EAAE;IAOrB,IAAI,IAAI,MAAM;IAOd,OAAO,IAAI,OAAO;IAOlB,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var DashgramMini=(()=>{var q=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var De=Object.prototype.hasOwnProperty;var Ie=(c,i)=>{for(var e in i)q(c,e,{get:i[e],enumerable:!0})},Re=(c,i,e,t)=>{if(i&&typeof i=="object"||typeof i=="function")for(let r of Oe(i))!De.call(c,r)&&r!==e&&q(c,r,{get:()=>i[r],enumerable:!(t=Me(i,r))||t.enumerable});return c};var Ae=c=>Re(q({},"__esModule",{value:!0}),c);var He={};Ie(He,{DashgramAPIError:()=>p,DashgramConfigurationError:()=>g,DashgramError:()=>m,DashgramMini:()=>j,NetworkError:()=>h,default:()=>We});var m=class c extends Error{constructor(i){super(i),this.name="DashgramError";let e=Error;typeof e.captureStackTrace=="function"&&e.captureStackTrace(this,c)}},p=class c extends m{constructor(e,t){super(`Dashgram API error (${e}): ${t}`);this.statusCode=e;this.details=t;this.name="DashgramAPIError";let r=Error;typeof r.captureStackTrace=="function"&&r.captureStackTrace(this,c)}},h=class c extends m{constructor(e){super(`Network error: ${e.message}`);this.originalError=e;this.name="NetworkError";let t=Error;typeof t.captureStackTrace=="function"&&t.captureStackTrace(this,c)}},g=class c extends m{constructor(i){super(i),this.name="DashgramConfigurationError";let e=Error;typeof e.captureStackTrace=="function"&&e.captureStackTrace(this,c)}};var Fe={trackLevel:1,apiUrl:"https://api.dashgram.io/v1",batchSize:10,flushInterval:5e3,debug:!1,disabled:!1},b=class{constructor(i){this.config={...Fe,...i},this.validate()}validate(){if(!this.config.projectId)throw new g("projectId is required");if(![1,2,3].includes(this.config.trackLevel))throw new g("trackLevel must be 1, 2, or 3")}get(i){return this.config[i]}getOnError(){return this.config.onError}getTrackUrl(){return`${this.config.apiUrl.replace(/\/$/,"")}/${this.config.projectId}/webapp/track`}setTrackLevel(i){if(![1,2,3].includes(i))throw new g("trackLevel must be 1, 2, or 3");this.config.trackLevel=i}getTrackLevel(){return this.config.trackLevel}isDebug(){return this.config.debug}isDisabled(){return this.config.disabled}};function k(){return typeof window>"u"?null:window.Telegram?.WebApp||null}function I(){return k()?.initData||""}function R(){return k()?.platform||"unknown"}function A(){let c=k();if(c?.colorScheme)return c.colorScheme;if(c?.themeParams?.bg_color){let i=c.themeParams.bg_color;try{let e=parseInt(i.slice(1),16),t=e>>16&255,r=e>>8&255,n=e>>0&255;return .2126*t+.7152*r+.0722*n<128?"dark":"light"}catch{return}}}function u(c,i){let e=k();if(!e||!e.onEvent)return()=>{};try{let t=(r,n)=>{try{i(n)}catch(s){typeof window<"u"&&window.__DASHGRAM_DEBUG__&&console.warn(`[Dashgram] Error in Telegram event callback for ${c}:`,s)}};return e.onEvent(c,t),()=>{try{e.offEvent&&e.offEvent(c,t)}catch{}}}catch{return()=>{}}}function P(){return typeof window>"u"?{platform:"unknown"}:{platform:R(),user_agent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone||void 0,theme:A()}}function F(){return typeof window>"u"?"":window.location.href}function W(){return typeof window>"u"?"":window.location.pathname}function H(){return typeof document>"u"?"":document.title||""}function U(){return typeof window>"u"?"":window.location.origin}var y=class{constructor(){this.telemetry=P()}getTelemetry(){return{...this.telemetry}}updateTelemetry(){this.telemetry=P()}};function B(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,c=>{let i=Math.random()*16|0;return(c==="x"?i:i&3|8).toString(16)})}function _(c,i){let e=null,t=0;return function(...r){let n=Date.now(),s=i-(n-t);s<=0||s>i?(e&&(clearTimeout(e),e=null),t=n,c.apply(this,r)):e||(e=setTimeout(()=>{t=Date.now(),e=null,c.apply(this,r)},s))}}function M(c){try{return JSON.stringify(c)}catch{return"{}"}}function z(){return typeof window<"u"&&typeof document<"u"}function v(c){if(c.id)return`#${c.id}`;if(c.className&&typeof c.className=="string"){let i=c.className.trim().split(/\s+/).slice(0,2).join(".");if(i)return`${c.tagName.toLowerCase()}.${i}`}return c.tagName.toLowerCase()}function O(c,i=50){let e=c.textContent?.trim()||"";return e.length>i?e.substring(0,i)+"...":e}var T=class{constructor(i){this.isOnline=!0;this.pendingRequests=new Set;this.config=i,this.setupOnlineListener()}setupOnlineListener(){typeof window>"u"||(window.addEventListener("online",()=>{this.isOnline=!0,this.log("Connection restored")}),window.addEventListener("offline",()=>{this.isOnline=!1,this.log("Connection lost")}),this.isOnline=navigator.onLine)}buildPayload(i){return{origin:U()||void 0,updates:i}}async send(i){if(i.length===0)return;if(this.config.isDisabled()){this.log("Tracking disabled, skipping send");return}if(!this.isOnline){this.log("Offline, skipping send");return}let e=this.sendRequest(i);this.pendingRequests.add(e);try{await e}catch(t){this.logError("Failed to send events:",t);let r=this.config.getOnError();if(r)try{t instanceof p||t instanceof h?r(t):t instanceof Error&&r(new h(t))}catch(n){this.logError("Error in onError callback:",n)}}finally{this.pendingRequests.delete(e)}}async sendRequest(i){let e=this.config.getTrackUrl(),t=this.buildPayload(i);try{let r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:M(t),keepalive:!0});if(!r.ok){let n=r.statusText;try{let s=await r.json();n=s.details||s.message||n}catch{}throw new p(r.status,n)}this.log(`Sent ${i.length} events successfully`)}catch(r){throw r instanceof p?r:r instanceof Error?new h(r):new h(new Error(String(r)))}}sendBeacon(i){if(i.length===0||this.config.isDisabled())return!0;if(typeof navigator>"u"||!navigator.sendBeacon)return!1;let e=this.config.getTrackUrl(),t=this.buildPayload(i),r=new Blob([M(t)],{type:"application/json"}),n=navigator.sendBeacon(e,r);return this.log(`sendBeacon ${n?"succeeded":"failed"} for ${i.length} events`),n}async flush(){await Promise.all(Array.from(this.pendingRequests))}log(...i){this.config.isDebug()&&console.log("[Dashgram Transport]",...i)}logError(...i){this.config.isDebug()&&console.error("[Dashgram Transport]",...i)}};var E=class{constructor(i=100){this.queue=[];this.maxSize=i}enqueue(i){this.queue.push(i),this.queue.length>this.maxSize&&this.queue.shift()}flush(){let i=[...this.queue];return this.queue=[],i}peek(){return[...this.queue]}size(){return this.queue.length}isEmpty(){return this.queue.length===0}clear(){this.queue=[]}};var w=class{constructor(i,e){this.flushTimer=null;this.isStarted=!1;this.config=i,this.transport=e,this.queue=new E(200)}start(){this.isStarted||(this.isStarted=!0,this.scheduleFlush(),this.setupPageUnloadHandler())}stop(){this.isStarted=!1,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null)}addEvent(i){this.queue.enqueue(i);let e=this.config.get("batchSize");this.queue.size()>=e&&this.flush()}scheduleFlush(){this.flushTimer&&clearTimeout(this.flushTimer);let i=this.config.get("flushInterval");this.flushTimer=setTimeout(()=>{this.flush(),this.isStarted&&this.scheduleFlush()},i)}flush(){let i=this.queue.flush();i.length>0&&this.transport.send(i)}async flushAsync(){let i=this.queue.flush();i.length>0&&await this.transport.send(i),await this.transport.flush()}setupPageUnloadHandler(){if(typeof window>"u")return;let i=()=>{let e=this.queue.flush();e.length>0&&this.transport.sendBeacon(e)};window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&i()}),window.addEventListener("pagehide",i),window.addEventListener("beforeunload",i)}};var f=class{constructor(i,e,t){this.isActive=!1;this.config=i,this.trackCallback=e,this.level=t}start(){if(this.isActive)return;this.config.getTrackLevel()>=this.level&&(this.isActive=!0,this.setup(),this.log(`Started (level ${this.level})`))}stop(){this.isActive&&(this.isActive=!1,this.teardown(),this.log("Stopped"))}track(i,e={}){this.isActive&&this.trackCallback(i,e)}log(...i){this.config.isDebug()&&console.log(`[Dashgram ${this.constructor.name}]`,...i)}};var L=class extends f{constructor(e,t){super(e,t,1);this.unsubscribers=[];this.hasTrackedAppOpen=!1}setup(){typeof window>"u"||(this.trackAppOpen(),this.setupVisibilityTracking(),this.setupUnloadTracking())}teardown(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[]}trackAppOpen(){this.hasTrackedAppOpen||(this.track("app_open",{referrer:document.referrer||"direct"}),this.hasTrackedAppOpen=!0)}setupVisibilityTracking(){let e=()=>{document.visibilityState==="hidden"?this.track("app_close",{visibility_state:"hidden"}):document.visibilityState==="visible"&&this.track("app_open",{visibility_state:"visible"})};document.addEventListener("visibilitychange",e),this.unsubscribers.push(()=>{document.removeEventListener("visibilitychange",e)})}setupUnloadTracking(){let e=()=>{this.track("app_close",{reason:"unload"})};window.addEventListener("pagehide",e),this.unsubscribers.push(()=>{window.removeEventListener("pagehide",e)}),window.addEventListener("beforeunload",e),this.unsubscribers.push(()=>{window.removeEventListener("beforeunload",e)})}};var S=class extends f{constructor(e,t){super(e,t,2);this.unsubscribers=[];this.lastPath="";this.inputValues=new Map}setup(){typeof window>"u"||(this.trackScreenView(),this.setupHistoryTracking(),this.setupClickTracking(),this.setupFormTracking(),this.setupInputTracking(),this.setupClipboardTracking(),this.setupSelectionTracking(),this.setupErrorTracking())}teardown(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[]}trackScreenView(){let e=W();e!==this.lastPath&&(this.lastPath=e,this.track("screen_view",{path:e,url:F(),title:H(),referrer:document.referrer||"direct"}))}setupHistoryTracking(){let e=history.pushState,t=history.replaceState,r=()=>{this.trackScreenView()};history.pushState=function(...n){e.apply(history,n),r()},history.replaceState=function(...n){t.apply(history,n),r()},window.addEventListener("popstate",r),this.unsubscribers.push(()=>{history.pushState=e,history.replaceState=t,window.removeEventListener("popstate",r)})}setupClickTracking(){let e=t=>{let r=t.target;if(!r)return;let n=r.closest('button, [role="button"], a');if(n)if(n.tagName.toLowerCase()==="a"){let l=n,d=l.href,C=d?this.isExternalLink(d):!1;this.track("link_click",{element:v(n),text:O(n),href:d||void 0,target:l.target||void 0,is_external:C,is_download:l.hasAttribute("download")})}else this.track("button_click",{element:v(n),text:O(n)})};document.addEventListener("click",e,{capture:!0}),this.unsubscribers.push(()=>{document.removeEventListener("click",e,{capture:!0})})}isExternalLink(e){try{return new URL(e,window.location.href).origin!==window.location.origin}catch{return!1}}setupFormTracking(){let e=t=>{let r=t.target;r&&this.track("form_submit",{form_id:r.id||void 0,form_name:r.name||void 0,form_action:r.action||void 0,form_method:r.method||void 0})};document.addEventListener("submit",e,{capture:!0}),this.unsubscribers.push(()=>{document.removeEventListener("submit",e,{capture:!0})})}setupInputTracking(){let e=_(r=>{let n=r.target;if(!n)return;let s=n.tagName.toLowerCase();if(["input","textarea","select"].includes(s)){let a=n;this.inputValues.set(n,a.value||""),this.track("input_focus",{element:v(a),input_type:a.type||s,input_name:a.name||void 0,input_id:a.id||void 0})}},1e3),t=r=>{let n=r.target;if(!n)return;let s=n.tagName.toLowerCase();if(["input","textarea","select"].includes(s)){let a=n,l=this.inputValues.get(n),d=a.value||"";l!==void 0&&l!==d&&this.track("input_change",{element:v(a),input_type:a.type||s,input_name:a.name||void 0,input_id:a.id||void 0,had_value:l.length>0,has_value:d.length>0}),this.inputValues.delete(n)}};document.addEventListener("focus",e,{capture:!0}),document.addEventListener("blur",t,{capture:!0}),this.unsubscribers.push(()=>{document.removeEventListener("focus",e,{capture:!0}),document.removeEventListener("blur",t,{capture:!0}),this.inputValues.clear()})}setupClipboardTracking(){let e=n=>{let a=window.getSelection()?.toString()||"";this.track("copy",{text_length:a.length,has_selection:a.length>0})},t=n=>{let a=window.getSelection()?.toString()||"";this.track("cut",{text_length:a.length,has_selection:a.length>0})},r=n=>{let s=n.clipboardData?.getData("text")||"",a=n.target;this.track("paste",{text_length:s.length,target_element:a?v(a):void 0})};document.addEventListener("copy",e),document.addEventListener("cut",t),document.addEventListener("paste",r),this.unsubscribers.push(()=>{document.removeEventListener("copy",e),document.removeEventListener("cut",t),document.removeEventListener("paste",r)})}setupSelectionTracking(){let e,t=()=>{clearTimeout(e),e=setTimeout(()=>{let n=window.getSelection()?.toString()||"";n.length>0&&this.track("text_select",{text_length:n.length})},500)};document.addEventListener("selectionchange",t),this.unsubscribers.push(()=>{document.removeEventListener("selectionchange",t),clearTimeout(e)})}setupErrorTracking(){let e=r=>{this.track("js_error",{message:r.message,filename:r.filename,lineno:r.lineno,colno:r.colno,stack:r.error?.stack})};window.addEventListener("error",e),this.unsubscribers.push(()=>{window.removeEventListener("error",e)});let t=r=>{this.track("unhandled_rejection",{reason:String(r.reason),promise:String(r.promise)})};window.addEventListener("unhandledrejection",t),this.unsubscribers.push(()=>{window.removeEventListener("unhandledrejection",t)})}};var x=class extends f{constructor(e,t){super(e,t,3);this.unsubscribers=[];this.observers=[];this.clickTracker=new Map;this.maxScrollDepth=0;this.trackedMedia=new WeakSet}setup(){typeof window>"u"||(this.setupScrollTracking(),this.setupVisibilityTracking(),this.setupRageClickTracking(),this.setupLongTaskTracking(),this.setupWebVitals(),this.setupNetworkTracking(),this.setupOrientationTracking(),this.setupMediaTracking(),this.setupTelegramTracking())}teardown(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[],this.observers.forEach(e=>e.disconnect()),this.observers=[],this.clickTracker.clear()}getScrollDepth(){let e=window.innerHeight,t=document.documentElement.scrollHeight,r=window.pageYOffset||document.documentElement.scrollTop;if(t<=e)return 100;let n=t-e,s=r/n*100;return Math.min(Math.round(s),100)}setupScrollTracking(){let e=_(()=>{let t=this.getScrollDepth();if(t>this.maxScrollDepth){this.maxScrollDepth=t;let n=[25,50,75,100].find(s=>t>=s&&this.maxScrollDepth-t<s);n&&this.track("scroll_depth",{depth:n,max_depth:this.maxScrollDepth})}},500);window.addEventListener("scroll",e,{passive:!0}),this.unsubscribers.push(()=>{window.removeEventListener("scroll",e)})}setupVisibilityTracking(){if(!("IntersectionObserver"in window))return;let e=new IntersectionObserver(r=>{r.forEach(n=>{if(n.isIntersecting){let s=n.target,a=s.getAttribute("data-track-visible");a&&(this.track("element_visible",{element:a,intersection_ratio:n.intersectionRatio}),e.unobserve(s))}})},{threshold:.5});document.querySelectorAll("[data-track-visible]").forEach(r=>{e.observe(r)}),this.observers.push(e);let t=new MutationObserver(r=>{r.forEach(n=>{n.addedNodes.forEach(s=>{s instanceof Element&&(s.hasAttribute("data-track-visible")&&e.observe(s),s.querySelectorAll("[data-track-visible]").forEach(a=>{e.observe(a)}))})})});t.observe(document.body,{childList:!0,subtree:!0}),this.unsubscribers.push(()=>{t.disconnect()})}setupRageClickTracking(){let r=n=>{let s=n.target;if(!s)return;let a=this.clickTracker.get(s);if(a)a.count++,clearTimeout(a.timer),a.count>=5?(this.track("rage_click",{element:s.tagName.toLowerCase(),click_count:a.count}),this.clickTracker.delete(s)):a.timer=setTimeout(()=>{this.clickTracker.delete(s)},2e3);else{let l=setTimeout(()=>{this.clickTracker.delete(s)},2e3);this.clickTracker.set(s,{count:1,timer:l})}};document.addEventListener("click",r),this.unsubscribers.push(()=>{document.removeEventListener("click",r)})}setupLongTaskTracking(){if("PerformanceObserver"in window)try{let e=new PerformanceObserver(t=>{for(let r of t.getEntries())r.duration>50&&this.track("long_task",{duration:Math.round(r.duration),start_time:Math.round(r.startTime)})});e.observe({entryTypes:["longtask"]}),this.observers.push(e)}catch{this.log("Long task tracking not supported")}}setupWebVitals(){if(!("PerformanceObserver"in window))return;try{let t=new PerformanceObserver(r=>{let n=r.getEntries(),s=n[n.length-1];this.track("web_vital_lcp",{value:Math.round(s.renderTime||s.loadTime),element:s.element?.tagName.toLowerCase()})});t.observe({entryTypes:["largest-contentful-paint"]}),this.observers.push(t)}catch{this.log("LCP tracking not supported")}try{let t=new PerformanceObserver(r=>{r.getEntries().forEach(s=>{this.track("web_vital_fid",{value:Math.round(s.processingStart-s.startTime),event_type:s.name})})});t.observe({entryTypes:["first-input"]}),this.observers.push(t)}catch{this.log("FID tracking not supported")}let e=0;try{let t=new PerformanceObserver(n=>{n.getEntries().forEach(a=>{a.hadRecentInput||(e+=a.value)})});t.observe({entryTypes:["layout-shift"]}),this.observers.push(t);let r=()=>{e>0&&this.track("web_vital_cls",{value:Math.round(e*1e3)/1e3})};window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&r()}),this.unsubscribers.push(()=>{r()})}catch{this.log("CLS tracking not supported")}}setupNetworkTracking(){let e=()=>{this.track("network_status",{status:"online",effective_type:navigator.connection?.effectiveType,downlink:navigator.connection?.downlink,rtt:navigator.connection?.rtt})},t=()=>{this.track("network_status",{status:"offline"})};window.addEventListener("online",e),window.addEventListener("offline",t),this.unsubscribers.push(()=>{window.removeEventListener("online",e),window.removeEventListener("offline",t)});let r=navigator.connection;if(r){let n=()=>{this.track("network_change",{effective_type:r.effectiveType,downlink:r.downlink,rtt:r.rtt,save_data:r.saveData})};r.addEventListener("change",n),this.unsubscribers.push(()=>{r.removeEventListener("change",n)})}}setupOrientationTracking(){let e=()=>{let t=screen.orientation?.type||(window.innerWidth>window.innerHeight?"landscape":"portrait");this.track("orientation_change",{orientation:t,angle:screen.orientation?.angle,width:window.innerWidth,height:window.innerHeight})};screen.orientation?(screen.orientation.addEventListener("change",e),this.unsubscribers.push(()=>{screen.orientation.removeEventListener("change",e)})):(window.addEventListener("orientationchange",e),this.unsubscribers.push(()=>{window.removeEventListener("orientationchange",e)}))}setupMediaTracking(){let e=n=>{let s=n.target;if(!s||this.trackedMedia.has(s))return;let a=s.tagName.toLowerCase(),l=n.type,d={media_type:a,src:s.currentSrc||s.src,duration:isFinite(s.duration)?Math.round(s.duration):void 0,current_time:Math.round(s.currentTime),muted:s.muted,volume:Math.round(s.volume*100)};l==="play"?this.track("media_play",d):l==="pause"?this.track("media_pause",{...d,percent_played:s.duration?Math.round(s.currentTime/s.duration*100):0}):l==="ended"?this.track("media_ended",{...d,completed:!0}):l==="error"&&this.track("media_error",{media_type:a,src:s.currentSrc||s.src,error:s.error?.message||"unknown"})},t=n=>{this.trackedMedia.has(n)||(this.trackedMedia.add(n),n.addEventListener("play",e),n.addEventListener("pause",e),n.addEventListener("ended",e),n.addEventListener("error",e))};document.querySelectorAll("video, audio").forEach(n=>{t(n)});let r=new MutationObserver(n=>{n.forEach(s=>{s.addedNodes.forEach(a=>{a instanceof HTMLMediaElement&&t(a),a instanceof Element&&a.querySelectorAll("video, audio").forEach(l=>{t(l)})})})});r.observe(document.body,{childList:!0,subtree:!0}),this.observers.push(r)}setupTelegramTracking(){let e=window.Telegram?.WebApp,t=(o,Pe)=>{this.track(`telegram_${o}`,Pe||{})},r=u("themeChanged",()=>{t("theme_changed",{color_scheme:e?.colorScheme,theme_params:e?.themeParams})});this.unsubscribers.push(r);let n=u("viewportChanged",o=>{t("viewport_changed",{is_state_stable:o?.isStateStable,is_expanded:e?.isExpanded,viewport_height:e?.viewportHeight,viewport_stable_height:e?.viewportStableHeight})});this.unsubscribers.push(n);let s=u("safeAreaChanged",()=>{t("safe_area_changed",{safe_area:e?.safeAreaInset})});this.unsubscribers.push(s);let a=u("contentSafeAreaChanged",()=>{t("content_safe_area_changed",{content_safe_area:e?.contentSafeAreaInset})});this.unsubscribers.push(a);let l=u("backButtonClicked",()=>{t("back_button_clicked",{})});this.unsubscribers.push(l);let d=u("mainButtonClicked",()=>{t("main_button_clicked",{button_text:e?.MainButton?.text})});this.unsubscribers.push(d);let C=u("invoiceClosed",o=>{t("invoice_closed",{url:o?.url,status:o?.status})});this.unsubscribers.push(C);let N=u("popupClosed",o=>{t("popup_closed",{button_id:o?.button_id})});this.unsubscribers.push(N);let G=u("qrTextReceived",o=>{t("qr_text_received",{data:o?.data})});this.unsubscribers.push(G);let V=u("scanQrPopupClosed",()=>{t("scan_qr_popup_closed",{})});this.unsubscribers.push(V);let $=u("clipboardTextReceived",o=>{t("clipboard_text_received",{data:o?.data})});this.unsubscribers.push($);let Q=u("writeAccessRequested",o=>{t("write_access_requested",{status:o?.status})});this.unsubscribers.push(Q);let K=u("fileDownloadRequested",o=>{t("file_download_requested",{status:o?.status})});this.unsubscribers.push(K);let J=u("customMethodInvoked",o=>{t("custom_method_invoked",{req_id:o?.req_id,result:o?.result,error:o?.error})});this.unsubscribers.push(J);let Y=u("fullscreenChanged",o=>{t("fullscreen_changed",{is_fullscreen:o?.isFullscreen})});this.unsubscribers.push(Y);let Z=u("fullscreenFailed",o=>{t("fullscreen_failed",{error:o?.error})});this.unsubscribers.push(Z);let X=u("homeScreenAdded",()=>{t("home_screen_added",{})});this.unsubscribers.push(X);let ee=u("homeScreenChecked",o=>{t("home_screen_checked",{status:o?.status})});this.unsubscribers.push(ee);let te=u("preparedMessageSent",()=>{t("prepared_message_sent",{})});this.unsubscribers.push(te);let re=u("preparedMessageFailed",o=>{t("prepared_message_failed",{error:o?.error})});this.unsubscribers.push(re);let ne=u("emojiStatusSet",()=>{t("emoji_status_set",{})});this.unsubscribers.push(ne);let ie=u("emojiStatusFailed",o=>{t("emoji_status_failed",{error:o?.error})});this.unsubscribers.push(ie);let se=u("emojiStatusAccessRequested",o=>{t("emoji_status_access_requested",{status:o?.status})});this.unsubscribers.push(se);let oe=u("settingsButtonClicked",()=>{t("settings_button_clicked",{})});this.unsubscribers.push(oe);let ae=u("secondaryButtonClicked",()=>{t("secondary_button_clicked",{})});this.unsubscribers.push(ae);let ce=u("shareMessageSent",()=>{t("share_message_sent",{})});this.unsubscribers.push(ce);let ue=u("shareMessageFailed",o=>{t("share_message_failed",{error:o?.error})});this.unsubscribers.push(ue);let le=u("locationManagerUpdated",()=>{let o=e?.LocationManager;t("location_manager_updated",{is_inited:o?.isInited,is_location_available:o?.isLocationAvailable,is_access_requested:o?.isAccessRequested,is_access_granted:o?.isAccessGranted})});this.unsubscribers.push(le);let de=u("locationRequested",o=>{t("location_requested",{available:o?.available!==!1,latitude:o?.latitude,longitude:o?.longitude,altitude:o?.altitude,course:o?.course,speed:o?.speed,horizontal_accuracy:o?.horizontal_accuracy,vertical_accuracy:o?.vertical_accuracy,course_accuracy:o?.course_accuracy,speed_accuracy:o?.speed_accuracy})});this.unsubscribers.push(de);let he=u("accelerometerStarted",()=>{t("accelerometer_started",{})});this.unsubscribers.push(he);let pe=u("accelerometerStopped",()=>{t("accelerometer_stopped",{})});this.unsubscribers.push(pe);let ge=u("accelerometerChanged",()=>{let o=e?.Accelerometer;t("accelerometer_changed",{x:o?.x,y:o?.y,z:o?.z})});this.unsubscribers.push(ge);let fe=u("accelerometerFailed",o=>{t("accelerometer_failed",{error:o?.error})});this.unsubscribers.push(fe);let me=u("deviceOrientationStarted",()=>{t("device_orientation_started",{})});this.unsubscribers.push(me);let ve=u("deviceOrientationStopped",()=>{t("device_orientation_stopped",{})});this.unsubscribers.push(ve);let be=u("deviceOrientationChanged",()=>{let o=e?.DeviceOrientation;t("device_orientation_changed",{absolute:o?.absolute,alpha:o?.alpha,beta:o?.beta,gamma:o?.gamma})});this.unsubscribers.push(be);let ke=u("deviceOrientationFailed",o=>{t("device_orientation_failed",{error:o?.error})});this.unsubscribers.push(ke);let ye=u("gyroscopeStarted",()=>{t("gyroscope_started",{})});this.unsubscribers.push(ye);let _e=u("gyroscopeStopped",()=>{t("gyroscope_stopped",{})});this.unsubscribers.push(_e);let Te=u("gyroscopeChanged",()=>{let o=e?.Gyroscope;t("gyroscope_changed",{x:o?.x,y:o?.y,z:o?.z})});this.unsubscribers.push(Te);let Ee=u("gyroscopeFailed",o=>{t("gyroscope_failed",{error:o?.error})});this.unsubscribers.push(Ee);let we=u("contactRequested",o=>{t("contact_requested",{status:o?.status})});this.unsubscribers.push(we);let Le=u("activated",()=>{t("activated",{})});this.unsubscribers.push(Le);let Se=u("deactivated",()=>{t("deactivated",{})});this.unsubscribers.push(Se);let xe=u("biometricManagerUpdated",()=>{let o=e?.BiometricManager;t("biometric_manager_updated",{is_inited:o?.isInited,is_biometric_available:o?.isBiometricAvailable,biometric_type:o?.biometricType,is_access_requested:o?.isAccessRequested,is_access_granted:o?.isAccessGranted,is_biometric_token_saved:o?.isBiometricTokenSaved,device_id:o?.deviceId})});this.unsubscribers.push(xe);let Ce=u("biometricAuthRequested",o=>{t("biometric_auth_requested",{is_authenticated:o?.isAuthenticated,biometric_token:o?.biometricToken})});this.unsubscribers.push(Ce);let qe=u("biometricTokenUpdated",o=>{t("biometric_token_updated",{is_updated:o?.isUpdated})});this.unsubscribers.push(qe),this.patchWebAppMethods(e,t)}patchWebAppMethods(e,t){if(e&&!e.openLink?._dashgramPatched){if(e.openLink&&typeof e.openLink=="function"){let r=e.openLink.bind(e),n=(s,a)=>(t("open_link",{url:s,options:a}),r(s,a));n._dashgramPatched=!0,e.openLink=n}if(e.openTelegramLink&&typeof e.openTelegramLink=="function"){let r=e.openTelegramLink.bind(e),n=s=>(t("open_telegram_link",{url:s}),r(s));n._dashgramPatched=!0,e.openTelegramLink=n}if(e.switchInlineQuery&&typeof e.switchInlineQuery=="function"){let r=e.switchInlineQuery.bind(e),n=(s,a)=>(t("switch_inline_query",{query:s,choose_chat_types:a}),r(s,a));n._dashgramPatched=!0,e.switchInlineQuery=n}if(e.shareToStory&&typeof e.shareToStory=="function"){let r=e.shareToStory.bind(e),n=(s,a)=>(t("share_story",{media_url:s,params:a}),r(s,a));n._dashgramPatched=!0,e.shareToStory=n}if(e.close&&typeof e.close=="function"){let r=e.close.bind(e),n=s=>(t("webapp_close",{return_back:s?.return_back}),r(s));n._dashgramPatched=!0,e.close=n}if(e.exitFullscreen&&typeof e.exitFullscreen=="function"){let r=e.exitFullscreen.bind(e),n=()=>(t("webapp_exit_fullscreen",{}),r());n._dashgramPatched=!0,e.exitFullscreen=n}if(e.openInvoice&&typeof e.openInvoice=="function"){let r=e.openInvoice.bind(e),n=(s,a)=>(t("open_invoice",{slug:s}),r(s,a));n._dashgramPatched=!0,e.openInvoice=n}if(e.requestAccess&&typeof e.requestAccess=="function"){let r=e.requestAccess.bind(e),n=(s,a)=>(t("request_access",{access_type:s}),r(s,a));n._dashgramPatched=!0,e.requestAccess=n}if(e.requestContact&&typeof e.requestContact=="function"){let r=e.requestContact.bind(e),n=s=>(t("request_contact",{}),r(s));n._dashgramPatched=!0,e.requestContact=n}if(e.requestPhone&&typeof e.requestPhone=="function"){let r=e.requestPhone.bind(e),n=s=>(t("request_phone",{}),r(s));n._dashgramPatched=!0,e.requestPhone=n}if(e.requestLocation&&typeof e.requestLocation=="function"){let r=e.requestLocation.bind(e),n=s=>(t("request_location",{}),r(s));n._dashgramPatched=!0,e.requestLocation=n}if(e.checkLocation&&typeof e.checkLocation=="function"){let r=e.checkLocation.bind(e),n=s=>(t("check_location",{}),r(s));n._dashgramPatched=!0,e.checkLocation=n}}}};var D=class{constructor(){this.config=null;this.context=null;this.transport=null;this.batchProcessor=null;this.trackers=[];this.isInitialized=!1}init(i){if(this.isInitialized){i.debug&&console.warn("Dashgram: Already initialized");return}if(!z()){i.debug&&console.warn("Dashgram: Not running in browser environment");return}try{this.config=new b(i),typeof window<"u"&&(window.__DASHGRAM_DEBUG__=this.config.isDebug()),this.context=new y,this.transport=new T(this.config),this.batchProcessor=new w(this.config,this.transport),this.setupTrackers(),this.batchProcessor.start(),this.isInitialized=!0,this.log("Initialized successfully",{projectId:this.config.get("projectId"),trackLevel:this.config.getTrackLevel()})}catch(e){throw console.error("Dashgram: Initialization failed",e),e}}setupTrackers(){if(!this.config)return;let i=(n,s)=>{this.trackAuto(n,s)},e=new L(this.config,i);this.trackers.push(e),e.start();let t=new S(this.config,i);this.trackers.push(t),t.start();let r=new x(this.config,i);this.trackers.push(r),r.start()}track(i,e={}){this.ensureInitialized();let t=this.buildEvent(i,e,"manual");this.batchProcessor.addEvent(t),this.log("Tracked event",{event:i,properties:e})}trackAuto(i,e={}){if(!this.isInitialized)return;let t=this.buildEvent(i,e,"auto");this.batchProcessor.addEvent(t),this.log("Auto-tracked event",{event:i,properties:e})}buildEvent(i,e,t){return this.ensureInitialized(),{eventId:B(),type:i,initData:I(),properties:Object.keys(e).length>0?e:void 0,telemetry:this.context.getTelemetry(),source:t,level:this.config.getTrackLevel(),timestamp:Date.now()}}setTrackLevel(i){this.ensureInitialized();let e=this.config.getTrackLevel();this.config.setTrackLevel(i),this.trackers.forEach(t=>{t.stop(),t.start()}),this.log("Track level changed",{from:e,to:i})}async flush(){this.ensureInitialized(),await this.batchProcessor.flushAsync(),this.log("Flushed all events")}shutdown(){this.isInitialized&&(this.trackers.forEach(i=>i.stop()),this.trackers=[],this.batchProcessor.flush(),this.batchProcessor.stop(),this.isInitialized=!1,this.log("Shutdown complete"))}ensureInitialized(){if(!this.isInitialized)throw new Error("Dashgram: SDK not initialized. Call init() first.")}log(...i){this.config?.isDebug()&&console.log("[Dashgram SDK]",...i)}},j=new D;var We=j;return Ae(He);})();
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
export declare class DashgramError extends Error {
|
|
2
2
|
constructor(message: string);
|
|
3
3
|
}
|
|
4
|
-
export declare class InvalidCredentialsError extends DashgramError {
|
|
5
|
-
constructor(message?: string);
|
|
6
|
-
}
|
|
7
4
|
export declare class DashgramAPIError extends DashgramError {
|
|
8
5
|
statusCode: number;
|
|
9
6
|
details: string;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAUA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAUA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAQ5B;AAKD,qBAAa,gBAAiB,SAAQ,aAAa;IAC9B,UAAU,EAAE,MAAM;IAAS,OAAO,EAAE,MAAM;gBAA1C,UAAU,EAAE,MAAM,EAAS,OAAO,EAAE,MAAM;CAQ9D;AAKD,qBAAa,YAAa,SAAQ,aAAa;IAC1B,aAAa,EAAE,KAAK;gBAApB,aAAa,EAAE,KAAK;CAQxC;AAKD,qBAAa,0BAA2B,SAAQ,aAAa;gBAC/C,OAAO,EAAE,MAAM;CAQ5B"}
|
package/dist/errors.js
CHANGED
|
@@ -8,16 +8,6 @@ export class DashgramError extends Error {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
export class InvalidCredentialsError extends DashgramError {
|
|
12
|
-
constructor(message = "Invalid projectId or apiKey") {
|
|
13
|
-
super(message);
|
|
14
|
-
this.name = "InvalidCredentialsError";
|
|
15
|
-
const ErrorWithCapture = Error;
|
|
16
|
-
if (typeof ErrorWithCapture.captureStackTrace === "function") {
|
|
17
|
-
ErrorWithCapture.captureStackTrace(this, InvalidCredentialsError);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
11
|
export class DashgramAPIError extends DashgramError {
|
|
22
12
|
constructor(statusCode, details) {
|
|
23
13
|
super(`Dashgram API error (${statusCode}): ${details}`);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { DashgramConfig,
|
|
1
|
+
import type { DashgramConfig, WebAppEvent, EventProperties, TrackLevel } from "./types";
|
|
2
2
|
declare class DashgramSDK {
|
|
3
3
|
private config;
|
|
4
4
|
private context;
|
|
5
|
-
private session;
|
|
6
5
|
private transport;
|
|
7
6
|
private batchProcessor;
|
|
8
7
|
private trackers;
|
|
@@ -12,17 +11,15 @@ declare class DashgramSDK {
|
|
|
12
11
|
track(event: string, properties?: EventProperties): void;
|
|
13
12
|
private trackAuto;
|
|
14
13
|
private buildEvent;
|
|
15
|
-
identify(userId: string, traits?: UserTraits): void;
|
|
16
14
|
setTrackLevel(level: TrackLevel): void;
|
|
17
15
|
flush(): Promise<void>;
|
|
18
|
-
reset(): void;
|
|
19
16
|
shutdown(): void;
|
|
20
17
|
private ensureInitialized;
|
|
21
18
|
private log;
|
|
22
19
|
}
|
|
23
20
|
declare const DashgramMini: DashgramSDK;
|
|
24
|
-
export type { DashgramConfig,
|
|
25
|
-
export { DashgramError,
|
|
21
|
+
export type { DashgramConfig, WebAppEvent, EventProperties, TrackLevel };
|
|
22
|
+
export { DashgramError, DashgramAPIError, NetworkError, DashgramConfigurationError } from "./errors";
|
|
26
23
|
export { DashgramMini };
|
|
27
24
|
export default DashgramMini;
|
|
28
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAcvF,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAA4D;IAC5E,OAAO,CAAC,aAAa,CAAQ;IAK7B,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAiDtC,OAAO,CAAC,aAAa;IA0BrB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,eAAoB,GAAG,IAAI;IAY5D,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,UAAU;IAkBlB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAkBhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,QAAQ,IAAI,IAAI;IAqBhB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,GAAG;CAKZ;AAGD,QAAA,MAAM,YAAY,aAAoB,CAAA;AAGtC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,CAAA;AAGxE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAA;AAGpG,OAAO,EAAE,YAAY,EAAE,CAAA;AAGvB,eAAe,YAAY,CAAA"}
|