Skip to content

Commit ce5092b

Browse files
changed document type mongo
1 parent 5359d09 commit ce5092b

File tree

8 files changed

+110
-24
lines changed

8 files changed

+110
-24
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { migrations } from '@powersync/service-core';
2+
import * as storage from '../../../storage/storage-index.js';
3+
import { MongoStorageConfig } from '../../../types/types.js';
4+
5+
export const up: migrations.PowerSyncMigrationFunction = async (context) => {
6+
const {
7+
service_context: { configuration }
8+
} = context;
9+
const db = storage.createPowerSyncMongo(configuration.storage as MongoStorageConfig);
10+
11+
try {
12+
await db.createSdkReportingCollection();
13+
14+
await db.sdk_report_events.createIndex(
15+
{
16+
connect_at: 1,
17+
jwt_exp: 1,
18+
disconnect_at: 1
19+
},
20+
{ name: 'connect_at' }
21+
);
22+
23+
await db.sdk_report_events.createIndex(
24+
{
25+
user_id: 1,
26+
sdk: 1,
27+
version: 1
28+
},
29+
{ name: 'user_id' }
30+
);
31+
await db.sdk_report_events.createIndex(
32+
{
33+
client_id: 1
34+
},
35+
{ name: 'client_id' }
36+
);
37+
} finally {
38+
await db.client.close();
39+
}
40+
};
41+
42+
export const down: migrations.PowerSyncMigrationFunction = async (context) => {
43+
const {
44+
service_context: { configuration }
45+
} = context;
46+
47+
const db = storage.createPowerSyncMongo(configuration.storage as MongoStorageConfig);
48+
49+
try {
50+
if (await db.write_checkpoints.indexExists('connect_at')) {
51+
await db.write_checkpoints.dropIndex('connect_at');
52+
}
53+
if (await db.custom_write_checkpoints.indexExists('user_id')) {
54+
await db.custom_write_checkpoints.dropIndex('user_id');
55+
}
56+
if (await db.custom_write_checkpoints.indexExists('client_id')) {
57+
await db.custom_write_checkpoints.dropIndex('client_id');
58+
}
59+
await db.db.dropCollection('sdk_report_events');
60+
} finally {
61+
await db.client.close();
62+
}
63+
};

modules/module-mongodb-storage/src/storage/MongoReportStorage.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { mongo } from '@powersync/lib-service-mongodb';
22
import { storage } from '@powersync/service-core';
33
import { event_types } from '@powersync/service-types';
44
import { PowerSyncMongo } from './implementation/db.js';
5+
import { SdkConnectDocument } from './implementation/models.js';
56

67
export class MongoReportStorage implements storage.ReportStorageFactory {
78
private readonly client: mongo.MongoClient;
@@ -16,10 +17,10 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
1617
console.log('MongoReportStorage.scrapeSdkData', data);
1718
}
1819

