@powersync/service-module-postgres-storage 0.0.0-dev-20250819134004 → 0.0.0-dev-20250825132649
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 +2 -2
- package/dist/@types/storage/storage-index.d.ts +0 -1
- package/dist/@types/{storage/PostgresTestStorageFactoryGenerator.d.ts → utils/test-utils.d.ts} +4 -4
- package/dist/@types/utils/utils-index.d.ts +1 -0
- package/dist/migrations/scripts/1684951997326-init.js +7 -5
- package/dist/migrations/scripts/1684951997326-init.js.map +1 -1
- package/dist/storage/PostgresReportStorageFactory.js +11 -63
- package/dist/storage/PostgresReportStorageFactory.js.map +1 -1
- package/dist/storage/storage-index.js +0 -1
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/utils/db.js +1 -1
- package/dist/utils/db.js.map +1 -1
- package/dist/{storage/PostgresTestStorageFactoryGenerator.js → utils/test-utils.js} +7 -7
- package/dist/utils/test-utils.js.map +1 -0
- package/dist/utils/utils-index.js +1 -0
- package/dist/utils/utils-index.js.map +1 -1
- package/package.json +9 -9
- package/src/migrations/scripts/1684951997326-init.ts +7 -5
- package/src/storage/PostgresReportStorageFactory.ts +16 -66
- package/src/storage/storage-index.ts +0 -1
- package/src/utils/db.ts +1 -1
- package/src/{storage/PostgresTestStorageFactoryGenerator.ts → utils/test-utils.ts} +6 -6
- package/src/utils/utils-index.ts +1 -0
- package/test/src/__snapshots__/{sdk-report-storage.test.ts.snap → connection-report-storage.test.ts.snap} +80 -28
- package/test/src/__snapshots__/storage_sync.test.ts.snap +12 -11
- package/test/src/{sdk-report-storage.test.ts → connection-report-storage.test.ts} +33 -38
- package/test/src/util.ts +2 -1
- package/dist/storage/PostgresTestStorageFactoryGenerator.js.map +0 -1
|
@@ -16,8 +16,8 @@ export declare class PostgresReportStorageFactory implements storage.ReportStora
|
|
|
16
16
|
private updateTableFilter;
|
|
17
17
|
reportClientConnection(data: event_types.ClientConnectionBucketData): Promise<void>;
|
|
18
18
|
reportClientDisconnection(data: event_types.ClientDisconnectionEventData): Promise<void>;
|
|
19
|
-
getConnectedClients(
|
|
20
|
-
getClientConnectionReports(data: event_types.ClientConnectionReportRequest): Promise<event_types.
|
|
19
|
+
getConnectedClients(): Promise<event_types.ClientConnectionReportResponse>;
|
|
20
|
+
getClientConnectionReports(data: event_types.ClientConnectionReportRequest): Promise<event_types.ClientConnectionReportResponse>;
|
|
21
21
|
deleteOldConnectionData(data: event_types.DeleteOldConnectionData): Promise<void>;
|
|
22
22
|
[Symbol.asyncDispose](): Promise<void>;
|
|
23
23
|
prepareStatements(connection: pg_wire.PgConnection): Promise<void>;
|
package/dist/@types/{storage/PostgresTestStorageFactoryGenerator.d.ts → utils/test-utils.d.ts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { framework, TestStorageOptions } from '@powersync/service-core';
|
|
2
2
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
3
3
|
import { PostgresStorageConfigDecoded } from '../types/types.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { PostgresReportStorageFactory } from '../storage/PostgresReportStorageFactory.js';
|
|
5
|
+
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
6
6
|
export type PostgresTestStorageOptions = {
|
|
7
7
|
url: string;
|
|
8
8
|
/**
|
|
@@ -11,9 +11,9 @@ export type PostgresTestStorageOptions = {
|
|
|
11
11
|
*/
|
|
12
12
|
migrationAgent?: (config: PostgresStorageConfigDecoded) => PostgresMigrationAgent;
|
|
13
13
|
};
|
|
14
|
-
export declare
|
|
14
|
+
export declare function postgresTestSetup(factoryOptions: PostgresTestStorageOptions): {
|
|
15
15
|
reportFactory: (options?: TestStorageOptions) => Promise<PostgresReportStorageFactory>;
|
|
16
16
|
factory: (options?: TestStorageOptions) => Promise<PostgresBucketStorageFactory>;
|
|
17
17
|
migrate: (direction: framework.migrations.Direction) => Promise<void>;
|
|
18
18
|
};
|
|
19
|
-
export declare
|
|
19
|
+
export declare function postgresTestStorageFactoryGenerator(factoryOptions: PostgresTestStorageOptions): (options?: TestStorageOptions) => Promise<PostgresBucketStorageFactory>;
|
|
@@ -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"}
|
|
@@ -44,69 +44,17 @@ export class PostgresReportStorageFactory {
|
|
|
44
44
|
sdks: result.sdks?.data || []
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
async listConnectionsQuery(
|
|
48
|
-
const { range } = data;
|
|
49
|
-
if (!range) {
|
|
50
|
-
return this.db.sql `
|
|
51
|
-
WITH
|
|
52
|
-
filtered AS (
|
|
53
|
-
SELECT
|
|
54
|
-
*
|
|
55
|
-
FROM
|
|
56
|
-
sdk_report_events
|
|
57
|
-
WHERE
|
|
58
|
-
disconnected_at IS NULL
|
|
59
|
-
AND jwt_exp > NOW()
|
|
60
|
-
),
|
|
61
|
-
unique_users AS (
|
|
62
|
-
SELECT
|
|
63
|
-
COUNT(DISTINCT user_id) AS count
|
|
64
|
-
FROM
|
|
65
|
-
filtered
|
|
66
|
-
),
|
|
67
|
-
sdk_versions_array AS (
|
|
68
|
-
SELECT
|
|
69
|
-
sdk,
|
|
70
|
-
COUNT(DISTINCT client_id) AS clients,
|
|
71
|
-
COUNT(DISTINCT user_id) AS users
|
|
72
|
-
FROM
|
|
73
|
-
filtered
|
|
74
|
-
GROUP BY
|
|
75
|
-
sdk
|
|
76
|
-
)
|
|
77
|
-
SELECT
|
|
78
|
-
(
|
|
79
|
-
SELECT
|
|
80
|
-
COALESCE(count, 0)
|
|
81
|
-
FROM
|
|
82
|
-
unique_users
|
|
83
|
-
) AS users,
|
|
84
|
-
(
|
|
85
|
-
SELECT
|
|
86
|
-
JSON_AGG(ROW_TO_JSON(s))
|
|
87
|
-
FROM
|
|
88
|
-
sdk_versions_array s
|
|
89
|
-
) AS sdks;
|
|
90
|
-
`
|
|
91
|
-
.decoded(SdkReporting)
|
|
92
|
-
.first();
|
|
93
|
-
}
|
|
94
|
-
const endDate = data.range?.end ? new Date(data.range.end) : new Date();
|
|
95
|
-
const startDate = new Date(range.start);
|
|
96
|
-
const lt = endDate.toISOString();
|
|
97
|
-
const gt = startDate.toISOString();
|
|
47
|
+
async listConnectionsQuery() {
|
|
98
48
|
return await this.db.sql `
|
|
99
49
|
WITH
|
|
100
50
|
filtered AS (
|
|
101
51
|
SELECT
|
|
102
52
|
*
|
|
103
53
|
FROM
|
|
104
|
-
|
|
54
|
+
connection_report_events
|
|
105
55
|
WHERE
|
|
106
56
|
disconnected_at IS NULL
|
|
107
|
-
AND jwt_exp > NOW()
|
|
108
|
-
AND connected_at >= ${{ type: 1184, value: gt }}
|
|
109
|
-
AND connected_at <= ${{ type: 1184, value: lt }}
|
|
57
|
+
AND jwt_exp > NOW() AT TIME ZONE 'UTC'
|
|
110
58
|
),
|
|
111
59
|
unique_users AS (
|
|
112
60
|
SELECT
|
|
@@ -156,7 +104,7 @@ export class PostgresReportStorageFactory {
|
|
|
156
104
|
const { gte, lt } = this.updateTableFilter();
|
|
157
105
|
const uuid = v4();
|
|
158
106
|
const result = await this.db.sql `
|
|
159
|
-
UPDATE
|
|
107
|
+
UPDATE connection_report_events
|
|
160
108
|
SET
|
|
161
109
|
connected_at = ${{ type: 1184, value: connectIsoString }},
|
|
162
110
|
sdk = ${{ type: 'varchar', value: sdk }},
|
|
@@ -172,7 +120,7 @@ export class PostgresReportStorageFactory {
|
|
|
172
120
|
if (result.results[1].status === 'UPDATE 0') {
|
|
173
121
|
await this.db.sql `
|
|
174
122
|
INSERT INTO
|
|
175
|
-
|
|
123
|
+
connection_report_events (
|
|
176
124
|
user_id,
|
|
177
125
|
client_id,
|
|
178
126
|
connected_at,
|
|
@@ -199,7 +147,7 @@ export class PostgresReportStorageFactory {
|
|
|
199
147
|
const disconnectIsoString = disconnected_at.toISOString();
|
|
200
148
|
const connectIsoString = connected_at.toISOString();
|
|
201
149
|
await this.db.sql `
|
|
202
|
-
UPDATE
|
|
150
|
+
UPDATE connection_report_events
|
|
203
151
|
SET
|
|
204
152
|
disconnected_at = ${{ type: 1184, value: disconnectIsoString }},
|
|
205
153
|
jwt_exp = NULL
|
|
@@ -209,8 +157,8 @@ export class PostgresReportStorageFactory {
|
|
|
209
157
|
AND connected_at = ${{ type: 1184, value: connectIsoString }}
|
|
210
158
|
`.execute();
|
|
211
159
|
}
|
|
212
|
-
async getConnectedClients(
|
|
213
|
-
const result = await this.listConnectionsQuery(
|
|
160
|
+
async getConnectedClients() {
|
|
161
|
+
const result = await this.listConnectionsQuery();
|
|
214
162
|
return this.mapListCurrentConnectionsResponse(result);
|
|
215
163
|
}
|
|
216
164
|
async getClientConnectionReports(data) {
|
|
@@ -221,7 +169,7 @@ export class PostgresReportStorageFactory {
|
|
|
221
169
|
SELECT
|
|
222
170
|
*
|
|
223
171
|
FROM
|
|
224
|
-
|
|
172
|
+
connection_report_events
|
|
225
173
|
WHERE
|
|
226
174
|
connected_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
227
175
|
AND connected_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
@@ -263,7 +211,7 @@ export class PostgresReportStorageFactory {
|
|
|
263
211
|
async deleteOldConnectionData(data) {
|
|
264
212
|
const { date } = data;
|
|
265
213
|
const result = await this.db.sql `
|
|
266
|
-
DELETE FROM
|
|
214
|
+
DELETE FROM connection_report_events
|
|
267
215
|
WHERE
|
|
268
216
|
connected_at < ${{ type: 1184, value: date.toISOString() }}
|
|
269
217
|
AND (
|
|
@@ -276,7 +224,7 @@ export class PostgresReportStorageFactory {
|
|
|
276
224
|
`.execute();
|
|
277
225
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
278
226
|
if (deletedRows > 0) {
|
|
279
|
-
logger.info(`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from
|
|
227
|
+
logger.info(`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from connection_report_events.`);
|
|
280
228
|
}
|
|
281
229
|
}
|
|
282
230
|
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;AAEhE,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;IAEO,iCAAiC,
|
|
1
|
+
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,4 @@ export * from './PostgresBucketStorageFactory.js';
|
|
|
2
2
|
export * from './PostgresCompactor.js';
|
|
3
3
|
export * from './PostgresStorageProvider.js';
|
|
4
4
|
export * from './PostgresSyncRulesStorage.js';
|
|
5
|
-
export * from './PostgresTestStorageFactoryGenerator.js';
|
|
6
5
|
//# sourceMappingURL=storage-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-index.js","sourceRoot":"","sources":["../../src/storage/storage-index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC
|
|
1
|
+
{"version":3,"file":"storage-index.js","sourceRoot":"","sources":["../../src/storage/storage-index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC"}
|
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"}
|
|
@@ -53,9 +53,9 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
53
53
|
import { framework } from '@powersync/service-core';
|
|
54
54
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
55
55
|
import { normalizePostgresStorageConfig } from '../types/types.js';
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
export
|
|
56
|
+
import { PostgresReportStorageFactory } from '../storage/PostgresReportStorageFactory.js';
|
|
57
|
+
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
58
|
+
export function postgresTestSetup(factoryOptions) {
|
|
59
59
|
const BASE_CONFIG = {
|
|
60
60
|
type: 'postgresql',
|
|
61
61
|
uri: factoryOptions.url,
|
|
@@ -130,8 +130,8 @@ export const postgresTestSetup = (factoryOptions) => {
|
|
|
130
130
|
},
|
|
131
131
|
migrate
|
|
132
132
|
};
|
|
133
|
-
}
|
|
134
|
-
export
|
|
133
|
+
}
|
|
134
|
+
export function postgresTestStorageFactoryGenerator(factoryOptions) {
|
|
135
135
|
return postgresTestSetup(factoryOptions).factory;
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=test-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/utils/test-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-index.js","sourceRoot":"","sources":["../../src/utils/utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils-index.js","sourceRoot":"","sources":["../../src/utils/utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,OAAO,KAAK,UAAU,MAAM,iBAAiB,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-20250825132649",
|
|
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-20250825132649",
|
|
32
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250825132649",
|
|
33
|
+
"@powersync/service-core": "0.0.0-dev-20250825132649",
|
|
34
|
+
"@powersync/service-types": "0.0.0-dev-20250825132649",
|
|
35
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250825132649",
|
|
36
|
+
"@powersync/service-jpgwire": "0.0.0-dev-20250825132649",
|
|
37
|
+
"@powersync/service-jsonbig": "0.0.0-dev-20250825132649",
|
|
38
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20250825132649"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"typescript": "^5.7.3"
|
|
@@ -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
|
|
|
@@ -42,7 +42,9 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
private mapListCurrentConnectionsResponse(
|
|
45
|
+
private mapListCurrentConnectionsResponse(
|
|
46
|
+
result: SdkReportingDecoded | null
|
|
47
|
+
): event_types.ClientConnectionReportResponse {
|
|
46
48
|
if (!result) {
|
|
47
49
|
return {
|
|
48
50
|
users: 0,
|
|
@@ -54,69 +56,17 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
54
56
|
sdks: result.sdks?.data || []
|
|
55
57
|
};
|
|
56
58
|
}
|
|
57
|
-
private async listConnectionsQuery(
|
|
58
|
-
const { range } = data;
|
|
59
|
-
if (!range) {
|
|
60
|
-
return this.db.sql`
|
|
61
|
-
WITH
|
|
62
|
-
filtered AS (
|
|
63
|
-
SELECT
|
|
64
|
-
*
|
|
65
|
-
FROM
|
|
66
|
-
sdk_report_events
|
|
67
|
-
WHERE
|
|
68
|
-
disconnected_at IS NULL
|
|
69
|
-
AND jwt_exp > NOW()
|
|
70
|
-
),
|
|
71
|
-
unique_users AS (
|
|
72
|
-
SELECT
|
|
73
|
-
COUNT(DISTINCT user_id) AS count
|
|
74
|
-
FROM
|
|
75
|
-
filtered
|
|
76
|
-
),
|
|
77
|
-
sdk_versions_array AS (
|
|
78
|
-
SELECT
|
|
79
|
-
sdk,
|
|
80
|
-
COUNT(DISTINCT client_id) AS clients,
|
|
81
|
-
COUNT(DISTINCT user_id) AS users
|
|
82
|
-
FROM
|
|
83
|
-
filtered
|
|
84
|
-
GROUP BY
|
|
85
|
-
sdk
|
|
86
|
-
)
|
|
87
|
-
SELECT
|
|
88
|
-
(
|
|
89
|
-
SELECT
|
|
90
|
-
COALESCE(count, 0)
|
|
91
|
-
FROM
|
|
92
|
-
unique_users
|
|
93
|
-
) AS users,
|
|
94
|
-
(
|
|
95
|
-
SELECT
|
|
96
|
-
JSON_AGG(ROW_TO_JSON(s))
|
|
97
|
-
FROM
|
|
98
|
-
sdk_versions_array s
|
|
99
|
-
) AS sdks;
|
|
100
|
-
`
|
|
101
|
-
.decoded(SdkReporting)
|
|
102
|
-
.first();
|
|
103
|
-
}
|
|
104
|
-
const endDate = data.range?.end ? new Date(data.range.end) : new Date();
|
|
105
|
-
const startDate = new Date(range.start);
|
|
106
|
-
const lt = endDate.toISOString();
|
|
107
|
-
const gt = startDate.toISOString();
|
|
59
|
+
private async listConnectionsQuery() {
|
|
108
60
|
return await this.db.sql`
|
|
109
61
|
WITH
|
|
110
62
|
filtered AS (
|
|
111
63
|
SELECT
|
|
112
64
|
*
|
|
113
65
|
FROM
|
|
114
|
-
|
|
66
|
+
connection_report_events
|
|
115
67
|
WHERE
|
|
116
68
|
disconnected_at IS NULL
|
|
117
|
-
AND jwt_exp > NOW()
|
|
118
|
-
AND connected_at >= ${{ type: 1184, value: gt }}
|
|
119
|
-
AND connected_at <= ${{ type: 1184, value: lt }}
|
|
69
|
+
AND jwt_exp > NOW() AT TIME ZONE 'UTC'
|
|
120
70
|
),
|
|
121
71
|
unique_users AS (
|
|
122
72
|
SELECT
|
|
@@ -164,11 +114,11 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
164
114
|
async reportClientConnection(data: event_types.ClientConnectionBucketData): Promise<void> {
|
|
165
115
|
const { sdk, connected_at, user_id, user_agent, jwt_exp, client_id } = data;
|
|
166
116
|
const connectIsoString = connected_at.toISOString();
|
|
167
|
-
const jwtExpIsoString = jwt_exp
|
|
117
|
+
const jwtExpIsoString = jwt_exp.toISOString();
|
|
168
118
|
const { gte, lt } = this.updateTableFilter();
|
|
169
119
|
const uuid = v4();
|
|
170
120
|
const result = await this.db.sql`
|
|
171
|
-
UPDATE
|
|
121
|
+
UPDATE connection_report_events
|
|
172
122
|
SET
|
|
173
123
|
connected_at = ${{ type: 1184, value: connectIsoString }},
|
|
174
124
|
sdk = ${{ type: 'varchar', value: sdk }},
|
|
@@ -184,7 +134,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
184
134
|
if (result.results[1].status === 'UPDATE 0') {
|
|
185
135
|
await this.db.sql`
|
|
186
136
|
INSERT INTO
|
|
187
|
-
|
|
137
|
+
connection_report_events (
|
|
188
138
|
user_id,
|
|
189
139
|
client_id,
|
|
190
140
|
connected_at,
|
|
@@ -211,7 +161,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
211
161
|
const disconnectIsoString = disconnected_at.toISOString();
|
|
212
162
|
const connectIsoString = connected_at.toISOString();
|
|
213
163
|
await this.db.sql`
|
|
214
|
-
UPDATE
|
|
164
|
+
UPDATE connection_report_events
|
|
215
165
|
SET
|
|
216
166
|
disconnected_at = ${{ type: 1184, value: disconnectIsoString }},
|
|
217
167
|
jwt_exp = NULL
|
|
@@ -221,14 +171,14 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
221
171
|
AND connected_at = ${{ type: 1184, value: connectIsoString }}
|
|
222
172
|
`.execute();
|
|
223
173
|
}
|
|
224
|
-
async getConnectedClients(
|
|
225
|
-
const result = await this.listConnectionsQuery(
|
|
174
|
+
async getConnectedClients(): Promise<event_types.ClientConnectionReportResponse> {
|
|
175
|
+
const result = await this.listConnectionsQuery();
|
|
226
176
|
return this.mapListCurrentConnectionsResponse(result);
|
|
227
177
|
}
|
|
228
178
|
|
|
229
179
|
async getClientConnectionReports(
|
|
230
180
|
data: event_types.ClientConnectionReportRequest
|
|
231
|
-
): Promise<event_types.
|
|
181
|
+
): Promise<event_types.ClientConnectionReportResponse> {
|
|
232
182
|
const { start, end } = data;
|
|
233
183
|
const result = await this.db.sql`
|
|
234
184
|
WITH
|
|
@@ -236,7 +186,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
236
186
|
SELECT
|
|
237
187
|
*
|
|
238
188
|
FROM
|
|
239
|
-
|
|
189
|
+
connection_report_events
|
|
240
190
|
WHERE
|
|
241
191
|
connected_at >= ${{ type: 1184, value: start.toISOString() }}
|
|
242
192
|
AND connected_at <= ${{ type: 1184, value: end.toISOString() }}
|
|
@@ -278,7 +228,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
278
228
|
async deleteOldConnectionData(data: event_types.DeleteOldConnectionData): Promise<void> {
|
|
279
229
|
const { date } = data;
|
|
280
230
|
const result = await this.db.sql`
|
|
281
|
-
DELETE FROM
|
|
231
|
+
DELETE FROM connection_report_events
|
|
282
232
|
WHERE
|
|
283
233
|
connected_at < ${{ type: 1184, value: date.toISOString() }}
|
|
284
234
|
AND (
|
|
@@ -292,7 +242,7 @@ export class PostgresReportStorageFactory implements storage.ReportStorage {
|
|
|
292
242
|
const deletedRows = toInteger(result.results[1].status.split(' ')[1] || '0');
|
|
293
243
|
if (deletedRows > 0) {
|
|
294
244
|
logger.info(
|
|
295
|
-
`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from
|
|
245
|
+
`TTL from ${date.toISOString()}: ${deletedRows} PostgresSQL rows have been removed from connection_report_events.`
|
|
296
246
|
);
|
|
297
247
|
}
|
|
298
248
|
}
|
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,8 +1,8 @@
|
|
|
1
1
|
import { framework, PowerSyncMigrationManager, ServiceContext, TestStorageOptions } from '@powersync/service-core';
|
|
2
2
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
3
3
|
import { normalizePostgresStorageConfig, PostgresStorageConfigDecoded } from '../types/types.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { PostgresReportStorageFactory } from '../storage/PostgresReportStorageFactory.js';
|
|
5
|
+
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
6
6
|
|
|
7
7
|
export type PostgresTestStorageOptions = {
|
|
8
8
|
url: string;
|
|
@@ -13,7 +13,7 @@ export type PostgresTestStorageOptions = {
|
|
|
13
13
|
migrationAgent?: (config: PostgresStorageConfigDecoded) => PostgresMigrationAgent;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
export
|
|
16
|
+
export function postgresTestSetup(factoryOptions: PostgresTestStorageOptions) {
|
|
17
17
|
const BASE_CONFIG = {
|
|
18
18
|
type: 'postgresql' as const,
|
|
19
19
|
uri: factoryOptions.url,
|
|
@@ -82,8 +82,8 @@ export const postgresTestSetup = (factoryOptions: PostgresTestStorageOptions) =>
|
|
|
82
82
|
},
|
|
83
83
|
migrate
|
|
84
84
|
};
|
|
85
|
-
}
|
|
85
|
+
}
|
|
86
86
|
|
|
87
|
-
export
|
|
87
|
+
export function postgresTestStorageFactoryGenerator(factoryOptions: PostgresTestStorageOptions) {
|
|
88
88
|
return postgresTestSetup(factoryOptions).factory;
|
|
89
|
-
}
|
|
89
|
+
}
|
package/src/utils/utils-index.ts
CHANGED