@powersync/service-module-postgres-storage 0.0.0-dev-20250811145516 → 0.0.0-dev-20250813075005
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/CHANGELOG.md +11 -9
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/storage/PostgresReportStorageFactory.d.ts +0 -2
- package/dist/storage/PostgresReportStorageFactory.js +7 -68
- package/dist/storage/PostgresReportStorageFactory.js.map +1 -1
- package/package.json +9 -9
- package/src/storage/PostgresReportStorageFactory.ts +7 -69
- package/test/src/__snapshots__/sdk-report-storage.test.ts.snap +12 -2
- package/test/src/sdk-report-storage.test.ts +10 -10
|
@@ -11,8 +11,6 @@ export declare class PostgresReportStorageFactory implements storage.ReportStora
|
|
|
11
11
|
readonly db: lib_postgres.DatabaseClient;
|
|
12
12
|
constructor(options: PostgresReportStorageOptions);
|
|
13
13
|
private parseJsDate;
|
|
14
|
-
private timeFrameQuery;
|
|
15
|
-
private timeFrameDeleteQuery;
|
|
16
14
|
private mapListCurrentConnectionsResponse;
|
|
17
15
|
private listConnectionsQuery;
|
|
18
16
|
private updateTableFilter;
|
|
@@ -32,65 +32,6 @@ export class PostgresReportStorageFactory {
|
|
|
32
32
|
parsedDate: date
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
timeFrameQuery(timeframe, interval = 1) {
|
|
36
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
37
|
-
const parsedIsoString = parsedDate.toISOString();
|
|
38
|
-
switch (timeframe) {
|
|
39
|
-
case 'month': {
|
|
40
|
-
return { lt: parsedIsoString, gt: new Date(year, parsedDate.getMonth() - interval - 1).toISOString() };
|
|
41
|
-
}
|
|
42
|
-
case 'week': {
|
|
43
|
-
const weekStartDate = new Date(parsedDate);
|
|
44
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
45
|
-
const weekStart = this.parseJsDate(weekStartDate);
|
|
46
|
-
return {
|
|
47
|
-
lt: parsedIsoString,
|
|
48
|
-
gt: new Date(weekStart.year, weekStart.month, weekStart.today).toISOString()
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
case 'hour': {
|
|
52
|
-
// Get the last hour from the current time
|
|
53
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
54
|
-
return {
|
|
55
|
-
lt: new Date(year, month, today, parsedDate.getHours()).toISOString(),
|
|
56
|
-
gt: new Date(year, month, today, previousHour).toISOString()
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
default: {
|
|
60
|
-
return {
|
|
61
|
-
lt: parsedIsoString,
|
|
62
|
-
gt: new Date(year, month, today - interval).toISOString()
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
timeFrameDeleteQuery(timeframe, interval = 1, test_date) {
|
|
68
|
-
const { year, month, today, parsedDate } = test_date ? this.parseJsDate(test_date) : this.parseJsDate(new Date());
|
|
69
|
-
switch (timeframe) {
|
|
70
|
-
case 'month': {
|
|
71
|
-
return { lt: new Date(year, parsedDate.getMonth() - interval).toISOString() };
|
|
72
|
-
}
|
|
73
|
-
case 'week': {
|
|
74
|
-
const weekStartDate = new Date(parsedDate);
|
|
75
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
76
|
-
const { month, year, today } = this.parseJsDate(weekStartDate);
|
|
77
|
-
return {
|
|
78
|
-
lt: new Date(year, month, today).toISOString()
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case 'hour': {
|
|
82
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
83
|
-
return {
|
|
84
|
-
lt: new Date(year, month, today, previousHour).toISOString()
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
default: {
|
|
88
|
-
return {
|
|
89
|
-
lt: new Date(year, month, today - interval).toISOString()
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
35
|
mapListCurrentConnectionsResponse(result) {
|
|
95
36
|
if (!result) {
|
|
96
37
|
return {
|
|
@@ -164,7 +105,7 @@ export class PostgresReportStorageFactory {
|
|
|
164
105
|
WHERE
|
|
165
106
|
disconnect_at IS NULL
|
|
166
107
|
AND jwt_exp > NOW()
|
|
167
|
-
AND connect_at
|
|
108
|
+
AND connect_at >= ${{ type: 1184, value: gt }}
|
|
168
109
|
AND connect_at <= ${{ type: 1184, value: lt }}
|
|
169
110
|
),
|
|
170
111
|
unique_users AS (
|
|
@@ -273,8 +214,7 @@ export class PostgresReportStorageFactory {
|
|
|
273
214
|
return this.mapListCurrentConnectionsResponse(result);
|
|
274
215
|
}
|
|
275
216
|
async scrapeSdkData(data) {
|
|
276
|
-
const {
|
|
277
|
-
const { lt, gt } = this.timeFrameQuery(timeframe, interval);
|
|
217
|
+
const { start, end } = data;
|
|
278
218
|
const result = await this.db.sql `
|
|
279
219
|
WITH
|
|
280
220
|
filtered AS (
|
|
@@ -283,8 +223,8 @@ export class PostgresReportStorageFactory {
|
|
|
283
223
|
FROM
|
|
284
224
|
sdk_report_events
|
|
285
225
|
WHERE
|
|
286
|
-
connect_at
|
|
287
|
-
AND connect_at <= ${{ type: 1184, value:
|
|
226
|
+
connect_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
227
|
+
AND connect_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
288
228
|
),
|
|
289
229
|
unique_users AS (
|
|
290
230
|
SELECT
|
|
@@ -321,12 +261,11 @@ export class PostgresReportStorageFactory {
|
|
|
321
261
|
return this.mapListCurrentConnectionsResponse(result);
|
|
322
262
|
}
|
|
323
263
|
async deleteOldSdkData(data) {
|
|
324
|
-
const {
|
|
325
|
-
const { lt } = this.timeFrameDeleteQuery(timeframe, interval);
|
|
264
|
+
const { date } = data;
|
|
326
265
|
const result = await this.db.sql `
|
|
327
266
|
DELETE FROM sdk_report_events
|
|
328
267
|
WHERE
|
|
329
|
-
connect_at < ${{ type: 1184, value:
|
|
268
|
+
connect_at < ${{ type: 1184, value: date.toISOString() }}
|
|
330
269
|
AND (
|
|
331
270
|
disconnect_at IS NOT NULL
|
|
332
271
|
OR (
|
|
@@ -337,7 +276,7 @@ export class PostgresReportStorageFactory {
|
|
|
337
276
|
`.execute();
|
|
338
277
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
339
278
|
if (deletedRows > 0) {
|
|
340
|
-
logger.info(`TTL ${
|
|
279
|
+
logger.info(`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from sdk_report_events.`);
|
|
341
280
|
}
|
|
342
281
|
}
|
|
343
282
|
async [Symbol.asyncDispose]() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAUhE,OAAO,EAAE,YAAY,EAAuB,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAMrD,MAAM,OAAO,4BAA4B;IAEjB;IADb,EAAE,CAA8B;IACzC,YAAsB,OAAqC;QAArC,YAAO,GAAP,OAAO,CAA8B;QACzD,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,mBAAmB;YAC3B,eAAe,EAAE,yBAAyB,EAAE;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC;YACvB,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,IAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI;YACJ,KAAK;YACL,KAAK;YACL,GAAG;YACH,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@powersync/service-module-postgres-storage",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
4
|
"types": "dist/@types/index.d.ts",
|
|
5
|
-
"version": "0.0.0-dev-
|
|
5
|
+
"version": "0.0.0-dev-20250813075005",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"publishConfig": {
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"p-defer": "^4.0.1",
|
|
29
29
|
"ts-codec": "^1.3.0",
|
|
30
30
|
"uuid": "^11.1.0",
|
|
31
|
-
"@powersync/lib-service-postgres": "0.0.0-dev-
|
|
32
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
33
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
34
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
35
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
36
|
-
"@powersync/service-jpgwire": "0.0.0-dev-
|
|
37
|
-
"@powersync/service-jsonbig": "0.0.0-dev-
|
|
38
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
31
|
+
"@powersync/lib-service-postgres": "0.0.0-dev-20250813075005",
|
|
32
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250813075005",
|
|
33
|
+
"@powersync/service-core": "0.0.0-dev-20250813075005",
|
|
34
|
+
"@powersync/service-types": "0.0.0-dev-20250813075005",
|
|
35
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250813075005",
|
|
36
|
+
"@powersync/service-jpgwire": "0.0.0-dev-20250813075005",
|
|
37
|
+
"@powersync/service-jsonbig": "0.0.0-dev-20250813075005",
|
|
38
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20250813075005"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"typescript": "^5.7.3"
|
|
@@ -49,66 +49,6 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
49
49
|
parsedDate: date
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
private timeFrameQuery(timeframe: event_types.TimeFrames, interval: number = 1) {
|
|
53
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
54
|
-
const parsedIsoString = parsedDate.toISOString();
|
|
55
|
-
switch (timeframe) {
|
|
56
|
-
case 'month': {
|
|
57
|
-
return { lt: parsedIsoString, gt: new Date(year, parsedDate.getMonth() - interval - 1).toISOString() };
|
|
58
|
-
}
|
|
59
|
-
case 'week': {
|
|
60
|
-
const weekStartDate = new Date(parsedDate);
|
|
61
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
62
|
-
const weekStart = this.parseJsDate(weekStartDate);
|
|
63
|
-
return {
|
|
64
|
-
lt: parsedIsoString,
|
|
65
|
-
gt: new Date(weekStart.year, weekStart.month, weekStart.today).toISOString()
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
case 'hour': {
|
|
69
|
-
// Get the last hour from the current time
|
|
70
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
71
|
-
return {
|
|
72
|
-
lt: new Date(year, month, today, parsedDate.getHours()).toISOString(),
|
|
73
|
-
gt: new Date(year, month, today, previousHour).toISOString()
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
default: {
|
|
77
|
-
return {
|
|
78
|
-
lt: parsedIsoString,
|
|
79
|
-
gt: new Date(year, month, today - interval).toISOString()
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
private timeFrameDeleteQuery(timeframe: event_types.TimeFrames, interval: number = 1, test_date?: Date) {
|
|
86
|
-
const { year, month, today, parsedDate } = test_date ? this.parseJsDate(test_date) : this.parseJsDate(new Date());
|
|
87
|
-
switch (timeframe) {
|
|
88
|
-
case 'month': {
|
|
89
|
-
return { lt: new Date(year, parsedDate.getMonth() - interval).toISOString() };
|
|
90
|
-
}
|
|
91
|
-
case 'week': {
|
|
92
|
-
const weekStartDate = new Date(parsedDate);
|
|
93
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
94
|
-
const { month, year, today } = this.parseJsDate(weekStartDate);
|
|
95
|
-
return {
|
|
96
|
-
lt: new Date(year, month, today).toISOString()
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
case 'hour': {
|
|
100
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
101
|
-
return {
|
|
102
|
-
lt: new Date(year, month, today, previousHour).toISOString()
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
default: {
|
|
106
|
-
return {
|
|
107
|
-
lt: new Date(year, month, today - interval).toISOString()
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
52
|
|
|
113
53
|
private mapListCurrentConnectionsResponse(result: SdkReportingDecoded | null): ListCurrentConnections {
|
|
114
54
|
if (!result) {
|
|
@@ -183,7 +123,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
183
123
|
WHERE
|
|
184
124
|
disconnect_at IS NULL
|
|
185
125
|
AND jwt_exp > NOW()
|
|
186
|
-
AND connect_at
|
|
126
|
+
AND connect_at >= ${{ type: 1184, value: gt }}
|
|
187
127
|
AND connect_at <= ${{ type: 1184, value: lt }}
|
|
188
128
|
),
|
|
189
129
|
unique_users AS (
|
|
@@ -295,8 +235,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
295
235
|
}
|
|
296
236
|
|
|
297
237
|
async scrapeSdkData(data: ScrapeSdkDataRequest): Promise<ListCurrentConnections> {
|
|
298
|
-
const {
|
|
299
|
-
const { lt, gt } = this.timeFrameQuery(timeframe, interval);
|
|
238
|
+
const { start, end } = data;
|
|
300
239
|
const result = await this.db.sql`
|
|
301
240
|
WITH
|
|
302
241
|
filtered AS (
|
|
@@ -305,8 +244,8 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
305
244
|
FROM
|
|
306
245
|
sdk_report_events
|
|
307
246
|
WHERE
|
|
308
|
-
connect_at
|
|
309
|
-
AND connect_at <= ${{ type: 1184, value:
|
|
247
|
+
connect_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
248
|
+
AND connect_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
310
249
|
),
|
|
311
250
|
unique_users AS (
|
|
312
251
|
SELECT
|
|
@@ -343,12 +282,11 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
343
282
|
return this.mapListCurrentConnectionsResponse(result);
|
|
344
283
|
}
|
|
345
284
|
async deleteOldSdkData(data: DeleteOldSdkData): Promise<void> {
|
|
346
|
-
const {
|
|
347
|
-
const { lt } = this.timeFrameDeleteQuery(timeframe, interval);
|
|
285
|
+
const { date } = data;
|
|
348
286
|
const result = await this.db.sql`
|
|
349
287
|
DELETE FROM sdk_report_events
|
|
350
288
|
WHERE
|
|
351
|
-
connect_at < ${{ type: 1184, value:
|
|
289
|
+
connect_at < ${{ type: 1184, value: date.toISOString() }}
|
|
352
290
|
AND (
|
|
353
291
|
disconnect_at IS NOT NULL
|
|
354
292
|
OR (
|
|
@@ -360,7 +298,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorageFactor
|
|
|
360
298
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
361
299
|
if (deletedRows > 0) {
|
|
362
300
|
logger.info(
|
|
363
|
-
`TTL ${
|
|
301
|
+
`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from sdk_report_events.`
|
|
364
302
|
);
|
|
365
303
|
}
|
|
366
304
|
}
|
|
@@ -40,8 +40,13 @@ exports[`SDK reporting storage > Should delete rows older than specified range 1
|
|
|
40
40
|
"sdk": "powersync-js/1.21.4",
|
|
41
41
|
"users": 1,
|
|
42
42
|
},
|
|
43
|
+
{
|
|
44
|
+
"clients": 1,
|
|
45
|
+
"sdk": "powersync-js/1.24.5",
|
|
46
|
+
"users": 1,
|
|
47
|
+
},
|
|
43
48
|
],
|
|
44
|
-
"users":
|
|
49
|
+
"users": 5,
|
|
45
50
|
}
|
|
46
51
|
`;
|
|
47
52
|
|
|
@@ -134,8 +139,13 @@ exports[`SDK reporting storage > Should show SDK scrape data for user over the p
|
|
|
134
139
|
"sdk": "powersync-js/1.21.4",
|
|
135
140
|
"users": 1,
|
|
136
141
|
},
|
|
142
|
+
{
|
|
143
|
+
"clients": 1,
|
|
144
|
+
"sdk": "powersync-js/1.24.5",
|
|
145
|
+
"users": 1,
|
|
146
|
+
},
|
|
137
147
|
],
|
|
138
|
-
"users":
|
|
148
|
+
"users": 5,
|
|
139
149
|
}
|
|
140
150
|
`;
|
|
141
151
|
|
|
@@ -28,6 +28,7 @@ describe('SDK reporting storage', async () => {
|
|
|
28
28
|
now.getHours(),
|
|
29
29
|
now.getMinutes() - 5
|
|
30
30
|
);
|
|
31
|
+
const dayAgo = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1, now.getHours());
|
|
31
32
|
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
|
|
32
33
|
const weekAgo = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);
|
|
33
34
|
const monthAgo = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate());
|
|
@@ -228,22 +229,22 @@ describe('SDK reporting storage', async () => {
|
|
|
228
229
|
});
|
|
229
230
|
it('Should show SDK scrape data for user over the past month', async () => {
|
|
230
231
|
const sdk = await factory.scrapeSdkData({
|
|
231
|
-
|
|
232
|
-
|
|
232
|
+
start: monthAgo,
|
|
233
|
+
end: now
|
|
233
234
|
});
|
|
234
235
|
expect(sdk).toMatchSnapshot();
|
|
235
236
|
});
|
|
236
237
|
it('Should show SDK scrape data for user over the past week', async () => {
|
|
237
238
|
const sdk = await factory.scrapeSdkData({
|
|
238
|
-
|
|
239
|
-
|
|
239
|
+
start: weekAgo,
|
|
240
|
+
end: now
|
|
240
241
|
});
|
|
241
242
|
expect(sdk).toMatchSnapshot();
|
|
242
243
|
});
|
|
243
244
|
it('Should show SDK scrape data for user over the past day', async () => {
|
|
244
245
|
const sdk = await factory.scrapeSdkData({
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
start: dayAgo,
|
|
247
|
+
end: now
|
|
247
248
|
});
|
|
248
249
|
expect(sdk).toMatchSnapshot();
|
|
249
250
|
});
|
|
@@ -327,12 +328,11 @@ describe('SDK reporting storage', async () => {
|
|
|
327
328
|
await deleteData();
|
|
328
329
|
await loadData();
|
|
329
330
|
await factory.deleteOldSdkData({
|
|
330
|
-
|
|
331
|
-
timeframe: 'week'
|
|
331
|
+
date: weekAgo
|
|
332
332
|
});
|
|
333
333
|
const sdk = await factory.scrapeSdkData({
|
|
334
|
-
|
|
335
|
-
|
|
334
|
+
start: monthAgo,
|
|
335
|
+
end: now
|
|
336
336
|
});
|
|
337
337
|
expect(sdk).toMatchSnapshot();
|
|
338
338
|
});
|