@powersync/service-module-postgres-storage 0.0.0-dev-20250818104041 → 0.0.0-dev-20250820110726
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 +10 -9
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/storage/PostgresReportStorageFactory.d.ts +6 -6
- package/dist/migrations/scripts/1684951997326-init.js +7 -5
- package/dist/migrations/scripts/1684951997326-init.js.map +1 -1
- package/dist/storage/PostgresReportStorageFactory.js +13 -13
- package/dist/storage/PostgresReportStorageFactory.js.map +1 -1
- package/dist/utils/db.js +1 -1
- package/dist/utils/db.js.map +1 -1
- package/package.json +10 -10
- package/src/migrations/scripts/1684951997326-init.ts +7 -5
- package/src/storage/PostgresReportStorageFactory.ts +17 -23
- package/src/utils/db.ts +1 -1
- package/test/src/__snapshots__/{sdk-report-storage.test.ts.snap → connection-report-storage.test.ts.snap} +70 -31
- package/test/src/__snapshots__/storage_sync.test.ts.snap +197 -0
- package/test/src/{sdk-report-storage.test.ts → connection-report-storage.test.ts} +23 -23
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { storage } from '@powersync/service-core';
|
|
2
2
|
import * as pg_wire from '@powersync/service-jpgwire';
|
|
3
|
+
import { event_types } from '@powersync/service-types';
|
|
3
4
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
4
5
|
import { NormalizedPostgresStorageConfig } from '../types/types.js';
|
|
5
|
-
import { DeleteOldSdkData, ListCurrentConnectionsRequest, ScrapeSdkDataRequest, SdkConnectBucketData, SdkConnections, SdkDisconnectEventData } from '@powersync/service-types/src/events.js';
|
|
6
6
|
export type PostgresReportStorageOptions = {
|
|
7
7
|
config: NormalizedPostgresStorageConfig;
|
|
8
8
|
};
|
|
@@ -14,11 +14,11 @@ export declare class PostgresReportStorageFactory implements storage.ReportStora
|
|
|
14
14
|
private mapListCurrentConnectionsResponse;
|
|
15
15
|
private listConnectionsQuery;
|
|
16
16
|
private updateTableFilter;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
reportClientConnection(data: event_types.ClientConnectionBucketData): Promise<void>;
|
|
18
|
+
reportClientDisconnection(data: event_types.ClientDisconnectionEventData): Promise<void>;
|
|
19
|
+
getConnectedClients(data: event_types.ClientConnectionsRequest): Promise<event_types.ClientConnectionReport>;
|
|
20
|
+
getClientConnectionReports(data: event_types.ClientConnectionReportRequest): Promise<event_types.ClientConnectionReport>;
|
|
21
|
+
deleteOldConnectionData(data: event_types.DeleteOldConnectionData): Promise<void>;
|
|
22
22
|
[Symbol.asyncDispose](): Promise<void>;
|
|
23
23
|
prepareStatements(connection: pg_wire.PgConnection): Promise<void>;
|
|
24
24
|
}
|
|
@@ -165,7 +165,7 @@ export const up = async (context) => {
|
|
|
165
165
|
);
|
|
166
166
|
`.execute();
|
|
167
167
|
await db.sql `
|
|
168
|
-
CREATE TABLE
|
|
168
|
+
CREATE TABLE connection_report_events (
|
|
169
169
|
id TEXT PRIMARY KEY,
|
|
170
170
|
user_agent TEXT NOT NULL,
|
|
171
171
|
client_id TEXT NOT NULL,
|
|
@@ -176,10 +176,12 @@ export const up = async (context) => {
|
|
|
176
176
|
disconnected_at TIMESTAMP WITH TIME ZONE
|
|
177
177
|
)
|
|
178
178
|
`.execute();
|
|
179
|
-
await db.sql `
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
await db.sql `CREATE INDEX
|
|
179
|
+
await db.sql `
|
|
180
|
+
CREATE INDEX sdk_list_index ON connection_report_events (connected_at, jwt_exp, disconnected_at)
|
|
181
|
+
`.execute();
|
|
182
|
+
await db.sql `CREATE INDEX sdk_user_id_index ON connection_report_events (user_id)`.execute();
|
|
183
|
+
await db.sql `CREATE INDEX sdk_client_id_index ON connection_report_events (client_id)`.execute();
|
|
184
|
+
await db.sql `CREATE INDEX sdk_index ON connection_report_events (sdk)`.execute();
|
|
183
185
|
});
|
|
184
186
|
}
|
|
185
187
|
catch (e_1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"1684951997326-init.js","sourceRoot":"","sources":["../../../src/migrations/scripts/1684951997326-init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;;;QACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;QACZ,MAAY,MAAM,kCAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,OAAA,CAAC;QAE5D;;;WAGG;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,CAAC,GAAG,CAAA;;;;KAIX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;KAIX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;KAeX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,8CAA8C,CAAC,OAAO,EAAE,CAAC;YAErE,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;KAeX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;KAWX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;KAEX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;KAEX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;KAUX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;KAaX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,0EAA0E,CAAC,OAAO,EAAE,CAAC;YAEjG,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;KAMX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;KAOX,CAAC,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;KAWX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,
|
|
1
|
+
{"version":3,"file":"1684951997326-init.js","sourceRoot":"","sources":["../../../src/migrations/scripts/1684951997326-init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;;;QACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;QACZ,MAAY,MAAM,kCAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,OAAA,CAAC;QAE5D;;;WAGG;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,CAAC,GAAG,CAAA;;;;KAIX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;KAIX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;KAeX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,8CAA8C,CAAC,OAAO,EAAE,CAAC;YAErE,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;KAeX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;KAWX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;KAEX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;KAEX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;KAUX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;;KAaX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,0EAA0E,CAAC,OAAO,EAAE,CAAC;YAEjG,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;KAMX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;KAOX,CAAC,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;KAWX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;KAEX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,sEAAsE,CAAC,OAAO,EAAE,CAAC;YAE7F,MAAM,EAAE,CAAC,GAAG,CAAA,0EAA0E,CAAC,OAAO,EAAE,CAAC;YAEjG,MAAM,EAAE,CAAC,GAAG,CAAA,0DAA0D,CAAC,OAAO,EAAE,CAAC;QACnF,CAAC,CAAC,CAAC;;;;;;;;;;;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;;;QAC3E,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;QACZ,MAAY,MAAM,kCAAG,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,OAAA,CAAC;QAC5D,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;;;;;;;;;;;CAC1B,CAAC"}
|
|
@@ -53,7 +53,7 @@ export class PostgresReportStorageFactory {
|
|
|
53
53
|
SELECT
|
|
54
54
|
*
|
|
55
55
|
FROM
|
|
56
|
-
|
|
56
|
+
connection_report_events
|
|
57
57
|
WHERE
|
|
58
58
|
disconnected_at IS NULL
|
|
59
59
|
AND jwt_exp > NOW()
|
|
@@ -101,7 +101,7 @@ export class PostgresReportStorageFactory {
|
|
|
101
101
|
SELECT
|
|
102
102
|
*
|
|
103
103
|
FROM
|
|
104
|
-
|
|
104
|
+
connection_report_events
|
|
105
105
|
WHERE
|
|
106
106
|
disconnected_at IS NULL
|
|
107
107
|
AND jwt_exp > NOW()
|
|
@@ -149,14 +149,14 @@ export class PostgresReportStorageFactory {
|
|
|
149
149
|
lt: new Date(year, month, nextDay).toISOString()
|
|
150
150
|
};
|
|
151
151
|
}
|
|
152
|
-
async
|
|
152
|
+
async reportClientConnection(data) {
|
|
153
153
|
const { sdk, connected_at, user_id, user_agent, jwt_exp, client_id } = data;
|
|
154
154
|
const connectIsoString = connected_at.toISOString();
|
|
155
155
|
const jwtExpIsoString = jwt_exp.toISOString();
|
|
156
156
|
const { gte, lt } = this.updateTableFilter();
|
|
157
157
|
const uuid = v4();
|
|
158
158
|
const result = await this.db.sql `
|
|
159
|
-
UPDATE
|
|
159
|
+
UPDATE connection_report_events
|
|
160
160
|
SET
|
|
161
161
|
connected_at = ${{ type: 1184, value: connectIsoString }},
|
|
162
162
|
sdk = ${{ type: 'varchar', value: sdk }},
|
|
@@ -172,7 +172,7 @@ export class PostgresReportStorageFactory {
|
|
|
172
172
|
if (result.results[1].status === 'UPDATE 0') {
|
|
173
173
|
await this.db.sql `
|
|
174
174
|
INSERT INTO
|
|
175
|
-
|
|
175
|
+
connection_report_events (
|
|
176
176
|
user_id,
|
|
177
177
|
client_id,
|
|
178
178
|
connected_at,
|
|
@@ -194,12 +194,12 @@ export class PostgresReportStorageFactory {
|
|
|
194
194
|
`.execute();
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
-
async
|
|
197
|
+
async reportClientDisconnection(data) {
|
|
198
198
|
const { user_id, client_id, disconnected_at, connected_at } = data;
|
|
199
199
|
const disconnectIsoString = disconnected_at.toISOString();
|
|
200
200
|
const connectIsoString = connected_at.toISOString();
|
|
201
201
|
await this.db.sql `
|
|
202
|
-
UPDATE
|
|
202
|
+
UPDATE connection_report_events
|
|
203
203
|
SET
|
|
204
204
|
disconnected_at = ${{ type: 1184, value: disconnectIsoString }},
|
|
205
205
|
jwt_exp = NULL
|
|
@@ -209,11 +209,11 @@ export class PostgresReportStorageFactory {
|
|
|
209
209
|
AND connected_at = ${{ type: 1184, value: connectIsoString }}
|
|
210
210
|
`.execute();
|
|
211
211
|
}
|
|
212
|
-
async
|
|
212
|
+
async getConnectedClients(data) {
|
|
213
213
|
const result = await this.listConnectionsQuery(data);
|
|
214
214
|
return this.mapListCurrentConnectionsResponse(result);
|
|
215
215
|
}
|
|
216
|
-
async
|
|
216
|
+
async getClientConnectionReports(data) {
|
|
217
217
|
const { start, end } = data;
|
|
218
218
|
const result = await this.db.sql `
|
|
219
219
|
WITH
|
|
@@ -221,7 +221,7 @@ export class PostgresReportStorageFactory {
|
|
|
221
221
|
SELECT
|
|
222
222
|
*
|
|
223
223
|
FROM
|
|
224
|
-
|
|
224
|
+
connection_report_events
|
|
225
225
|
WHERE
|
|
226
226
|
connected_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
227
227
|
AND connected_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
@@ -260,10 +260,10 @@ export class PostgresReportStorageFactory {
|
|
|
260
260
|
.first();
|
|
261
261
|
return this.mapListCurrentConnectionsResponse(result);
|
|
262
262
|
}
|
|
263
|
-
async
|
|
263
|
+
async deleteOldConnectionData(data) {
|
|
264
264
|
const { date } = data;
|
|
265
265
|
const result = await this.db.sql `
|
|
266
|
-
DELETE FROM
|
|
266
|
+
DELETE FROM connection_report_events
|
|
267
267
|
WHERE
|
|
268
268
|
connected_at < ${{ type: 1184, value: date.toISOString() }}
|
|
269
269
|
AND (
|
|
@@ -276,7 +276,7 @@ export class PostgresReportStorageFactory {
|
|
|
276
276
|
`.execute();
|
|
277
277
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
278
278
|
if (deletedRows > 0) {
|
|
279
|
-
logger.info(`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from
|
|
279
|
+
logger.info(`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from connection_report_events.`);
|
|
280
280
|
}
|
|
281
281
|
}
|
|
282
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;
|
|
1
|
+
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/db.js
CHANGED
|
@@ -19,7 +19,7 @@ export const dropTables = async (client) => {
|
|
|
19
19
|
await db.sql `DROP TABLE IF EXISTS custom_write_checkpoints`.execute();
|
|
20
20
|
await db.sql `DROP SEQUENCE IF EXISTS op_id_sequence`.execute();
|
|
21
21
|
await db.sql `DROP SEQUENCE IF EXISTS sync_rules_id_sequence`.execute();
|
|
22
|
-
await db.sql `DROP TABLE IF EXISTS
|
|
22
|
+
await db.sql `DROP TABLE IF EXISTS connection_report_events`.execute();
|
|
23
23
|
});
|
|
24
24
|
};
|
|
25
25
|
//# sourceMappingURL=db.js.map
|
package/dist/utils/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/utils/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAEhE,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAmC,EAAE,EAAE;IACtE,sDAAsD;IACtD,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC,GAAG,CAAA,kCAAkC,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,iCAAiC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,EAAE,CAAC,GAAG,CAAA,+BAA+B,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,EAAE,CAAC,GAAG,CAAA,kCAAkC,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,EAAE,CAAC,GAAG,CAAA,mCAAmC,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,EAAE,CAAC,GAAG,CAAA,oCAAoC,CAAC,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,+CAA+C,CAAC,OAAO,EAAE,CAAC;QACtE,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,gDAAgD,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,EAAE,CAAC,GAAG,CAAA,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/utils/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAEhE,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAmC,EAAE,EAAE;IACtE,sDAAsD;IACtD,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC,GAAG,CAAA,kCAAkC,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,iCAAiC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,EAAE,CAAC,GAAG,CAAA,+BAA+B,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,EAAE,CAAC,GAAG,CAAA,kCAAkC,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,EAAE,CAAC,GAAG,CAAA,mCAAmC,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,EAAE,CAAC,GAAG,CAAA,oCAAoC,CAAC,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,+CAA+C,CAAC,OAAO,EAAE,CAAC;QACtE,MAAM,EAAE,CAAC,GAAG,CAAA,wCAAwC,CAAC,OAAO,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,GAAG,CAAA,gDAAgD,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,EAAE,CAAC,GAAG,CAAA,+CAA+C,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
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-20250820110726",
|
|
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-20250820110726",
|
|
32
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250820110726",
|
|
33
|
+
"@powersync/service-core": "0.0.0-dev-20250820110726",
|
|
34
|
+
"@powersync/service-types": "0.0.0-dev-20250820110726",
|
|
35
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250820110726",
|
|
36
|
+
"@powersync/service-jpgwire": "0.0.0-dev-20250820110726",
|
|
37
|
+
"@powersync/service-jsonbig": "0.0.0-dev-20250820110726",
|
|
38
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20250820110726"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"typescript": "^5.7.3"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"scripts": {
|
|
44
44
|
"build": "tsc -b",
|
|
45
45
|
"build:tests": "tsc -b test/tsconfig.json",
|
|
46
|
-
"clean": "rm -rf ./
|
|
46
|
+
"clean": "rm -rf ./dist && tsc -b --clean",
|
|
47
47
|
"test": "vitest"
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -129,7 +129,7 @@ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
|
129
129
|
);
|
|
130
130
|
`.execute();
|
|
131
131
|
await db.sql`
|
|
132
|
-
CREATE TABLE
|
|
132
|
+
CREATE TABLE connection_report_events (
|
|
133
133
|
id TEXT PRIMARY KEY,
|
|
134
134
|
user_agent TEXT NOT NULL,
|
|
135
135
|
client_id TEXT NOT NULL,
|
|
@@ -141,13 +141,15 @@ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
|
141
141
|
)
|
|
142
142
|
`.execute();
|
|
143
143
|
|
|
144
|
-
await db.sql`
|
|
144
|
+
await db.sql`
|
|
145
|
+
CREATE INDEX sdk_list_index ON connection_report_events (connected_at, jwt_exp, disconnected_at)
|
|
146
|
+
`.execute();
|
|
145
147
|
|
|
146
|
-
await db.sql`CREATE INDEX sdk_user_id_index ON
|
|
148
|
+
await db.sql`CREATE INDEX sdk_user_id_index ON connection_report_events (user_id)`.execute();
|
|
147
149
|
|
|
148
|
-
await db.sql`CREATE INDEX sdk_client_id_index ON
|
|
150
|
+
await db.sql`CREATE INDEX sdk_client_id_index ON connection_report_events (client_id)`.execute();
|
|
149
151
|
|
|
150
|
-
await db.sql`CREATE INDEX sdk_index ON
|
|
152
|
+
await db.sql`CREATE INDEX sdk_index ON connection_report_events (sdk)`.execute();
|
|
151
153
|
});
|
|
152
154
|
};
|
|
153
155
|
|
|
@@ -4,14 +4,6 @@ import { event_types } from '@powersync/service-types';
|
|
|
4
4
|
import { v4 } from 'uuid';
|
|
5
5
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
6
6
|
import { NormalizedPostgresStorageConfig } from '../types/types.js';
|
|
7
|
-
import {
|
|
8
|
-
DeleteOldSdkData,
|
|
9
|
-
ListCurrentConnectionsRequest,
|
|
10
|
-
ScrapeSdkDataRequest,
|
|
11
|
-
SdkConnectBucketData,
|
|
12
|
-
SdkConnections,
|
|
13
|
-
SdkDisconnectEventData
|
|
14
|
-
} from '@powersync/service-types/src/events.js';
|
|
15
7
|
import { SdkReporting, SdkReportingDecoded } from '../types/models/SdkReporting.js';
|
|
16
8
|
import { toInteger } from 'ix/util/tointeger.js';
|
|
17
9
|
import { logger } from '@powersync/lib-services-framework';
|
|
@@ -50,7 +42,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
50
42
|
};
|
|
51
43
|
}
|
|
52
44
|
|
|
53
|
-
private mapListCurrentConnectionsResponse(result: SdkReportingDecoded | null):
|
|
45
|
+
private mapListCurrentConnectionsResponse(result: SdkReportingDecoded | null): event_types.ClientConnectionReport {
|
|
54
46
|
if (!result) {
|
|
55
47
|
return {
|
|
56
48
|
users: 0,
|
|
@@ -62,7 +54,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
62
54
|
sdks: result.sdks?.data || []
|
|
63
55
|
};
|
|
64
56
|
}
|
|
65
|
-
private async listConnectionsQuery(data: event_types.
|
|
57
|
+
private async listConnectionsQuery(data: event_types.ClientConnectionsRequest) {
|
|
66
58
|
const { range } = data;
|
|
67
59
|
if (!range) {
|
|
68
60
|
return this.db.sql`
|
|
@@ -71,7 +63,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
71
63
|
SELECT
|
|
72
64
|
*
|
|
73
65
|
FROM
|
|
74
|
-
|
|
66
|
+
connection_report_events
|
|
75
67
|
WHERE
|
|
76
68
|
disconnected_at IS NULL
|
|
77
69
|
AND jwt_exp > NOW()
|
|
@@ -119,7 +111,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
119
111
|
SELECT
|
|
120
112
|
*
|
|
121
113
|
FROM
|
|
122
|
-
|
|
114
|
+
connection_report_events
|
|
123
115
|
WHERE
|
|
124
116
|
disconnected_at IS NULL
|
|
125
117
|
AND jwt_exp > NOW()
|
|
@@ -169,14 +161,14 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
169
161
|
};
|
|
170
162
|
}
|
|
171
163
|
|
|
172
|
-
async
|
|
164
|
+
async reportClientConnection(data: event_types.ClientConnectionBucketData): Promise<void> {
|
|
173
165
|
const { sdk, connected_at, user_id, user_agent, jwt_exp, client_id } = data;
|
|
174
166
|
const connectIsoString = connected_at.toISOString();
|
|
175
167
|
const jwtExpIsoString = jwt_exp!.toISOString();
|
|
176
168
|
const { gte, lt } = this.updateTableFilter();
|
|
177
169
|
const uuid = v4();
|
|
178
170
|
const result = await this.db.sql`
|
|
179
|
-
UPDATE
|
|
171
|
+
UPDATE connection_report_events
|
|
180
172
|
SET
|
|
181
173
|
connected_at = ${{ type: 1184, value: connectIsoString }},
|
|
182
174
|
sdk = ${{ type: 'varchar', value: sdk }},
|
|
@@ -192,7 +184,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
192
184
|
if (result.results[1].status === 'UPDATE 0') {
|
|
193
185
|
await this.db.sql`
|
|
194
186
|
INSERT INTO
|
|
195
|
-
|
|
187
|
+
connection_report_events (
|
|
196
188
|
user_id,
|
|
197
189
|
client_id,
|
|
198
190
|
connected_at,
|
|
@@ -214,12 +206,12 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
214
206
|
`.execute();
|
|
215
207
|
}
|
|
216
208
|
}
|
|
217
|
-
async
|
|
209
|
+
async reportClientDisconnection(data: event_types.ClientDisconnectionEventData): Promise<void> {
|
|
218
210
|
const { user_id, client_id, disconnected_at, connected_at } = data;
|
|
219
211
|
const disconnectIsoString = disconnected_at.toISOString();
|
|
220
212
|
const connectIsoString = connected_at.toISOString();
|
|
221
213
|
await this.db.sql`
|
|
222
|
-
UPDATE
|
|
214
|
+
UPDATE connection_report_events
|
|
223
215
|
SET
|
|
224
216
|
disconnected_at = ${{ type: 1184, value: disconnectIsoString }},
|
|
225
217
|
jwt_exp = NULL
|
|
@@ -229,12 +221,14 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
229
221
|
AND connected_at = ${{ type: 1184, value: connectIsoString }}
|
|
230
222
|
`.execute();
|
|
231
223
|
}
|
|
232
|
-
async
|
|
224
|
+
async getConnectedClients(data: event_types.ClientConnectionsRequest): Promise<event_types.ClientConnectionReport> {
|
|
233
225
|
const result = await this.listConnectionsQuery(data);
|
|
234
226
|
return this.mapListCurrentConnectionsResponse(result);
|
|
235
227
|
}
|
|
236
228
|
|
|
237
|
-
async
|
|
229
|
+
async getClientConnectionReports(
|
|
230
|
+
data: event_types.ClientConnectionReportRequest
|
|
231
|
+
): Promise<event_types.ClientConnectionReport> {
|
|
238
232
|
const { start, end } = data;
|
|
239
233
|
const result = await this.db.sql`
|
|
240
234
|
WITH
|
|
@@ -242,7 +236,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
242
236
|
SELECT
|
|
243
237
|
*
|
|
244
238
|
FROM
|
|
245
|
-
|
|
239
|
+
connection_report_events
|
|
246
240
|
WHERE
|
|
247
241
|
connected_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
248
242
|
AND connected_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
@@ -281,10 +275,10 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
281
275
|
.first();
|
|
282
276
|
return this.mapListCurrentConnectionsResponse(result);
|
|
283
277
|
}
|
|
284
|
-
async
|
|
278
|
+
async deleteOldConnectionData(data: event_types.DeleteOldConnectionData): Promise<void> {
|
|
285
279
|
const { date } = data;
|
|
286
280
|
const result = await this.db.sql`
|
|
287
|
-
DELETE FROM
|
|
281
|
+
DELETE FROM connection_report_events
|
|
288
282
|
WHERE
|
|
289
283
|
connected_at < ${{ type: 1184, value: date.toISOString() }}
|
|
290
284
|
AND (
|
|
@@ -298,7 +292,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
298
292
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
299
293
|
if (deletedRows > 0) {
|
|
300
294
|
logger.info(
|
|
301
|
-
`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from
|
|
295
|
+
`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from connection_report_events.`
|
|
302
296
|
);
|
|
303
297
|
}
|
|
304
298
|
}
|
package/src/utils/db.ts
CHANGED
|
@@ -23,6 +23,6 @@ export const dropTables = async (client: lib_postgres.DatabaseClient) => {
|
|
|
23
23
|
await db.sql`DROP TABLE IF EXISTS custom_write_checkpoints`.execute();
|
|
24
24
|
await db.sql`DROP SEQUENCE IF EXISTS op_id_sequence`.execute();
|
|
25
25
|
await db.sql`DROP SEQUENCE IF EXISTS sync_rules_id_sequence`.execute();
|
|
26
|
-
await db.sql`DROP TABLE IF EXISTS
|
|
26
|
+
await db.sql`DROP TABLE IF EXISTS connection_report_events`.execute();
|
|
27
27
|
});
|
|
28
28
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`
|
|
3
|
+
exports[`Connection report storage > Should create a connection event if its after a day 1`] = `
|
|
4
4
|
[
|
|
5
5
|
{
|
|
6
6
|
"client_id": "client_week",
|
|
@@ -17,7 +17,24 @@ exports[`SDK reporting storage > Should create a sdk event if its after a day 1`
|
|
|
17
17
|
]
|
|
18
18
|
`;
|
|
19
19
|
|
|
20
|
-
exports[`
|
|
20
|
+
exports[`Connection report storage > Should create a sdk event if its after a day 1`] = `
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
"client_id": "client_week",
|
|
24
|
+
"sdk": "powersync-js/1.24.5",
|
|
25
|
+
"user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
|
|
26
|
+
"user_id": "user_week",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"client_id": "client_week",
|
|
30
|
+
"sdk": "powersync-js/1.24.5",
|
|
31
|
+
"user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
|
|
32
|
+
"user_id": "user_week",
|
|
33
|
+
},
|
|
34
|
+
]
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
exports[`Connection report storage > Should delete rows older than specified range 1`] = `
|
|
21
38
|
{
|
|
22
39
|
"sdks": [
|
|
23
40
|
{
|
|
@@ -50,7 +67,33 @@ exports[`SDK reporting storage > Should delete rows older than specified range 1
|
|
|
50
67
|
}
|
|
51
68
|
`;
|
|
52
69
|
|
|
53
|
-
exports[`
|
|
70
|
+
exports[`Connection report storage > Should show connected users with start range 1`] = `
|
|
71
|
+
{
|
|
72
|
+
"sdks": [
|
|
73
|
+
{
|
|
74
|
+
"clients": 1,
|
|
75
|
+
"sdk": "powersync-dart/1.6.4",
|
|
76
|
+
"users": 1,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
"users": 1,
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
|
|
83
|
+
exports[`Connection report storage > Should show connected users with start range and end range 1`] = `
|
|
84
|
+
{
|
|
85
|
+
"sdks": [
|
|
86
|
+
{
|
|
87
|
+
"clients": 1,
|
|
88
|
+
"sdk": "powersync-js/1.21.1",
|
|
89
|
+
"users": 1,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
"users": 1,
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
exports[`Connection report storage > Should show connection report data for user over the past day 1`] = `
|
|
54
97
|
{
|
|
55
98
|
"sdks": [
|
|
56
99
|
{
|
|
@@ -73,7 +116,7 @@ exports[`SDK reporting storage > Should show SDK scrape data for user over the p
|
|
|
73
116
|
}
|
|
74
117
|
`;
|
|
75
118
|
|
|
76
|
-
exports[`
|
|
119
|
+
exports[`Connection report storage > Should show connection report data for user over the past month 1`] = `
|
|
77
120
|
{
|
|
78
121
|
"sdks": [
|
|
79
122
|
{
|
|
@@ -116,7 +159,7 @@ exports[`SDK reporting storage > Should show SDK scrape data for user over the p
|
|
|
116
159
|
}
|
|
117
160
|
`;
|
|
118
161
|
|
|
119
|
-
exports[`
|
|
162
|
+
exports[`Connection report storage > Should show connection report data for user over the past week 1`] = `
|
|
120
163
|
{
|
|
121
164
|
"sdks": [
|
|
122
165
|
{
|
|
@@ -149,33 +192,18 @@ exports[`SDK reporting storage > Should show SDK scrape data for user over the p
|
|
|
149
192
|
}
|
|
150
193
|
`;
|
|
151
194
|
|
|
152
|
-
exports[`
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
"users": 1,
|
|
162
|
-
}
|
|
163
|
-
`;
|
|
164
|
-
|
|
165
|
-
exports[`SDK reporting storage > Should show connected users with start range and end range 1`] = `
|
|
166
|
-
{
|
|
167
|
-
"sdks": [
|
|
168
|
-
{
|
|
169
|
-
"clients": 1,
|
|
170
|
-
"sdk": "powersync-js/1.21.1",
|
|
171
|
-
"users": 1,
|
|
172
|
-
},
|
|
173
|
-
],
|
|
174
|
-
"users": 1,
|
|
175
|
-
}
|
|
195
|
+
exports[`Connection report storage > Should update a connected sdk event and make it disconnected 1`] = `
|
|
196
|
+
[
|
|
197
|
+
{
|
|
198
|
+
"client_id": "client_three",
|
|
199
|
+
"sdk": "powersync-js/1.21.2",
|
|
200
|
+
"user_agent": "powersync-js/1.21.0 powersync-web Firefox/141 linux",
|
|
201
|
+
"user_id": "user_three",
|
|
202
|
+
},
|
|
203
|
+
]
|
|
176
204
|
`;
|
|
177
205
|
|
|
178
|
-
exports[`
|
|
206
|
+
exports[`Connection report storage > Should update a connection event and make it disconnected 1`] = `
|
|
179
207
|
[
|
|
180
208
|
{
|
|
181
209
|
"client_id": "client_three",
|
|
@@ -186,7 +214,18 @@ exports[`SDK reporting storage > Should update a connected sdk event and make it
|
|
|
186
214
|
]
|
|
187
215
|
`;
|
|
188
216
|
|
|
189
|
-
exports[`
|
|
217
|
+
exports[`Connection report storage > Should update a connection event if its within a day 1`] = `
|
|
218
|
+
[
|
|
219
|
+
{
|
|
220
|
+
"client_id": "client_one",
|
|
221
|
+
"sdk": "powersync-dart/1.6.4",
|
|
222
|
+
"user_agent": "powersync-dart/1.6.4 Dart (flutter-web) Chrome/128 android",
|
|
223
|
+
"user_id": "user_one",
|
|
224
|
+
},
|
|
225
|
+
]
|
|
226
|
+
`;
|
|
227
|
+
|
|
228
|
+
exports[`Connection report storage > Should update a sdk event if its within a day 1`] = `
|
|
190
229
|
[
|
|
191
230
|
{
|
|
192
231
|
"client_id": "client_one",
|