19-
async reportSdkConnect(data: event_types.SdkConnectEventData): Promise<void> {
20-
console.log('MongoReportStorage.reportSdkConnect', data);
20+
async reportSdkConnect(data: SdkConnectDocument): Promise<void> {
21+
await this.db.sdk_report_events.insertOne(data);
2122
}
22-
async reportSdkDisconnect(data: event_types.SdkDisconnectEventData): Promise<void> {
23+
async reportSdkDisconnect(data: SdkConnectDocument): Promise<void> {
2324
console.log('MongoReportStorage.reportSdkDisconnect', data);
2425
}
2526
async listCurrentConnections(data: event_types.PaginatedInstanceRequest): Promise<void> {

modules/module-mongodb-storage/src/storage/implementation/db.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
CustomWriteCheckpointDocument,
1313
IdSequenceDocument,
1414
InstanceDocument,
15-
SdkConnectEventDocument,
15+
SdkConnectDocument,
1616
SourceTableDocument,
1717
SyncRuleDocument,
1818
WriteCheckpointDocument
@@ -38,7 +38,7 @@ export class PowerSyncMongo {
3838
readonly locks: mongo.Collection<lib_mongo.locks.Lock>;
3939
readonly bucket_state: mongo.Collection<BucketStateDocument>;
4040
readonly checkpoint_events: mongo.Collection<CheckpointEventDocument>;
41-
readonly sdk_connect_events: mongo.Collection<SdkConnectEventDocument>;
41+
readonly sdk_report_events: mongo.Collection<SdkConnectDocument>;
4242

4343
readonly client: mongo.MongoClient;
4444
readonly db: mongo.Db;
@@ -63,7 +63,7 @@ export class PowerSyncMongo {
6363
this.locks = this.db.collection('locks');
6464
this.bucket_state = this.db.collection('bucket_state');
6565
this.checkpoint_events = this.db.collection('checkpoint_events');
66-
this.sdk_connect_events = this.db.collection('sdk_connect_events');
66+
this.sdk_report_events = this.db.collection('sdk_report_events');
6767
}
6868

6969
/**
@@ -130,6 +130,20 @@ export class PowerSyncMongo {
130130
max: 50 // max number of documents
131131
});
132132
}
133+
134+
/**
135+
* Only use in migrations and tests.
136+
*/
137+
async createSdkReportingCollection() {
138+
const existingCollections = await this.db
139+
.listCollections({ name: 'sdk_report_events' }, { nameOnly: false })
140+
.toArray();
141+
const collection = existingCollections[0];
142+
if (collection != null) {
143+
return;
144+
}
145+
await this.db.createCollection('sdk_report_events');
146+
}
133147
}
134148

135149
export function createPowerSyncMongo(config: MongoStorageConfig, options?: lib_mongo.MongoConnectionOptions) {

modules/module-mongodb-storage/src/storage/implementation/models.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { InternalOpId, storage } from '@powersync/service-core';
22
import { SqliteJsonValue } from '@powersync/service-sync-rules';
33
import * as bson from 'bson';
4+
import { event_types } from '@powersync/service-types';
45

56
/**
67
* Replica id uniquely identifying a row on the source database.
@@ -214,11 +215,4 @@ export interface InstanceDocument {
214215
_id: string;
215216
}
216217

217-
export interface SdkConnectEventDocument {
218-
version: string;
219-
sdk: string;
220-
user_agent: string;
221-
client_id: string;
222-
user_id: string;
223-
jwt_exp: number;
224-
}
218+
export interface SdkConnectDocument extends event_types.SdkConnectDocument {}

packages/service-core/src/routes/endpoints/socket-route.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ErrorCode, errors, schema } from '@powersync/lib-services-framework';
22
import { RequestParameters } from '@powersync/service-sync-rules';
3+
import * as bson from 'bson';
34
import { serialize } from 'bson';
45

56
import * as sync from '../../sync/sync-index.js';
@@ -24,6 +25,7 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
2425
};
2526

2627
const sdkData: event_types.SdkUserData = {
28+
_id: new bson.ObjectId(),
2729
client_id: params.client_id,
2830
user_id: context.user_id!,
2931
user_agent: context.user_agent,

packages/service-core/src/routes/endpoints/sync-stream.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ErrorCode, errors, router, schema } from '@powersync/lib-services-framework';
22
import { RequestParameters } from '@powersync/service-sync-rules';
33
import { Readable } from 'stream';
4-
4+
import * as bson from 'bson';
55
import * as sync from '../../sync/sync-index.js';
66
import * as util from '../../util/util-index.js';
77

@@ -34,6 +34,7 @@ export const syncStreamed = routeDefinition({
3434
};
3535

3636
const sdkData: event_types.SdkUserData = {
37+
_id: new bson.ObjectId(),
3738
client_id: clientId,
3839
user_id: payload.context.user_id!,
3940
user_agent: userAgent as string,
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
import {
2-
PaginatedInstanceRequest,
3-
SdkConnectEventData,
4-
SdkDisconnectEventData
5-
} from '@powersync/service-types/dist/events.js';
1+
import { PaginatedInstanceRequest, SdkConnectDocument } from '@powersync/service-types/dist/events.js';
62

73
export interface ReportStorageFactory extends AsyncDisposable {
8-
reportSdkConnect(data: SdkConnectEventData): Promise<void>;
9-
reportSdkDisconnect(data: SdkDisconnectEventData): Promise<void>;
4+
reportSdkConnect(data: SdkConnectDocument): Promise<void>;
5+
reportSdkDisconnect(data: SdkConnectDocument): Promise<void>;
106
listCurrentConnections(data: PaginatedInstanceRequest): Promise<void>;
117
scrapeSdkData(data: PaginatedInstanceRequest): Promise<void>;
128
}

packages/types/src/events.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import * as bson from 'bson';
2+
13
export enum EmitterEngineEvents {
24
SDK_CONNECT_EVENT = 'sdk-connect-event',
35
SDK_DISCONNECT_EVENT = 'sdk-disconnect-event'
@@ -12,20 +14,33 @@ export type SubscribeEvents = {
1214
};
1315

1416
export type SdkUserData = {
17+
_id: bson.ObjectId;
1518
client_id?: string;
1619
user_id: string;
1720
user_agent?: string;
1821
jwt_exp: JwtExp;
1922
};
2023

2124
export type SdkConnectEventData = {
22-
connect_at: number;
25+
connect_at: Date;
2326
} & SdkUserData;
2427

2528
export type SdkDisconnectEventData = {
26-
disconnect_at: number;
29+
disconnect_at: Date;
2730
} & SdkUserData;
2831

32+
export type SdkConnectDocument = {
33+
_id: bson.ObjectId;
34+
sdk: string;
35+
version: string;
36+
user_agent: string;
37+
client_id: string;
38+
user_id: string;
39+
jwt_exp?: Date;
40+
connect_at: Date;
41+
disconnect_at?: Date;
42+
};
43+
2944
export type PaginatedInstanceRequest = {
3045
app_id: string;
3146
org_id: string;

0 commit comments

Comments
 (0)