@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.
@@ -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 > ${{ type: 1184, value: gt }}
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 { timeframe, interval } = data;
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 > ${{ type: 1184, value: gt }}
287
- AND connect_at <= ${{ type: 1184, value: lt }}
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 { timeframe, interval } = data;
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: lt }}
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 ${interval}/${timeframe}: ${deletedRows} PostgresSQL rows have been removed from sdk_report_events.`);
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":"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"}
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-20250811145516",
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-20250811145516",
32
- "@powersync/lib-services-framework": "0.0.0-dev-20250811145516",
33
- "@powersync/service-core": "0.0.0-dev-20250811145516",
34
- "@powersync/service-types": "0.0.0-dev-20250811145516",
35
- "@powersync/service-core-tests": "0.0.0-dev-20250811145516",
36
- "@powersync/service-jpgwire": "0.0.0-dev-20250811145516",
37
- "@powersync/service-jsonbig": "0.0.0-dev-20250811145516",
38
- "@powersync/service-sync-rules": "0.0.0-dev-20250811145516"
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 > ${{ type: 1184, value: gt }}
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 { timeframe, interval } = data;
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 > ${{ type: 1184, value: gt }}
309
- AND connect_at <= ${{ type: 1184, value: lt }}
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 { timeframe, interval } = data;
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: lt }}
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 ${interval}/${timeframe}: ${deletedRows} PostgresSQL rows have been removed from sdk_report_events.`
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": 4,
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": 4,
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
- interval: 1,
232
- timeframe: 'month'
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
- interval: 1,
239
- timeframe: 'week'
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
- interval: 1,
246
- timeframe: 'day'
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
- interval: 1,
331
- timeframe: 'week'
331
+ date: weekAgo
332
332
  });
333
333
  const sdk = await factory.scrapeSdkData({
334
- interval: 1,
335
- timeframe: 'month'
334
+ start: monthAgo,
335
+ end: now
336
336
  });
337
337
  expect(sdk).toMatchSnapshot();
338
338
  });