@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-
|
|
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-
|
|
14
|
-
- @powersync/service-types@0.0.0-dev-
|
|
15
|
-
- @powersync/lib-services-framework@0.0.0-dev-
|
|
16
|
-
- @powersync/lib-service-mongodb@0.0.0-dev-
|
|
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.
|
|
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,
|
|
28
|
-
switch (
|
|
27
|
+
const { year, month, today } = parseDate(date);
|
|
28
|
+
switch (period) {
|
|
29
29
|
case 'month': {
|
|
30
|
-
|
|
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(
|
|
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(
|
|
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
|
-
$
|
|
54
|
-
$
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
$
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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":"AAKA,SAAS,SAAS,CAAC,IAAU;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK;QACL,GAAG;KACJ,CAAC;AACJ,CAAC;AACD,SAAS,eAAe,CAAC,MAAc,EAAE,QAAgB;IACvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,OAAO;QACL,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE;YACV,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;YAClC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;SACpC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,
|
|
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-
|
|
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-
|
|
31
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
32
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
33
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
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-
|
|
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(
|
|
31
|
+
function timeSpan(period: event_types.TimeFrames, timeframe: number = 1): mongo.Filter<mongo.Document> {
|
|
32
32
|
const date = new Date();
|
|
33
|
-
const { year, month,
|
|
34
|
-
switch (
|
|
33
|
+
const { year, month, today } = parseDate(date);
|
|
34
|
+
switch (period) {
|
|
35
35
|
case 'month': {
|
|
36
|
-
|
|
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(
|
|
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(
|
|
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
|
-
$
|
|
60
|
-
$
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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(
|
|
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
|
|
193
|
+
.aggregate([
|
|
184
194
|
{
|
|
185
|
-
$
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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]() {
|