@powersync/service-module-mongodb-storage 0.0.0-dev-20250723084844 → 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-20250723084844
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-20250723084844
14
- - @powersync/service-types@0.0.0-dev-20250723084844
15
- - @powersync/lib-services-framework@0.0.0-dev-20250723084844
16
- - @powersync/lib-service-mongodb@0.0.0-dev-20250723084844
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();
@@ -62,15 +63,87 @@ export class MongoReportStorage {
62
63
  this.client = db.client;
63
64
  this.db = db;
64
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
+ }
65
133
  async deleteOldSdkData(data) {
66
134
  const { period, timeframe } = data;
67
- await this.db.sdk_report_events.deleteMany({
135
+ const result = await this.db.sdk_report_events.deleteMany({
68
136
  connect_at: timeSpan(period, timeframe),
69
137
  $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
70
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
+ }
71
143
  }
72
144
  async scrapeSdkData(data) {
73
- const timespanFilter = timeSpan(data.period);
145
+ const timespanFilter = timeSpan(data.period, data.interval);
146
+ console.log({ timespanFilter });
74
147
  const result = await this.db.sdk_report_events
75
148
  .aggregate([
76
149
  {
@@ -78,69 +151,8 @@ export class MongoReportStorage {
78
151
  connect_at: timespanFilter
79
152
  }
80
153
  },
81
- {
82
- $facet: {
83
- unique_users: [
84
- {
85
- $group: {
86
- _id: '$user_id'
87
- }
88
- },
89
- {
90
- $count: 'count'
91
- }
92
- ],
93
- unique_user_sdk: [
94
- {
95
- $group: {
96
- _id: {
97
- user_id: '$user_id',
98
- sdk: '$sdk'
99
- }
100
- }
101
- },
102
- {
103
- $count: 'count'
104
- }
105
- ],
106
- unique_user_client: [
107
- {
108
- $group: {
109
- _id: {
110
- user_id: '$user_id',
111
- client_id: '$client_id'
112
- }
113
- }
114
- },
115
- {
116
- $count: 'count'
117
- }
118
- ],
119
- sdk_versions_array: [
120
- {
121
- $group: {
122
- _id: '$sdk',
123
- count: { $sum: 1 }
124
- }
125
- },
126
- {
127
- $project: {
128
- _id: 0,
129
- k: '$_id',
130
- v: '$count'
131
- }
132
- }
133
- ]
134
- }
135
- },
136
- {
137
- $project: {
138
- users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
139
- user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
140
- client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
141
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
142
- }
143
- }
154
+ this.sdkFacetPipeline(),
155
+ this.sdkProjectPipeline()
144
156
  ])
145
157
  .toArray();
146
158
  return result[0];
@@ -167,7 +179,6 @@ export class MongoReportStorage {
167
179
  }
168
180
  async listCurrentConnections(data) {
169
181
  const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
170
- console.log({ timespanFilter });
171
182
  const result = await this.db.sdk_report_events
172
183
  .aggregate([
173
184
  {
@@ -177,69 +188,8 @@ export class MongoReportStorage {
177
188
  ...timespanFilter
178
189
  }
179
190
  },
180
- {
181
- $facet: {
182
- unique_users: [
183
- {
184
- $group: {
185
- _id: '$user_id'
186
- }
187
- },
188
- {
189
- $count: 'count'
190
- }
191
- ],
192
- unique_user_sdk: [
193
- {
194
- $group: {
195
- _id: {
196
- user_id: '$user_id',
197
- sdk: '$sdk'
198
- }
199
- }
200
- },
201
- {
202
- $count: 'count'
203
- }
204
- ],
205
- unique_user_client: [
206
- {
207
- $group: {
208
- _id: {
209
- user_id: '$user_id',
210
- client_id: '$client_id'
211
- }
212
- }
213
- },
214
- {
215
- $count: 'count'
216
- }
217
- ],
218
- sdk_versions_array: [
219
- {
220
- $group: {
221
- _id: '$sdk',
222
- count: { $sum: 1 }
223
- }
224
- },
225
- {
226
- $project: {
227
- _id: 0,
228
- k: '$_id',
229
- v: '$count'
230
- }
231
- }
232
- ]
233
- }
234
- },
235
- {
236
- $project: {
237
- users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
238
- user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
239
- client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
240
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
241
- }
242
- }
191
+ this.sdkFacetPipeline(),
192
+ this.sdkProjectPipeline()
243
193
  ])
244
194
  .toArray();
245
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-20250723084844",
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-20250723084844",
31
- "@powersync/lib-services-framework": "0.0.0-dev-20250723084844",
32
- "@powersync/service-core": "0.0.0-dev-20250723084844",
33
- "@powersync/service-types": "0.0.0-dev-20250723084844",
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-20250723084844"
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();
@@ -71,16 +72,90 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
71
72
  this.db = db;
72
73
  }
73
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
+
74
144
  async deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void> {
75
145
  const { period, timeframe } = data;
76
- await this.db.sdk_report_events.deleteMany({
146
+ const result = await this.db.sdk_report_events.deleteMany({
77
147
  connect_at: timeSpan(period, timeframe),
78
148
  $or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
79
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
+ }
80
154
  }
81
155
 
82
156
  async scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnectionsResponse> {
83
- const timespanFilter = timeSpan(data.period);
157
+ const timespanFilter = timeSpan(data.period, data.interval);
158
+ console.log({ timespanFilter });
84
159
  const result = await this.db.sdk_report_events
85
160
  .aggregate([
86
161
  {
@@ -88,69 +163,8 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
88
163
  connect_at: timespanFilter
89
164
  }
90
165
  },
91
- {
92
- $facet: {
93
- unique_users: [
94
- {
95
- $group: {
96
- _id: '$user_id'
97
- }
98
- },
99
- {
100
- $count: 'count'
101
- }
102
- ],
103
- unique_user_sdk: [
104
- {
105
- $group: {
106
- _id: {
107
- user_id: '$user_id',
108
- sdk: '$sdk'
109
- }
110
- }
111
- },
112
- {
113
- $count: 'count'
114
- }
115
- ],
116
- unique_user_client: [
117
- {
118
- $group: {
119
- _id: {
120
- user_id: '$user_id',
121
- client_id: '$client_id'
122
- }
123
- }
124
- },
125
- {
126
- $count: 'count'
127
- }
128
- ],
129
- sdk_versions_array: [
130
- {
131
- $group: {
132
- _id: '$sdk',
133
- count: { $sum: 1 }
134
- }
135
- },
136
- {
137
- $project: {
138
- _id: 0,
139
- k: '$_id',
140
- v: '$count'
141
- }
142
- }
143
- ]
144
- }
145
- },
146
- {
147
- $project: {
148
- users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
149
- user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
150
- client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
151
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
152
- }
153
- }
166
+ this.sdkFacetPipeline(),
167
+ this.sdkProjectPipeline()
154
168
  ])
155
169
  .toArray();
156
170
  return result[0] as event_types.ListCurrentConnectionsResponse;
@@ -184,7 +198,6 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
184
198
  data: event_types.ListCurrentConnectionsRequest
185
199
  ): Promise<event_types.ListCurrentConnectionsResponse> {
186
200
  const timespanFilter = data.period ? { connect_at: timeSpan(data.period) } : undefined;
187
- console.log({ timespanFilter });
188
201
  const result = await this.db.sdk_report_events
189
202
  .aggregate([
190
203
  {
@@ -194,69 +207,8 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
194
207
  ...timespanFilter
195
208
  }
196
209
  },
197
- {
198
- $facet: {
199
- unique_users: [
200
- {
201
- $group: {
202
- _id: '$user_id'
203
- }
204
- },
205
- {
206
- $count: 'count'
207
- }
208
- ],
209
- unique_user_sdk: [
210
- {
211
- $group: {
212
- _id: {
213
- user_id: '$user_id',
214
- sdk: '$sdk'
215
- }
216
- }
217
- },
218
- {
219
- $count: 'count'
220
- }
221
- ],
222
- unique_user_client: [
223
- {
224
- $group: {
225
- _id: {
226
- user_id: '$user_id',
227
- client_id: '$client_id'
228
- }
229
- }
230
- },
231
- {
232
- $count: 'count'
233
- }
234
- ],
235
- sdk_versions_array: [
236
- {
237
- $group: {
238
- _id: '$sdk',
239
- count: { $sum: 1 }
240
- }
241
- },
242
- {
243
- $project: {
244
- _id: 0,
245
- k: '$_id',
246
- v: '$count'
247
- }
248
- }
249
- ]
250
- }
251
- },
252
- {
253
- $project: {
254
- users: { $ifNull: [{ $arrayElemAt: ['$unique_users.count', 0] }, 0] },
255
- user_sdk: { $ifNull: [{ $arrayElemAt: ['$unique_user_sdk.count', 0] }, 0] },
256
- client_user: { $ifNull: [{ $arrayElemAt: ['$unique_user_client.count', 0] }, 0] },
257
- sdk_versions: { $arrayToObject: '$sdk_versions_array' }
258
- }
259
- }
210
+ this.sdkFacetPipeline(),
211
+ this.sdkProjectPipeline()
260
212
  ])
261
213
  .toArray();
262
214
  return result[0] as event_types.ListCurrentConnectionsResponse;