@powersync/service-module-postgres-storage 0.0.0-dev-20250724111728 → 0.0.0-dev-20250729121434
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 +9 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/storage/PostgresReportStorageFactory.d.ts +5 -1
- package/dist/migrations/scripts/1684951997326-init.js +17 -0
- package/dist/migrations/scripts/1684951997326-init.js.map +1 -1
- package/dist/storage/PostgresReportStorageFactory.js +260 -11
- package/dist/storage/PostgresReportStorageFactory.js.map +1 -1
- package/dist/storage/PostgresStorageProvider.js +5 -2
- package/dist/storage/PostgresStorageProvider.js.map +1 -1
- package/package.json +7 -7
- package/src/migrations/scripts/1684951997326-init.ts +22 -0
- package/src/storage/PostgresReportStorageFactory.ts +266 -13
- package/src/storage/PostgresStorageProvider.ts +5 -2
|
@@ -9,8 +9,12 @@ export type PostgresReportStorageOptions = {
|
|
|
9
9
|
export declare class PostgresReportStorageFactory implements storage.ReportStorageFactory {
|
|
10
10
|
protected options: PostgresReportStorageOptions;
|
|
11
11
|
readonly db: lib_postgres.DatabaseClient;
|
|
12
|
-
private activeStorage;
|
|
13
12
|
constructor(options: PostgresReportStorageOptions);
|
|
13
|
+
private parseJsDate;
|
|
14
|
+
private timeFrameQuery;
|
|
15
|
+
private timeFrameDeleteQuery;
|
|
16
|
+
private listConnectionsDateRangeQuery;
|
|
17
|
+
private updateTableFilter;
|
|
14
18
|
reportSdkConnect(data: SdkConnectBucketData): Promise<void>;
|
|
15
19
|
reportSdkDisconnect(data: SdkDisconnectEventData): Promise<void>;
|
|
16
20
|
listCurrentConnections(data: ListCurrentConnectionsRequest): Promise<ListCurrentConnections>;
|
|
@@ -164,6 +164,23 @@ export const up = async (context) => {
|
|
|
164
164
|
CONSTRAINT unique_user_sync PRIMARY KEY (user_id, sync_rules_id)
|
|
165
165
|
);
|
|
166
166
|
`.execute();
|
|
167
|
+
await db.sql `
|
|
168
|
+
CREATE TABLE sdk_report_events (
|
|
169
|
+
id TEXT PRIMARY KEY,
|
|
170
|
+
user_agent TEXT NOT NULL,
|
|
171
|
+
client_id TEXT NOT NULL,
|
|
172
|
+
user_id TEXT NOT NULL,
|
|
173
|
+
sdk TEXT NOT NULL,
|
|
174
|
+
jwt_exp TIMESTAMP WITH TIME ZONE,
|
|
175
|
+
connect_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
176
|
+
disconnect_at TIMESTAMP WITH TIME ZONE,
|
|
177
|
+
CONSTRAINT unique_user_client_connect UNIQUE (user_id, client_id, connect_at)
|
|
178
|
+
)
|
|
179
|
+
`.execute();
|
|
180
|
+
await db.sql ` CREATE INDEX sdk_list_index ON sdk_report_events (connect_at, jwt_exp, disconnect_at) `.execute();
|
|
181
|
+
await db.sql ` CREATE INDEX sdk_user_id_index ON sdk_report_events (user_id)`.execute();
|
|
182
|
+
await db.sql ` CREATE INDEX sdk_client_id_index ON sdk_report_events (client_id)`.execute();
|
|
183
|
+
await db.sql ` CREATE INDEX sdk_index ON sdk_report_events (sdk)`.execute();
|
|
167
184
|
});
|
|
168
185
|
}
|
|
169
186
|
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;
|
|
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;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA;;;;;;;;;;;;KAYX,CAAC,OAAO,EAAE,CAAC;YAEZ,MAAM,EAAE,CAAC,GAAG,CAAA,yFAAyF,CAAC,OAAO,EAAE,CAAC;YAEhH,MAAM,EAAE,CAAC,GAAG,CAAA,gEAAgE,CAAC,OAAO,EAAE,CAAC;YAEvF,MAAM,EAAE,CAAC,GAAG,CAAA,oEAAoE,CAAC,OAAO,EAAE,CAAC;YAE3F,MAAM,EAAE,CAAC,GAAG,CAAA,oDAAoD,CAAC,OAAO,EAAE,CAAC;QAC7E,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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { v4 } from 'uuid';
|
|
1
2
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
3
|
import { STORAGE_SCHEMA_NAME } from '../utils/db.js';
|
|
3
4
|
import { getStorageApplicationName } from '../utils/application-name.js';
|
|
4
5
|
export class PostgresReportStorageFactory {
|
|
5
6
|
options;
|
|
6
7
|
db;
|
|
7
|
-
activeStorage;
|
|
8
8
|
constructor(options) {
|
|
9
9
|
this.options = options;
|
|
10
10
|
this.db = new lib_postgres.DatabaseClient({
|
|
@@ -16,20 +16,269 @@ export class PostgresReportStorageFactory {
|
|
|
16
16
|
connectionCreated: async (connection) => this.prepareStatements(connection)
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
parseJsDate(date) {
|
|
20
|
+
const year = date.getFullYear();
|
|
21
|
+
const month = date.getMonth();
|
|
22
|
+
const today = date.getDate();
|
|
23
|
+
const day = date.getDay();
|
|
24
|
+
return {
|
|
25
|
+
year,
|
|
26
|
+
month,
|
|
27
|
+
today,
|
|
28
|
+
day,
|
|
29
|
+
parsedDate: date
|
|
30
|
+
};
|
|
21
31
|
}
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
timeFrameQuery(timeframe, interval = 1) {
|
|
33
|
+
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
34
|
+
switch (timeframe) {
|
|
35
|
+
case 'month': {
|
|
36
|
+
return { lt: parsedDate.toISOString(), gt: new Date(year, parsedDate.getMonth() - interval).toISOString() };
|
|
37
|
+
}
|
|
38
|
+
case 'week': {
|
|
39
|
+
const weekStartDate = new Date(parsedDate);
|
|
40
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
41
|
+
const weekStart = this.parseJsDate(weekStartDate);
|
|
42
|
+
return {
|
|
43
|
+
lt: parsedDate.toISOString(),
|
|
44
|
+
gt: new Date(weekStart.year, weekStart.month, weekStart.today).toISOString()
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
case 'hour': {
|
|
48
|
+
// Get the last hour from the current time
|
|
49
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
50
|
+
return {
|
|
51
|
+
lt: new Date(year, month, today, parsedDate.getHours()).toISOString(),
|
|
52
|
+
gt: new Date(year, month, today, previousHour).toISOString()
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
default: {
|
|
56
|
+
return {
|
|
57
|
+
lt: parsedDate.toISOString(),
|
|
58
|
+
gt: new Date(year, month, today - interval).toISOString()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
24
62
|
}
|
|
25
|
-
|
|
26
|
-
|
|
63
|
+
timeFrameDeleteQuery(timeframe, interval = 1) {
|
|
64
|
+
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
65
|
+
switch (timeframe) {
|
|
66
|
+
case 'month': {
|
|
67
|
+
return { lt: new Date(year, parsedDate.getMonth() - interval).toISOString() };
|
|
68
|
+
}
|
|
69
|
+
case 'week': {
|
|
70
|
+
const weekStartDate = new Date(parsedDate);
|
|
71
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
72
|
+
const { month, year, today } = this.parseJsDate(weekStartDate);
|
|
73
|
+
return {
|
|
74
|
+
lt: new Date(year, month, today).toISOString()
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
case 'hour': {
|
|
78
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
79
|
+
return {
|
|
80
|
+
lt: new Date(year, month, today, previousHour).toISOString()
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
default: {
|
|
84
|
+
return {
|
|
85
|
+
$lt: new Date(year, month, today - interval).toISOString()
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
27
89
|
}
|
|
28
|
-
|
|
29
|
-
|
|
90
|
+
listConnectionsDateRangeQuery(data) {
|
|
91
|
+
const { range } = data;
|
|
92
|
+
if (!range) {
|
|
93
|
+
const query = `
|
|
94
|
+
WITH filtered AS (
|
|
95
|
+
SELECT *
|
|
96
|
+
FROM sdk_report_events
|
|
97
|
+
WHERE disconnect_at IS NULL
|
|
98
|
+
AND jwt_exp > NOW()
|
|
99
|
+
),
|
|
100
|
+
unique_users AS (
|
|
101
|
+
SELECT COUNT(DISTINCT user_id) AS count
|
|
102
|
+
FROM filtered
|
|
103
|
+
),
|
|
104
|
+
sdk_versions_array AS (
|
|
105
|
+
SELECT sdk,
|
|
106
|
+
COUNT(*) AS total,
|
|
107
|
+
COUNT(DISTINCT client_id) AS clients,
|
|
108
|
+
COUNT(DISTINCT user_id) AS users
|
|
109
|
+
FROM filtered
|
|
110
|
+
GROUP BY sdk
|
|
111
|
+
)
|
|
112
|
+
SELECT
|
|
113
|
+
COALESCE(u.count, 0) AS users,
|
|
114
|
+
JSON_AGG(ROW_TO_JSON(s)) AS sdks
|
|
115
|
+
FROM unique_users u
|
|
116
|
+
JOIN sdk_versions_array s ON TRUE;
|
|
117
|
+
`;
|
|
118
|
+
return {
|
|
119
|
+
statement: query
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const endDate = data.range?.end_date ? new Date(data.range.end_date) : new Date();
|
|
123
|
+
const startDate = new Date(range.start_date);
|
|
124
|
+
const query = `
|
|
125
|
+
WITH filtered AS (
|
|
126
|
+
SELECT *
|
|
127
|
+
FROM sdk_report_events
|
|
128
|
+
WHERE disconnect_at IS NULL
|
|
129
|
+
AND jwt_exp > NOW()
|
|
130
|
+
AND connect_at > $1
|
|
131
|
+
AND connect_at <= $2
|
|
132
|
+
),
|
|
133
|
+
unique_users AS (
|
|
134
|
+
SELECT COUNT(DISTINCT user_id) AS count
|
|
135
|
+
FROM filtered
|
|
136
|
+
),
|
|
137
|
+
sdk_versions_array AS (
|
|
138
|
+
SELECT sdk,
|
|
139
|
+
COUNT(*) AS total,
|
|
140
|
+
COUNT(DISTINCT client_id) AS clients,
|
|
141
|
+
COUNT(DISTINCT user_id) AS users
|
|
142
|
+
FROM filtered
|
|
143
|
+
GROUP BY sdk
|
|
144
|
+
)
|
|
145
|
+
SELECT COALESCE(u.count, 0) AS users, JSON_AGG(ROW_TO_JSON(s)) AS sdks
|
|
146
|
+
FROM unique_users u
|
|
147
|
+
JOIN sdk_versions_array s ON TRUE;
|
|
148
|
+
`;
|
|
149
|
+
const lt = endDate.toISOString();
|
|
150
|
+
const gt = startDate.toISOString();
|
|
151
|
+
return { statement: query, params: [{ value: gt }, { value: lt }] };
|
|
30
152
|
}
|
|
31
|
-
|
|
32
|
-
|
|
153
|
+
updateTableFilter() {
|
|
154
|
+
const { year, month, today } = this.parseJsDate(new Date());
|
|
155
|
+
const nextDay = today + 1;
|
|
156
|
+
return {
|
|
157
|
+
gte: new Date(year, month, today).toISOString(),
|
|
158
|
+
lt: new Date(year, month, nextDay).toISOString()
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
async reportSdkConnect(data) {
|
|
162
|
+
const { sdk, connect_at, user_id, user_agent, jwt_exp, client_id } = data;
|
|
163
|
+
const { gte, lt } = this.updateTableFilter();
|
|
164
|
+
const query = `
|
|
165
|
+
INSERT INTO sdk_report_events (user_id, client_id, connect_at, sdk, user_agent, jwt_exp, id)
|
|
166
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
167
|
+
ON CONFLICT (user_id, client_id, connect_at)
|
|
168
|
+
DO UPDATE SET
|
|
169
|
+
connect_at = $3,
|
|
170
|
+
sdk = $4,
|
|
171
|
+
user_agent = $5,
|
|
172
|
+
jwt_exp = $6,
|
|
173
|
+
disconnect_at = NULL
|
|
174
|
+
WHERE sdk_report_events.connect_at >= $8
|
|
175
|
+
AND sdk_report_events.connect_at < $9;`;
|
|
176
|
+
try {
|
|
177
|
+
const result = await this.db.query({
|
|
178
|
+
statement: query,
|
|
179
|
+
params: [
|
|
180
|
+
{ type: 'varchar', value: user_id },
|
|
181
|
+
{ type: 'varchar', value: client_id },
|
|
182
|
+
{ type: 'varchar', value: connect_at },
|
|
183
|
+
{ type: 'varchar', value: sdk },
|
|
184
|
+
{ type: 'varchar', value: user_agent },
|
|
185
|
+
{ type: 1184, value: jwt_exp?.toISOString() },
|
|
186
|
+
{ type: 'varchar', value: v4() },
|
|
187
|
+
{ type: 1184, value: gte },
|
|
188
|
+
{ type: 1184, value: lt }
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
console.log(result.rows);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.log(error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async reportSdkDisconnect(data) {
|
|
198
|
+
const { user_id, client_id, disconnect_at } = data;
|
|
199
|
+
const { gte, lt } = this.updateTableFilter();
|
|
200
|
+
const query = `
|
|
201
|
+
UPDATE sdk_report_events
|
|
202
|
+
SET
|
|
203
|
+
disconnect_at = $1,
|
|
204
|
+
jwt_exp = NULL
|
|
205
|
+
WHERE user_id = $2
|
|
206
|
+
AND client_id = $3
|
|
207
|
+
AND connect_at >= $4
|
|
208
|
+
AND connect_at < $5;`;
|
|
209
|
+
try {
|
|
210
|
+
const result = await this.db.query({
|
|
211
|
+
statement: query,
|
|
212
|
+
params: [
|
|
213
|
+
{ type: 1184, value: disconnect_at },
|
|
214
|
+
{ type: 'varchar', value: user_id },
|
|
215
|
+
{ type: 'varchar', value: client_id },
|
|
216
|
+
{ type: 1184, value: gte },
|
|
217
|
+
{ type: 1184, value: lt }
|
|
218
|
+
]
|
|
219
|
+
});
|
|
220
|
+
console.log(result.rows);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
console.log(error);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async listCurrentConnections(data) {
|
|
227
|
+
const statement = this.listConnectionsDateRangeQuery(data);
|
|
228
|
+
const result = await this.db.query(statement);
|
|
229
|
+
console.log(result.rows);
|
|
230
|
+
return {
|
|
231
|
+
users: 0,
|
|
232
|
+
sdks: []
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
async scrapeSdkData(data) {
|
|
236
|
+
const { timeframe, interval } = data;
|
|
237
|
+
const { lt, gt } = this.timeFrameQuery(timeframe, interval);
|
|
238
|
+
const query = `
|
|
239
|
+
WITH filtered AS (
|
|
240
|
+
SELECT *
|
|
241
|
+
FROM sdk_report_events
|
|
242
|
+
WHERE connect_at > $1
|
|
243
|
+
AND connect_at <= $2
|
|
244
|
+
),
|
|
245
|
+
unique_users AS (
|
|
246
|
+
SELECT COUNT(DISTINCT user_id) AS count
|
|
247
|
+
FROM filtered
|
|
248
|
+
),
|
|
249
|
+
sdk_versions_array AS (
|
|
250
|
+
SELECT sdk,
|
|
251
|
+
COUNT(*) AS total,
|
|
252
|
+
COUNT(DISTINCT client_id) AS clients,
|
|
253
|
+
COUNT(DISTINCT user_id) AS users
|
|
254
|
+
FROM filtered
|
|
255
|
+
GROUP BY sdk
|
|
256
|
+
)
|
|
257
|
+
SELECT COALESCE(u.count, 0) AS users, JSON_AGG(ROW_TO_JSON(s)) AS sdks
|
|
258
|
+
FROM unique_users u
|
|
259
|
+
JOIN sdk_versions_array s ON TRUE;
|
|
260
|
+
`;
|
|
261
|
+
const result = await this.db.query({ statement: query, params: [{ value: gt }, { value: lt }] });
|
|
262
|
+
console.log(result.rows);
|
|
263
|
+
return {
|
|
264
|
+
users: 0,
|
|
265
|
+
sdks: []
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
async deleteOldSdkData(data) {
|
|
269
|
+
const { timeframe, interval } = data;
|
|
270
|
+
const { lt } = this.timeFrameDeleteQuery(timeframe, interval);
|
|
271
|
+
const query = `
|
|
272
|
+
DELETE FROM sdk_report_events
|
|
273
|
+
WHERE connect_at < $1
|
|
274
|
+
AND (
|
|
275
|
+
disconnect_at IS NOT NULL
|
|
276
|
+
OR (jwt_exp < NOW() AND disconnect_at IS NULL)
|
|
277
|
+
);
|
|
278
|
+
`;
|
|
279
|
+
const params = [{ value: lt }];
|
|
280
|
+
const result = await this.db.query({ statement: query, params });
|
|
281
|
+
console.log(result.rows);
|
|
33
282
|
}
|
|
34
283
|
async [Symbol.asyncDispose]() {
|
|
35
284
|
await this.db[Symbol.asyncDispose]();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAczE,MAAM,OAAO,4BAA4B;
|
|
1
|
+
{"version":3,"file":"PostgresReportStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresReportStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,14 +25,17 @@ export class PostgresStorageProvider {
|
|
|
25
25
|
config: normalizedConfig
|
|
26
26
|
});
|
|
27
27
|
return {
|
|
28
|
-
// TODO: IMPLEMENT REPORT STORAGE
|
|
29
28
|
reportStorage: reportStorageFactory,
|
|
30
29
|
storage: storageFactory,
|
|
31
|
-
shutDown: async () =>
|
|
30
|
+
shutDown: async () => {
|
|
31
|
+
await storageFactory.db[Symbol.asyncDispose]();
|
|
32
|
+
await reportStorageFactory.db[Symbol.asyncDispose]();
|
|
33
|
+
},
|
|
32
34
|
tearDown: async () => {
|
|
33
35
|
logger.info(`Tearing down Postgres storage: ${normalizedConfig.database}...`);
|
|
34
36
|
await dropTables(storageFactory.db);
|
|
35
37
|
await storageFactory.db[Symbol.asyncDispose]();
|
|
38
|
+
await reportStorageFactory.db[Symbol.asyncDispose]();
|
|
36
39
|
return true;
|
|
37
40
|
}
|
|
38
41
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresStorageProvider.js","sourceRoot":"","sources":["../../src/storage/PostgresStorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,OAAO,uBAAuB;IAClC,IAAI,IAAI;QACN,OAAO,YAAY,CAAC,wBAAwB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAkC;QACjD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,gFAAgF;YAChF,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,IAAI,QAAQ,YAAY,CAAC,wBAAwB,EAAE,CAC1H,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,4BAA4B,CAAC;YACtD,MAAM,EAAE,gBAAgB;YACxB,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,gBAAgB;SAC1D,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,IAAI,4BAA4B,CAAC;YAC5D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QAEH,OAAO;YACL,
|
|
1
|
+
{"version":3,"file":"PostgresStorageProvider.js","sourceRoot":"","sources":["../../src/storage/PostgresStorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,OAAO,uBAAuB;IAClC,IAAI,IAAI;QACN,OAAO,YAAY,CAAC,wBAAwB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAkC;QACjD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,gFAAgF;YAChF,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,IAAI,QAAQ,YAAY,CAAC,wBAAwB,EAAE,CAC1H,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,4BAA4B,CAAC;YACtD,MAAM,EAAE,gBAAgB;YACxB,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,gBAAgB;SAC1D,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,IAAI,4BAA4B,CAAC;YAC5D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QAEH,OAAO;YACL,aAAa,EAAE,oBAAoB;YACnC,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/C,MAAM,oBAAoB,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,CAAC;YACD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC,kCAAkC,gBAAgB,CAAC,QAAQ,KAAK,CAAC,CAAC;gBAC9E,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/C,MAAM,oBAAoB,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;SAC8B,CAAC;IACpC,CAAC;CACF"}
|
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-20250729121434",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"publishConfig": {
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
"p-defer": "^4.0.1",
|
|
30
30
|
"ts-codec": "^1.3.0",
|
|
31
31
|
"uuid": "^11.1.0",
|
|
32
|
-
"@powersync/lib-service-postgres": "0.0.0-dev-
|
|
33
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
34
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
35
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
36
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
37
|
-
"@powersync/service-jpgwire": "0.0.0-dev-
|
|
32
|
+
"@powersync/lib-service-postgres": "0.0.0-dev-20250729121434",
|
|
33
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250729121434",
|
|
34
|
+
"@powersync/service-core": "0.0.0-dev-20250729121434",
|
|
35
|
+
"@powersync/service-types": "0.0.0-dev-20250729121434",
|
|
36
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250729121434",
|
|
37
|
+
"@powersync/service-jpgwire": "0.0.0-dev-20250729121434",
|
|
38
38
|
"@powersync/service-sync-rules": "0.27.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
@@ -128,6 +128,28 @@ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
|
128
128
|
CONSTRAINT unique_user_sync PRIMARY KEY (user_id, sync_rules_id)
|
|
129
129
|
);
|
|
130
130
|
`.execute();
|
|
131
|
+
|
|
132
|
+
await db.sql`
|
|
133
|
+
CREATE TABLE sdk_report_events (
|
|
134
|
+
id TEXT PRIMARY KEY,
|
|
135
|
+
user_agent TEXT NOT NULL,
|
|
136
|
+
client_id TEXT NOT NULL,
|
|
137
|
+
user_id TEXT NOT NULL,
|
|
138
|
+
sdk TEXT NOT NULL,
|
|
139
|
+
jwt_exp TIMESTAMP WITH TIME ZONE,
|
|
140
|
+
connect_at TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
141
|
+
disconnect_at TIMESTAMP WITH TIME ZONE,
|
|
142
|
+
CONSTRAINT unique_user_client_connect UNIQUE (user_id, client_id, connect_at)
|
|
143
|
+
)
|
|
144
|
+
`.execute();
|
|
145
|
+
|
|
146
|
+
await db.sql` CREATE INDEX sdk_list_index ON sdk_report_events (connect_at, jwt_exp, disconnect_at) `.execute();
|
|
147
|
+
|
|
148
|
+
await db.sql` CREATE INDEX sdk_user_id_index ON sdk_report_events (user_id)`.execute();
|
|
149
|
+
|
|
150
|
+
await db.sql` CREATE INDEX sdk_client_id_index ON sdk_report_events (client_id)`.execute();
|
|
151
|
+
|
|
152
|
+
await db.sql` CREATE INDEX sdk_index ON sdk_report_events (sdk)`.execute();
|
|
131
153
|
});
|
|
132
154
|
};
|
|
133
155
|
|