@powersync/service-module-mongodb-storage 0.0.0-dev-20250722150151 → 0.0.0-dev-20250723084344

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @powersync/service-module-mongodb-storage
2
2
 
3
- ## 0.0.0-dev-20250722150151
3
+ ## 0.0.0-dev-20250723084344
4
4
 
5
5
  ### Patch Changes
6
6
 
@@ -10,10 +10,10 @@
10
10
  - Updated dependencies [4ebc3bf]
11
11
  - Updated dependencies [1aafdaf]
12
12
  - Updated dependencies [a700ec9]
13
- - @powersync/service-core@0.0.0-dev-20250722150151
14
- - @powersync/service-types@0.0.0-dev-20250722150151
15
- - @powersync/lib-services-framework@0.0.0-dev-20250722150151
16
- - @powersync/lib-service-mongodb@0.0.0-dev-20250722150151
13
+ - @powersync/service-core@0.0.0-dev-20250723084344
14
+ - @powersync/service-types@0.0.0-dev-20250723084344
15
+ - @powersync/lib-services-framework@0.0.0-dev-20250723084344
16
+ - @powersync/lib-service-mongodb@0.0.0-dev-20250723084344
17
17
 
18
18
  ## 0.10.4
19
19
 
@@ -9,6 +9,6 @@ export declare class MongoReportStorage implements storage.ReportStorageFactory
9
9
  scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnectionsResponse>;
10
10
  reportSdkConnect(data: event_types.SdkConnectBucketData): Promise<void>;
11
11
  reportSdkDisconnect(data: event_types.SdkDisconnectEventData): Promise<void>;
12
- listCurrentConnections(data: event_types.InstanceRequest): Promise<event_types.ListCurrentConnectionsResponse>;
12
+ listCurrentConnections(data: event_types.ListCurrentConnectionsRequest): Promise<event_types.ListCurrentConnectionsResponse>;
13
13
  [Symbol.asyncDispose](): Promise<void>;
14
14
  }
@@ -22,36 +22,39 @@ function updateDocFilter(userId, clientId) {
22
22
  }
23
23
  };
24
24
  }
