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

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-20250723084344
3
+ ## 0.0.0-dev-20250723093602
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-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
13
+ - @powersync/service-core@0.0.0-dev-20250723093602
14
+ - @powersync/service-types@0.0.0-dev-20250723093602
15
+ - @powersync/lib-services-framework@0.0.0-dev-20250723093602
16
+ - @powersync/lib-service-mongodb@0.0.0-dev-20250723093602
17
17
 
18
18
  ## 0.10.4
19
19
 
@@ -5,6 +5,8 @@ export declare class MongoReportStorage implements storage.ReportStorageFactory
5
5
  private readonly client;
6
6
  readonly db: PowerSyncMongo;
7
7
  constructor(db: PowerSyncMongo);
8
+ private sdkFacetPipeline;
9
+ private sdkProjectPipeline;
8
10
  deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void>;
9
11
  scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnectionsResponse>;
10
12
  reportSdkConnect(data: event_types.SdkConnectBucketData): Promise<void>;
@@ -1,3 +1,4 @@
1
+ import { logger } from '@powersync/lib-services-framework';
1
2
  function parseDate(date) {
2
3
  const year = date.getFullYear();
3
4
  const month = date.getMonth();
@@ -30,16 +31,12 @@ function timeSpan(period, timeframe = 1) {
30
31
  return { $lte: date, $gte: new Date(year, date.getMonth() - timeframe) };
31
32
  }
32
33
  case 'week': {
33
- // Back tracks the date to the previous week Monday to Sunday
34
- // const daysToSunday = 0 - day;
35
- // const weekEndDate = new Date(date);
36
- // weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
37
34
  const weekStartDate = new Date(date);
38
35
  weekStartDate.setDate(weekStartDate.getDate() - 6 * timeframe);
39
36
  const weekStart = parseDate(weekStartDate);
40
37
  return {
41
38
  $gte: new Date(weekStart.year, weekStart.month, weekStart.today),
42
- $lte: new Date(year, month, today)
39
+ $lte: date
43
40
  };
44
41
  }
45
42
  case 'hour': {
@@ -53,7 +50,7 @@ function timeSpan(period, timeframe = 1) {
53
50
  default: {
54
51
  // Start from today to just before tomorrow
55
52
  return {
56
- $lte: new Date(year, month, today),
53
+ $lte: date,
57
54
  $gte: new Date(year, month, today - timeframe)
58
55
  };
59
56
  }
@@ -66,15 +63,87 @@ export class MongoReportStorage {
66
63
  this.client = db.client;
67
64
  this.db = db;
68
65
  }
66
+ sdkFacetPipeline() {
67
+ return {
68
+ $facet: {
69
+ unique_users: [
70
+ {
71
+ $group: {
72
+ _id: '$user_id'
73
+ }
74
+ },
75
+ {
76
+ $count: 'count'
77
+ }
78
+ ],
79
+ unique_user_sdk: [
80
+ {
81
+ $group: {
82
+ _id: {
83
+ user_id: '$user_id',
84
+ sdk: '$sdk'
85
+ }
86
+ }
87
+ },
88
+ {
89
+ $count: 'count'
90
+ }
91
+ ],
92
+ unique_user_client: [
93
+ {
94
+ $group: {
95
+ _id: {
96
+ user_id: '$user_id',
97
+ client_id: '$client_id'
98
+ }
99
+ }
100
+ },
101
+ {
102
+ $count: 'count'
103
+ }
104
+ ],
105
+ sdk_versions_array: [
106
+ {
107
+ $group: {
108
+ _id: '$sdk',
109
+ count: { $sum: 1 }
110
+ }
111
+ },
112
+ {
113
+ $project: {
114
+ _id: 0,
115
+ k: '$_id',
116
+ v: '$count'
117
+ }
118
+ }
119
+ ]
120
+ }
121
+ };
122
+ }
123
+ sdkProjectPipeline() {
124
+ return {
125
+ $project: {
126
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
127
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
128
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
129
+ sdk_versions: { $arrayToObject: '$sdk_versions_array' }
130
+ }
131
+ };
132
+ }
69
133
  async deleteOldSdkData(data) {
70
134
  const { period, timeframe } = data;
71
- await this.db.sdk_report_events.deleteMany({
135
+ const result = await this.db.sdk_report_events.deleteMany({
72
136
  connect_at: timeSpan(period, timeframe),
73
137
  $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
74
138
  });
139
+ console.log(result);
140
+ if (result.deletedCount > 0) {
141
+ logger.info(`TTL: ${result.deletedCount} documents have been removed from sdk_report_events collection`);
142
+ }
75
143
  }
76
144
  async scrapeSdkData(data) {
77
- const timespanFilter = timeSpan(data.period);
145
+ const timespanFilter = timeSpan(data.period, data.interval);
146
+ console.log({ timespanFilter });
78
147
  const result = await this.db.sdk_report_events
79
148
  .aggregate([
80
149
  {
@@ -82,69 +151,8 @@ export class MongoReportStorage {
82
151
  connect_at: timespanFilter
83
152
  }
84
153
  },
85
- {
86
- $facet: {
87
- unique_users: [
88
- {
89
- $group: {
90
- _id: '$user_id'
91
- }
92
- },
93
- {
94
- $count: 'count'
95
- }
96
- ],
97
- unique_user_sdk: [
98
- {
99
- $group: {
100
- _id: {
101
- user_id: '$user_id',
102
- sdk: '$sdk'
103
- }
104
- }
105
- },
106
- {
107
- $count: 'count'
108
- }
109
- ],
110
- unique_user_client: [
111
- {
112
- $group: {
113
- _id: {
114
- user_id: '$user_id',
115
- client_id: '$client_id'
116
- }
117
- }
118
- },
119
- {
120
- $count: 'count'
121
- }
122
- ],
123
- sdk_versions_array: [
124
- {
125
- $group: {
126
- _id: '$sdk',
127
- count: { $sum: 1 }
128
- }
129
- },
130
- {
131
- $project: {
132
- _id: 0,
133
- k: '$_id',
134
- v: '$count'
135
- }
136
- }
137
- ]
138
- }
139
- },
140
- {
141
- $project: {
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] },
145
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
146
- }
147
- }
154
+ this.sdkFacetPipeline(),
155
+ this.sdkProjectPipeline()
148
156
  ])
149
157
  .toArray();
150
158
  return result[0];
@@ -171,7 +179,6 @@ export class MongoReportStorage {
171
179
  }
172
180
  async listCurrentConnections(data) {
173
181
  const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
174
- console.log({ timespanFilter });
175
182
  const result = await this.db.sdk_report_events
176
183
  .aggregate([
177
184
  {
@@ -181,69 +188,8 @@ export class MongoReportStorage {
181
188
  ...timespanFilter
182
189
  }
183
190
  },
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
- ]
237
- }
238
- },
239
- {
240
- $project: {
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' }
245
- }
246
- }
191
+ this.sdkFacetPipeline(),
192
+ this.sdkProjectPipeline()
247
193
  ])
248
194
  .toArray();
249
195
  return result[0];
@@ -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-20250723084344",
5
+ "version": "0.0.0-dev-20250723093602",
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-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",
30
+ "@powersync/lib-service-mongodb": "0.0.0-dev-20250723093602",
31
+ "@powersync/lib-services-framework": "0.0.0-dev-20250723093602",
32
+ "@powersync/service-core": "0.0.0-dev-20250723093602",
33
+ "@powersync/service-types": "0.0.0-dev-20250723093602",
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-20250723084344"
38
+ "@powersync/service-core-tests": "0.0.0-dev-20250723093602"
39
39
  },
40
40
  "scripts": {
41
41
  "build": "tsc -b",
@@ -2,6 +2,7 @@ import { mongo } from '@powersync/lib-service-mongodb';
2
2
  import { storage } from '@powersync/service-core';
3
3
  import { event_types } from '@powersync/service-types';
4
4
  import { PowerSyncMongo } from './implementation/db.js';
5
+ import { logger } from '@powersync/lib-services-framework';
5
6
 
6
7
  function parseDate(date: Date) {
7
8
  const year = date.getFullYear();
@@ -36,16 +37,12 @@ function timeSpan(period: event_types.TimeFrames, timeframe: number = 1): mongo.
36
37
  return { $lte: date, $gte: new Date(year, date.getMonth() - timeframe) };
37
38
  }
38
39
  case 'week': {
39
- // Back tracks the date to the previous week Monday to Sunday
40
- // const daysToSunday = 0 - day;
41
- // const weekEndDate = new Date(date);
42
- // weekEndDate.setDate(weekEndDate.getDate() + daysToSunday);
43
40
  const weekStartDate = new Date(date);
44
41
  weekStartDate.setDate(weekStartDate.getDate() - 6 * timeframe);
45
42
  const weekStart = parseDate(weekStartDate);
46
43
  return {
47
44
  $gte: new Date(weekStart.year, weekStart.month, weekStart.today),
48
- $lte: new Date(year, month, today)
45
+ $lte: date
49
46
  };
50
47
  }
51
48
  case 'hour': {
@@ -59,7 +56,7 @@ function timeSpan(period: event_types.TimeFrames, timeframe: number = 1): mongo.
59
56
  default: {
60
57
  // Start from today to just before tomorrow
61
58
  return {
62
- $lte: new Date(year, month, today),
59
+ $lte: date,
63
60
  $gte: new Date(year, month, today - timeframe)
64
61
  };
65
62
  }
@@ -75,16 +72,90 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
75
72
  this.db = db;
76
73
  }
77
74
 
75
+ private sdkFacetPipeline() {
76
+ return {
77
+ $facet: {
78
+ unique_users: [
79
+ {
80
+ $group: {
81
+ _id: '$user_id'
82
+ }
83
+ },
84
+ {
85
+ $count: 'count'
86
+ }
87
+ ],
88
+ unique_user_sdk: [
89
+ {
90
+ $group: {
91
+ _id: {
92
+ user_id: '$user_id',
93
+ sdk: '$sdk'
94
+ }
95
+ }
96
+ },
97
+ {
98
+ $count: 'count'
99
+ }
100
+ ],
101
+ unique_user_client: [
102
+ {
103
+ $group: {
104
+ _id: {
105
+ user_id: '$user_id',
106
+ client_id: '$client_id'
107
+ }
108
+ }
109
+ },
110
+ {
111
+ $count: 'count'
112
+ }
113
+ ],
114
+ sdk_versions_array: [
115
+ {
116
+ $group: {
117
+ _id: '$sdk',
118
+ count: { $sum: 1 }
119
+ }
120
+ },
121
+ {
122
+ $project: {
123
+ _id: 0,
124
+ k: '$_id',
125
+ v: '$count'
126
+ }
127
+ }
128
+ ]
129
+ }
130
+ };
131
+ }
132
+
133
+ private sdkProjectPipeline() {
134
+ return {
135
+ $project: {
136
+ users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
137
+ user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
138
+ client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
139
+ sdk_versions: { $arrayToObject: '$sdk_versions_array' }
140
+ }
141
+ };
142
+ }
143
+
78
144
  async deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void> {
79
145
  const { period, timeframe } = data;
80
- await this.db.sdk_report_events.deleteMany({
146
+ const result = await this.db.sdk_report_events.deleteMany({
81
147
  connect_at: timeSpan(period, timeframe),
82
148
  $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
83
149
  });
150
+ console.log(result);
151
+ if (result.deletedCount > 0) {
152
+ logger.info(`TTL: ${result.deletedCount} documents have been removed from sdk_report_events collection`);
153
+ }
84
154
  }
85
155
 
86
156
  async scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnectionsResponse> {
87
- const timespanFilter = timeSpan(data.period);
157
+ const timespanFilter = timeSpan(data.period, data.interval);
158
+ console.log({ timespanFilter });
88
159
  const result = await this.db.sdk_report_events
89
160
  .aggregate([
90
161
  {
@@ -92,69 +163,8 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
92
163
  connect_at: timespanFilter
93
164
  }
94
165
  },
95
- {
96
- $facet: {
97
- unique_users: [
98
- {
99
- $group: {
100
- _id: '$user_id'
101
- }
102
- },
103
- {
104
- $count: 'count'
105
- }
106
- ],
107
- unique_user_sdk: [
108
- {
109
- $group: {
110
- _id: {
111
- user_id: '$user_id',
112
- sdk: '$sdk'
113
- }
114
- }
115
- },
116
- {
117
- $count: 'count'
118
- }
119
- ],
120
- unique_user_client: [
121
- {
122
- $group: {
123
- _id: {
124
- user_id: '$user_id',
125
- client_id: '$client_id'
126
- }
127
- }
128
- },
129
- {
130
- $count: 'count'
131
- }
132
- ],
133
- sdk_versions_array: [
134
- {
135
- $group: {
136
- _id: '$sdk',
137
- count: { $sum: 1 }
138
- }
139
- },
140
- {
141
- $project: {
142
- _id: 0,
143
- k: '$_id',
144
- v: '$count'
145
- }
146
- }
147
- ]
148
- }
149
- },
150
- {
151
- $project: {
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] },
155
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
156
- }
157
- }
166
+ this.sdkFacetPipeline(),
167
+ this.sdkProjectPipeline()
158
168
  ])
159
169
  .toArray();
160
170
  return result[0] as event_types.ListCurrentConnectionsResponse;
@@ -188,7 +198,6 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
188
198
  data: event_types.ListCurrentConnectionsRequest
189
199
  ): Promise<event_types.ListCurrentConnectionsResponse> {
190
200
  const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
191
- console.log({ timespanFilter });
192
201
  const result = await this.db.sdk_report_events
193
202
  .aggregate([
194
203
  {
@@ -198,69 +207,8 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
198
207
  ...timespanFilter
199
208
  }
200
209
  },
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
- ]
254
- }
255
- },
256
- {
257
- $project: {
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' }
262
- }
263
- }
210
+ this.sdkFacetPipeline(),
211
+ this.sdkProjectPipeline()
264
212
  ])
265
213
  .toArray();
266
214
  return result[0] as event_types.ListCurrentConnectionsResponse;