25
- function timeSpan(timeframe) {
25
+ function timeSpan(period, timeframe = 1) {
26
26
  const date = new Date();
27
- const { year, month, day, today } = parseDate(date);
28
- switch (timeframe) {
27
+ const { year, month, today } = parseDate(date);
28
+ switch (period) {
29
29
  case 'month': {
30
- // Cron should run the first day of the new month, this then retrieves from the 1st to the last day of the month
31
- const thisMonth = month;
32
- const nextMonth = month == 11 ? 0 : month + 1;
33
- return { $gte: new Date(year, thisMonth), $lte: new Date(year, nextMonth) };
30
+ return { $lte: date, $gte: new Date(year, date.getMonth() - timeframe) };
34
31
  }
35
32
  case 'week': {
36
33
  // Back tracks the date to the previous week Monday to Sunday
37
- const daysToSunday = 0 - day;
38
- const weekEndDate = new Date(date);
39
- weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
40
- const weekStartDate = new Date(weekEndDate);
41
- weekStartDate.setDate(weekStartDate.getDate() - 6);
34
+ // const daysToSunday = 0 - day;
35
+ // const weekEndDate = new Date(date);
36
+ // weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
37
+ const weekStartDate = new Date(date);
38
+ weekStartDate.setDate(weekStartDate.getDate() - 6 * timeframe);
42
39
  const weekStart = parseDate(weekStartDate);
43
- const weekEnd = parseDate(weekEndDate);
44
40
  return {
45
41
  $gte: new Date(weekStart.year, weekStart.month, weekStart.today),
46
- $lte: new Date(weekEnd.year, weekEnd.month, weekEnd.today)
42
+ $lte: new Date(year, month, today)
43
+ };
44
+ }
45
+ case 'hour': {
46
+ // Get the last hour from the current time
47
+ const previousHour = date.getHours() - timeframe;
48
+ return {
49
+ $gte: new Date(year, month, today, previousHour),
50
+ $lt: new Date(year, month, today, date.getHours())
47
51
  };
48
52
  }
49
53
  default: {
50
54
  // Start from today to just before tomorrow
51
- const nextDay = today + 1;
52
55
  return {
53
- $gte: new Date(year, month, today),
54
- $lt: new Date(year, month, nextDay)
56
+ $lte: new Date(year, month, today),
57
+ $gte: new Date(year, month, today - timeframe)
55
58
  };
56
59
  }
57
60
  }
@@ -64,11 +67,14 @@ export class MongoReportStorage {
64
67
  this.db = db;
65
68
  }
66
69
  async deleteOldSdkData(data) {
67
- console.log(data);
70
+ const { period, timeframe } = data;
71
+ await this.db.sdk_report_events.deleteMany({
72
+ connect_at: timeSpan(period, timeframe),
73
+ $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
74
+ });
68
75
  }
69
76
  async scrapeSdkData(data) {
70
- const timespanFilter = timeSpan(data.scrape_time);
71
- console.log(timespanFilter);
77
+ const timespanFilter = timeSpan(data.period);
72
78
  const result = await this.db.sdk_report_events
73
79
  .aggregate([
74
80
  {
@@ -133,9 +139,9 @@ export class MongoReportStorage {
133
139
  },
134
140
  {
135
141
  $project: {
136
- unique_users_count: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
137
- unique_user_sdk_count: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
138
- unique_user_client_count: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
142
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
143
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
144
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
139
145
  sdk_versions: { $arrayToObject: '$sdk_versions_array' }
140
146
  }
141
147
  }
@@ -164,29 +170,83 @@ export class MongoReportStorage {
164
170
  });
165
171
  }
166
172
  async listCurrentConnections(data) {
173
+ const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
174
+ console.log({ timespanFilter });
167
175
  const result = await this.db.sdk_report_events
168
176
  .aggregate([
169
177
  {
170
- $group: {
171
- _id: null,
172
- user_ids: { $addToSet: '$user_id' },
173
- client_ids: { $addToSet: '$client_id' },
174
- sdks: { $addToSet: '$sdk' }
178
+ $match: {
179
+ disconnect_at: { $exists: false },
180
+ jwt_exp: { $gt: new Date() },
181
+ ...timespanFilter
182
+ }
183
+ },
184
+ {
185
+ $facet: {
186
+ unique_users: [
187
+ {
188
+ $group: {
189
+ _id: '$user_id'
190
+ }
191
+ },
192
+ {
193
+ $count: 'count'
194
+ }
195
+ ],
196
+ unique_user_sdk: [
197
+ {
198
+ $group: {
199
+ _id: {
200
+ user_id: '$user_id',
201
+ sdk: '$sdk'
202
+ }
203
+ }
204
+ },
205
+ {
206
+ $count: 'count'
207
+ }
208
+ ],
209
+ unique_user_client: [
210
+ {
211
+ $group: {
212
+ _id: {
213
+ user_id: '$user_id',
214
+ client_id: '$client_id'
215
+ }
216
+ }
217
+ },
218
+ {
219
+ $count: 'count'
220
+ }
221
+ ],
222
+ sdk_versions_array: [
223
+ {
224
+ $group: {
225
+ _id: '$sdk',
226
+ count: { $sum: 1 }
227
+ }
228
+ },
229
+ {
230
+ $project: {
231
+ _id: 0,
232
+ k: '$_id',
233
+ v: '$count'
234
+ }
235
+ }
236
+ ]
175
237
  }
176
238
  },
177
239
  {
178
240
  $project: {
179
- _id: 0,
180
- users: '$user_ids',
181
- clients: '$client_ids',
182
- sdks: '$sdks'
241
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
242
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
243
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
244
+ sdk_versions: { $arrayToObject: '$sdk_versions_array' }
183
245
  }
184
246
  }
185
247
  ])
186
248
  .toArray();
187
- return {
188
- ...result[0]
189
- };
249
+ return result[0];
190
250
  }
191
251
  async [Symbol.asyncDispose]() {
192
252
  // No-op
@@ -1 +1 @@
1
- {"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@powersync/service-module-mongodb-storage",
3
3
  "repository": "https://github.com/powersync-ja/powersync-service",
4
4
  "types": "dist/index.d.ts",
5
- "version": "0.0.0-dev-20250722150151",
5
+ "version": "0.0.0-dev-20250723084344",
6
6
  "main": "dist/index.js",
7
7
  "license": "FSL-1.1-Apache-2.0",
8
8
  "type": "module",
@@ -27,15 +27,15 @@
27
27
  "lru-cache": "^10.2.2",
28
28
  "ts-codec": "^1.3.0",
29
29
  "uuid": "^11.1.0",
30
- "@powersync/lib-service-mongodb": "0.0.0-dev-20250722150151",
31
- "@powersync/lib-services-framework": "0.0.0-dev-20250722150151",
32
- "@powersync/service-core": "0.0.0-dev-20250722150151",
33
- "@powersync/service-types": "0.0.0-dev-20250722150151",
30
+ "@powersync/lib-service-mongodb": "0.0.0-dev-20250723084344",
31
+ "@powersync/lib-services-framework": "0.0.0-dev-20250723084344",
32
+ "@powersync/service-core": "0.0.0-dev-20250723084344",
33
+ "@powersync/service-types": "0.0.0-dev-20250723084344",
34
34
  "@powersync/service-jsonbig": "0.17.10",
35
35
  "@powersync/service-sync-rules": "0.27.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@powersync/service-core-tests": "0.0.0-dev-20250722150151"
38
+ "@powersync/service-core-tests": "0.0.0-dev-20250723084344"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsc -b",
@@ -28,36 +28,39 @@ function updateDocFilter(userId: string, clientId: string) {
28
28
  };
29
29
  }
30
30
 
31
- function timeSpan(timeframe: event_types.TimeFrames) {
31
+ function timeSpan(period: event_types.TimeFrames, timeframe: number = 1): mongo.Filter<mongo.Document> {
32
32
  const date = new Date();
33
- const { year, month, day, today } = parseDate(date);
34
- switch (timeframe) {
33
+ const { year, month, today } = parseDate(date);
34
+ switch (period) {
35
35
  case 'month': {
36
- // Cron should run the first day of the new month, this then retrieves from the 1st to the last day of the month
37
- const thisMonth = month;
38
- const nextMonth = month == 11 ? 0 : month + 1;
39
- return { $gte: new Date(year, thisMonth), $lte: new Date(year, nextMonth) };
36
+ return { $lte: date, $gte: new Date(year, date.getMonth() - timeframe) };
40
37
  }
41
38
  case 'week': {
42
39
  // Back tracks the date to the previous week Monday to Sunday
43
- const daysToSunday = 0 - day;
44
- const weekEndDate = new Date(date);
45
- weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
46
- const weekStartDate = new Date(weekEndDate);
47
- weekStartDate.setDate(weekStartDate.getDate() - 6);
40
+ // const daysToSunday = 0 - day;
41
+ // const weekEndDate = new Date(date);
42
+ // weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
43
+ const weekStartDate = new Date(date);
44
+ weekStartDate.setDate(weekStartDate.getDate() - 6 * timeframe);
48
45
  const weekStart = parseDate(weekStartDate);
49
- const weekEnd = parseDate(weekEndDate);
50
46
  return {
51
47
  $gte: new Date(weekStart.year, weekStart.month, weekStart.today),
52
- $lte: new Date(weekEnd.year, weekEnd.month, weekEnd.today)
48
+ $lte: new Date(year, month, today)
49
+ };
50
+ }
51
+ case 'hour': {
52
+ // Get the last hour from the current time
53
+ const previousHour = date.getHours() - timeframe;
54
+ return {
55
+ $gte: new Date(year, month, today, previousHour),
56
+ $lt: new Date(year, month, today, date.getHours())
53
57
  };
54
58
  }
55
59
  default: {
56
60
  // Start from today to just before tomorrow
57
- const nextDay = today + 1;
58
61
  return {
59
- $gte: new Date(year, month, today),
60
- $lt: new Date(year, month, nextDay)
62
+ $lte: new Date(year, month, today),
63
+ $gte: new Date(year, month, today - timeframe)
61
64
  };
62
65
  }
63
66
  }
@@ -73,12 +76,15 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
73
76
  }
74
77
 
75
78
  async deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void> {
76
- console.log(data);
79
+ const { period, timeframe } = data;
80
+ await this.db.sdk_report_events.deleteMany({
81
+ connect_at: timeSpan(period, timeframe),
82
+ $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
83
+ });
77
84
  }
78
85
 
79
86
  async scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnectionsResponse> {
80
- const timespanFilter = timeSpan(data.scrape_time);
81
- console.log(timespanFilter);
87
+ const timespanFilter = timeSpan(data.period);
82
88
  const result = await this.db.sdk_report_events
83
89
  .aggregate([
84
90
  {
@@ -143,9 +149,9 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
143
149
  },
144
150
  {
145
151
  $project: {
146
- unique_users_count: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
147
- unique_user_sdk_count: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
148
- unique_user_client_count: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
152
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
153
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
154
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
149
155
  sdk_versions: { $arrayToObject: '$sdk_versions_array' }
150
156
  }
151
157
  }
@@ -178,30 +184,86 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
178
184
  }
179
185
  });
180
186
  }
181
- async listCurrentConnections(data: event_types.InstanceRequest): Promise<event_types.ListCurrentConnectionsResponse> {
187
+ async listCurrentConnections(
188
+ data: event_types.ListCurrentConnectionsRequest
189
+ ): Promise<event_types.ListCurrentConnectionsResponse> {
190
+ const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
191
+ console.log({ timespanFilter });
182
192
  const result = await this.db.sdk_report_events
183
- .aggregate<event_types.ListCurrentConnections>([
193
+ .aggregate([
184
194
  {
185
- $group: {
186
- _id: null,
187
- user_ids: { $addToSet: '$user_id' },
188
- client_ids: { $addToSet: '$client_id' },
189
- sdks: { $addToSet: '$sdk' }
195
+ $match: {
196
+ disconnect_at: { $exists: false },
197
+ jwt_exp: { $gt: new Date() },
198
+ ...timespanFilter
199
+ }
200
+ },
201
+ {
202
+ $facet: {
203
+ unique_users: [
204
+ {
205
+ $group: {
206
+ _id: '$user_id'
207
+ }
208
+ },
209
+ {
210
+ $count: 'count'
211
+ }
212
+ ],
213
+ unique_user_sdk: [
214
+ {
215
+ $group: {
216
+ _id: {
217
+ user_id: '$user_id',
218
+ sdk: '$sdk'
219
+ }
220
+ }
221
+ },
222
+ {
223
+ $count: 'count'
224
+ }
225
+ ],
226
+ unique_user_client: [
227
+ {
228
+ $group: {
229
+ _id: {
230
+ user_id: '$user_id',
231
+ client_id: '$client_id'
232
+ }
233
+ }
234
+ },
235
+ {
236
+ $count: 'count'
237
+ }
238
+ ],
239
+ sdk_versions_array: [
240
+ {
241
+ $group: {
242
+ _id: '$sdk',
243
+ count: { $sum: 1 }
244
+ }
245
+ },
246
+ {
247
+ $project: {
248
+ _id: 0,
249
+ k: '$_id',
250
+ v: '$count'
251
+ }
252
+ }
253
+ ]
190
254
  }
191
255
  },
192
256
  {
193
257
  $project: {
194
- _id: 0,
195
- users: '$user_ids',
196
- clients: '$client_ids',
197
- sdks: '$sdks'
258
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
259
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
260
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
261
+ sdk_versions: { $arrayToObject: '$sdk_versions_array' }
198
262
  }
199
263
  }
200
264
  ])
201
265
  .toArray();
202
- return {
203
- ...result[0]
204
- };
266
+ return result[0] as event_types.ListCurrentConnectionsResponse;
205
267
  }
206
268
 
207
269
  async [Symbol.asyncDispose]() {