@peers-app/peers-sdk 0.14.0 → 0.15.0
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/dist/context/data-context.d.ts +4 -4
- package/dist/context/data-context.js +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context/index.js +4 -0
- package/dist/context/user-context-singleton.js +13 -14
- package/dist/context/user-context.d.ts +4 -4
- package/dist/context/user-context.js +48 -31
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/assistants.js +35 -24
- package/dist/data/change-tracking.d.ts +8 -8
- package/dist/data/change-tracking.js +45 -39
- package/dist/data/channels.js +5 -5
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.js +21 -23
- package/dist/data/data-locks.test.js +73 -75
- package/dist/data/device-sync-info.d.ts +1 -1
- package/dist/data/device-sync-info.js +4 -4
- package/dist/data/devices.d.ts +1 -1
- package/dist/data/devices.js +9 -12
- package/dist/data/embeddings.js +14 -11
- package/dist/data/files/file-read-stream.d.ts +2 -2
- package/dist/data/files/file-read-stream.js +23 -14
- package/dist/data/files/file-write-stream.d.ts +2 -2
- package/dist/data/files/file-write-stream.js +8 -8
- package/dist/data/files/file.types.d.ts +2 -2
- package/dist/data/files/file.types.js +17 -11
- package/dist/data/files/files.d.ts +6 -6
- package/dist/data/files/files.js +17 -19
- package/dist/data/files/files.test.js +213 -214
- package/dist/data/files/index.d.ts +4 -4
- package/dist/data/files/index.js +4 -4
- package/dist/data/group-member-roles.js +2 -2
- package/dist/data/group-members.d.ts +5 -5
- package/dist/data/group-members.js +27 -18
- package/dist/data/group-members.test.js +73 -73
- package/dist/data/group-permissions.d.ts +3 -3
- package/dist/data/group-permissions.js +13 -11
- package/dist/data/group-share.d.ts +2 -2
- package/dist/data/group-share.js +29 -24
- package/dist/data/groups.d.ts +4 -4
- package/dist/data/groups.js +27 -19
- package/dist/data/groups.test.js +44 -44
- package/dist/data/index.d.ts +6 -6
- package/dist/data/index.js +6 -6
- package/dist/data/knowledge/peer-types.js +9 -9
- package/dist/data/messages.d.ts +5 -5
- package/dist/data/messages.js +43 -30
- package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +10 -12
- package/dist/data/orm/cursor.d.ts +1 -1
- package/dist/data/orm/cursor.js +2 -2
- package/dist/data/orm/cursor.test.js +92 -93
- package/dist/data/orm/data-query.d.ts +3 -3
- package/dist/data/orm/data-query.js +24 -18
- package/dist/data/orm/data-query.mongo.d.ts +1 -1
- package/dist/data/orm/data-query.mongo.js +49 -51
- package/dist/data/orm/data-query.mongo.test.js +173 -204
- package/dist/data/orm/data-query.sqlite.d.ts +1 -1
- package/dist/data/orm/data-query.sqlite.js +84 -73
- package/dist/data/orm/data-query.sqlite.test.js +164 -176
- package/dist/data/orm/data-query.test.js +216 -224
- package/dist/data/orm/decorators.js +3 -3
- package/dist/data/orm/dependency-injection.test.js +53 -56
- package/dist/data/orm/doc.d.ts +4 -4
- package/dist/data/orm/doc.js +17 -21
- package/dist/data/orm/event-registry.d.ts +1 -1
- package/dist/data/orm/event-registry.test.js +16 -16
- package/dist/data/orm/factory.d.ts +2 -2
- package/dist/data/orm/factory.js +33 -33
- package/dist/data/orm/index.d.ts +10 -10
- package/dist/data/orm/index.js +10 -10
- package/dist/data/orm/multi-cursors.d.ts +1 -1
- package/dist/data/orm/multi-cursors.js +6 -6
- package/dist/data/orm/multi-cursors.test.js +152 -144
- package/dist/data/orm/sql.data-source.d.ts +7 -7
- package/dist/data/orm/sql.data-source.js +88 -93
- package/dist/data/orm/sql.data-source.test.js +109 -101
- package/dist/data/orm/subscribable.data-source.d.ts +4 -4
- package/dist/data/orm/subscribable.data-source.js +5 -5
- package/dist/data/orm/table-container-events.test.js +34 -26
- package/dist/data/orm/table-container.d.ts +6 -6
- package/dist/data/orm/table-container.js +33 -21
- package/dist/data/orm/table-container.test.js +64 -53
- package/dist/data/orm/table-definitions.system.d.ts +3 -3
- package/dist/data/orm/table-definitions.system.js +3 -3
- package/dist/data/orm/table-definitions.type.d.ts +5 -5
- package/dist/data/orm/table-dependencies.d.ts +2 -2
- package/dist/data/orm/table.d.ts +5 -5
- package/dist/data/orm/table.event-source.test.js +105 -115
- package/dist/data/orm/table.js +35 -34
- package/dist/data/orm/types.d.ts +3 -3
- package/dist/data/orm/types.js +26 -25
- package/dist/data/orm/types.test.js +166 -92
- package/dist/data/package-permissions.d.ts +1 -1
- package/dist/data/package-permissions.js +2 -2
- package/dist/data/package-version-permissions.d.ts +1 -1
- package/dist/data/package-version-permissions.js +2 -2
- package/dist/data/package-versions.d.ts +9 -9
- package/dist/data/package-versions.js +47 -33
- package/dist/data/packages.d.ts +2 -2
- package/dist/data/packages.js +36 -18
- package/dist/data/packages.utils.d.ts +2 -2
- package/dist/data/packages.utils.js +4 -4
- package/dist/data/persistent-vars.d.ts +15 -15
- package/dist/data/persistent-vars.js +165 -154
- package/dist/data/table-definitions-table.d.ts +5 -5
- package/dist/data/table-definitions-table.js +13 -12
- package/dist/data/tool-tests.js +6 -6
- package/dist/data/tools.js +29 -19
- package/dist/data/user-permissions.d.ts +1 -1
- package/dist/data/user-permissions.js +5 -5
- package/dist/data/user-permissions.test.js +90 -88
- package/dist/data/user-trust-levels.js +10 -10
- package/dist/data/users.d.ts +4 -4
- package/dist/data/users.js +16 -15
- package/dist/data/voice-messages.d.ts +2 -2
- package/dist/data/voice-messages.js +13 -13
- package/dist/data/welcome-modal.pvar.js +3 -1
- package/dist/data/workflow-logs.js +26 -18
- package/dist/data/workflow-runs.d.ts +6 -6
- package/dist/data/workflow-runs.js +70 -44
- package/dist/data/workflows.d.ts +2 -2
- package/dist/data/workflows.js +7 -9
- package/dist/device/binary-peer-connection-v2.d.ts +7 -7
- package/dist/device/binary-peer-connection-v2.js +32 -28
- package/dist/device/binary-peer-connection-v2.test.js +80 -67
- package/dist/device/binary-peer-connection.d.ts +7 -7
- package/dist/device/binary-peer-connection.js +29 -28
- package/dist/device/binary-peer-connection.test.js +35 -31
- package/dist/device/connection.d.ts +5 -5
- package/dist/device/connection.js +59 -48
- package/dist/device/connection.test.js +74 -68
- package/dist/device/device-election.d.ts +2 -2
- package/dist/device/device-election.js +25 -20
- package/dist/device/device-election.test.js +35 -36
- package/dist/device/device.d.ts +2 -2
- package/dist/device/device.js +10 -4
- package/dist/device/device.test.js +16 -17
- package/dist/device/get-trust-level-fn.d.ts +2 -2
- package/dist/device/get-trust-level-fn.js +22 -11
- package/dist/device/get-trust-level-fn.test.js +58 -58
- package/dist/device/socket-io-binary-peer.d.ts +1 -1
- package/dist/device/socket-io-binary-peer.js +16 -13
- package/dist/device/socket.type.d.ts +2 -2
- package/dist/device/streamed-socket.d.ts +2 -2
- package/dist/device/streamed-socket.js +8 -8
- package/dist/device/streamed-socket.test.js +40 -40
- package/dist/device/tx-encoding.test.js +77 -77
- package/dist/events.d.ts +1 -1
- package/dist/events.js +5 -2
- package/dist/group-invite/group-invite.js +110 -19
- package/dist/group-invite/group-invite.pvars.d.ts +2 -2
- package/dist/group-invite/group-invite.pvars.js +21 -13
- package/dist/group-invite/group-invite.types.d.ts +1 -1
- package/dist/group-invite/index.d.ts +3 -3
- package/dist/group-invite/index.js +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.js +30 -25
- package/dist/keys.d.ts +3 -3
- package/dist/keys.js +31 -30
- package/dist/keys.test.js +69 -61
- package/dist/logging/console-logger.d.ts +1 -1
- package/dist/logging/console-logger.js +35 -40
- package/dist/logging/console-logger.test.js +115 -115
- package/dist/logging/console-logs.table.d.ts +3 -3
- package/dist/logging/console-logs.table.js +28 -23
- package/dist/mentions.js +16 -12
- package/dist/observable.d.ts +2 -2
- package/dist/observable.js +15 -9
- package/dist/observable.test.js +47 -47
- package/dist/package-loader/get-require.js +3 -4
- package/dist/package-loader/package-loader.d.ts +2 -2
- package/dist/package-loader/package-loader.js +52 -34
- package/dist/peers-ui/peers-ui.d.ts +2 -2
- package/dist/peers-ui/peers-ui.js +2 -4
- package/dist/peers-ui/peers-ui.types.d.ts +3 -3
- package/dist/peers-ui/peers-ui.types.js +0 -1
- package/dist/rpc-types.d.ts +61 -59
- package/dist/rpc-types.js +61 -55
- package/dist/serial-json.d.ts +1 -1
- package/dist/serial-json.js +50 -43
- package/dist/serial-json.test.js +22 -22
- package/dist/system-ids.js +8 -8
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/tools-factory.d.ts +1 -1
- package/dist/tools/tools-factory.js +2 -2
- package/dist/types/assistant-runner-args.d.ts +3 -3
- package/dist/types/peer-device.d.ts +1 -1
- package/dist/types/peers-package.d.ts +3 -3
- package/dist/types/workflow-logger.d.ts +1 -1
- package/dist/types/workflow-run-context.d.ts +4 -4
- package/dist/types/workflow.d.ts +4 -4
- package/dist/types/workflow.js +27 -14
- package/dist/types/zod-types.d.ts +2 -1
- package/dist/types/zod-types.js +9 -3
- package/dist/user-connect/connection-code.d.ts +1 -1
- package/dist/user-connect/connection-code.js +7 -7
- package/dist/user-connect/connection-code.test.js +106 -106
- package/dist/user-connect/index.d.ts +3 -3
- package/dist/user-connect/index.js +1 -1
- package/dist/user-connect/user-connect.pvars.js +13 -11
- package/dist/user-connect/user-connect.types.d.ts +3 -3
- package/dist/users.query.d.ts +2 -2
- package/dist/users.query.js +40 -30
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +34 -32
- package/dist/utils.test.js +12 -8
- package/dist/workflow-log-formatter.d.ts +1 -1
- package/dist/workflow-log-formatter.js +17 -18
- package/package.json +14 -8
|
@@ -8,39 +8,42 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.ChangeTrackingTable = exports.changeRecordSchema = void 0;
|
|
11
|
+
const zod_1 = require("zod");
|
|
11
12
|
const events_1 = require("../events");
|
|
12
13
|
const serial_json_1 = require("../serial-json");
|
|
14
|
+
const zod_types_1 = require("../types/zod-types");
|
|
13
15
|
const utils_1 = require("../utils");
|
|
14
16
|
const orm_1 = require("./orm");
|
|
15
|
-
const zod_1 = require("zod");
|
|
16
|
-
const zod_types_1 = require("../types/zod-types");
|
|
17
17
|
exports.changeRecordSchema = zod_1.z.object({
|
|
18
18
|
changeId: zod_types_1.zodPeerId,
|
|
19
19
|
transactionId: zod_1.z.string().optional(), // not used for now
|
|
20
20
|
tableName: zod_1.z.string(),
|
|
21
21
|
recordId: zod_1.z.string(),
|
|
22
|
-
op: zod_1.z.enum([
|
|
22
|
+
op: zod_1.z.enum(["set", "delete", "patch-text"]),
|
|
23
23
|
path: zod_1.z.string().describe('JSON Patch path (e.g., "/title", "/age")'),
|
|
24
|
-
value: zod_1.z
|
|
24
|
+
value: zod_1.z
|
|
25
|
+
.any()
|
|
26
|
+
.nullish()
|
|
27
|
+
.describe("JSON value - can be any type (object, string, number, boolean, array, null, or undefined)"),
|
|
25
28
|
createdAt: zod_1.z.number(),
|
|
26
29
|
appliedAt: zod_1.z.number(),
|
|
27
30
|
supersededAt: zod_1.z.number().optional(),
|
|
28
31
|
});
|
|
29
32
|
const changeTrackingV2TableMetaData = {
|
|
30
|
-
name:
|
|
31
|
-
primaryKeyName:
|
|
32
|
-
description:
|
|
33
|
+
name: "ChangeTrackingV2",
|
|
34
|
+
primaryKeyName: "changeId",
|
|
35
|
+
description: "Change tracking table V2 with superseding support",
|
|
33
36
|
fields: (0, orm_1.schemaToFields)(exports.changeRecordSchema),
|
|
34
37
|
indexes: [
|
|
35
38
|
// Single-column indexes for common sorting/filtering
|
|
36
|
-
{ fields: [
|
|
37
|
-
{ fields: [
|
|
39
|
+
{ fields: ["createdAt"] },
|
|
40
|
+
{ fields: ["appliedAt"] },
|
|
38
41
|
// Compound indexes optimized for actual query patterns
|
|
39
|
-
{ fields: [
|
|
40
|
-
{ fields: [
|
|
41
|
-
{ fields: [
|
|
42
|
-
{ fields: [
|
|
43
|
-
{ fields: [
|
|
42
|
+
{ fields: ["tableName", "recordId", "createdAt"] }, // active changes by table + record
|
|
43
|
+
{ fields: ["tableName", "recordId", "supersededAt"] }, // active changes lookup without full sort
|
|
44
|
+
{ fields: ["recordId", "path"] }, // path-based superseding and deleted record checks
|
|
45
|
+
{ fields: ["supersededAt", "appliedAt", "createdAt"] }, // main sync query (supersededAt filter + appliedAt range + createdAt sort)
|
|
46
|
+
{ fields: ["tableName", "supersededAt"] }, // cleanup superseded changes by table
|
|
44
47
|
],
|
|
45
48
|
localOnly: true,
|
|
46
49
|
};
|
|
@@ -50,8 +53,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
50
53
|
constructor({ db }) {
|
|
51
54
|
super(db, changeTrackingV2TableMetaData, exports.changeRecordSchema);
|
|
52
55
|
const tableName = changeTrackingV2TableMetaData.name;
|
|
53
|
-
this.dataChangedEmitter = new events_1.Emitter(tableName
|
|
54
|
-
// @ts-ignore
|
|
56
|
+
this.dataChangedEmitter = new events_1.Emitter(`${tableName}_DataChanged_${(0, utils_1.newid)()}`);
|
|
55
57
|
this.dataChanged = this.dataChangedEmitter.event;
|
|
56
58
|
}
|
|
57
59
|
/**
|
|
@@ -80,7 +82,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
80
82
|
MAX(createdAt) as last_timestamp
|
|
81
83
|
FROM "${this.tableName}"
|
|
82
84
|
WHERE
|
|
83
|
-
recordId IN (${recordIds.map(() =>
|
|
85
|
+
recordId IN (${recordIds.map(() => "?").join(",")})
|
|
84
86
|
AND path = '/'
|
|
85
87
|
GROUP BY recordId
|
|
86
88
|
)
|
|
@@ -89,7 +91,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
89
91
|
FROM RootPathChanges
|
|
90
92
|
WHERE op = 'delete'
|
|
91
93
|
`, recordIds);
|
|
92
|
-
return deletedRecordsResult.map(d => d.recordId);
|
|
94
|
+
return deletedRecordsResult.map((d) => d.recordId);
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
95
97
|
* Find recordIds that have no change records at all.
|
|
@@ -107,7 +109,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
107
109
|
const missingRecordsResult = await this.db.all(`
|
|
108
110
|
WITH InputRecordIds(recordId) AS (
|
|
109
111
|
VALUES
|
|
110
|
-
${recordIds.map(() =>
|
|
112
|
+
${recordIds.map(() => "(?)").join(",\n ")}
|
|
111
113
|
)
|
|
112
114
|
SELECT
|
|
113
115
|
i.recordId
|
|
@@ -116,14 +118,14 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
116
118
|
ON i.recordId = existing.recordId
|
|
117
119
|
WHERE existing.recordId IS NULL
|
|
118
120
|
`, recordIds);
|
|
119
|
-
return missingRecordsResult.map(d => d.recordId);
|
|
121
|
+
return missingRecordsResult.map((d) => d.recordId);
|
|
120
122
|
}
|
|
121
123
|
/**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
* Find changeIds that we do not have
|
|
125
|
+
*
|
|
126
|
+
* @param changeIds - Array of changeIds to check
|
|
127
|
+
* @returns Array of changeIds with no change records
|
|
128
|
+
*/
|
|
127
129
|
async filterToMissingChangeIds(changeIds) {
|
|
128
130
|
if (changeIds.length === 0)
|
|
129
131
|
return [];
|
|
@@ -131,7 +133,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
131
133
|
const missingChangeIds = await this.db.all(`
|
|
132
134
|
WITH InputChangeIds(changeId) AS (
|
|
133
135
|
VALUES
|
|
134
|
-
${changeIds.map(() =>
|
|
136
|
+
${changeIds.map(() => "(?)").join(",\n ")}
|
|
135
137
|
)
|
|
136
138
|
SELECT
|
|
137
139
|
i.changeId
|
|
@@ -140,7 +142,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
140
142
|
ON i.changeId = existing.changeId
|
|
141
143
|
WHERE existing.changeId IS NULL
|
|
142
144
|
`, changeIds);
|
|
143
|
-
return missingChangeIds.map(d => d.changeId);
|
|
145
|
+
return missingChangeIds.map((d) => d.changeId);
|
|
144
146
|
}
|
|
145
147
|
async markAllPriorChangesSuperseded(tableName, recordId, supersededAt) {
|
|
146
148
|
await this.db.exec(`
|
|
@@ -164,14 +166,16 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
164
166
|
return;
|
|
165
167
|
await this.initTable();
|
|
166
168
|
// Build a CASE statement for bulk update
|
|
167
|
-
const changeIds = updates.map(u => u.changeId);
|
|
168
|
-
const caseStatement = updates
|
|
169
|
+
const changeIds = updates.map((u) => u.changeId);
|
|
170
|
+
const caseStatement = updates
|
|
171
|
+
.map((u) => `WHEN '${u.changeId}' THEN ${u.supersededAt}`)
|
|
172
|
+
.join("\n ");
|
|
169
173
|
await this.db.exec(`
|
|
170
174
|
UPDATE "${this.tableName}"
|
|
171
175
|
SET supersededAt = CASE changeId
|
|
172
176
|
${caseStatement}
|
|
173
177
|
END
|
|
174
|
-
WHERE changeId IN (${changeIds.map(() =>
|
|
178
|
+
WHERE changeId IN (${changeIds.map(() => "?").join(",")})
|
|
175
179
|
`, changeIds);
|
|
176
180
|
}
|
|
177
181
|
/**
|
|
@@ -247,7 +251,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
247
251
|
return results;
|
|
248
252
|
}
|
|
249
253
|
return this.db.runInTransaction(() => {
|
|
250
|
-
return records.map(record => this.insertSync(record));
|
|
254
|
+
return records.map((record) => this.insertSync(record));
|
|
251
255
|
});
|
|
252
256
|
}
|
|
253
257
|
/**
|
|
@@ -258,14 +262,16 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
258
262
|
if (updates.length === 0)
|
|
259
263
|
return;
|
|
260
264
|
// Build a CASE statement for bulk update
|
|
261
|
-
const changeIds = updates.map(u => u.changeId);
|
|
262
|
-
const caseStatement = updates
|
|
263
|
-
|
|
265
|
+
const changeIds = updates.map((u) => u.changeId);
|
|
266
|
+
const caseStatement = updates
|
|
267
|
+
.map((u) => `WHEN '${u.changeId}' THEN ${u.supersededAt}`)
|
|
268
|
+
.join("\n ");
|
|
269
|
+
this.db.execSync?.(`
|
|
264
270
|
UPDATE "${this.tableName}"
|
|
265
271
|
SET supersededAt = CASE changeId
|
|
266
272
|
${caseStatement}
|
|
267
273
|
END
|
|
268
|
-
WHERE changeId IN (${changeIds.map(() =>
|
|
274
|
+
WHERE changeId IN (${changeIds.map(() => "?").join(",")})
|
|
269
275
|
`, changeIds);
|
|
270
276
|
}
|
|
271
277
|
/**
|
|
@@ -275,9 +281,9 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
275
281
|
deleteChangesSync(changeIds) {
|
|
276
282
|
if (changeIds.length === 0)
|
|
277
283
|
return;
|
|
278
|
-
this.db.execSync(`
|
|
284
|
+
this.db.execSync?.(`
|
|
279
285
|
DELETE FROM "${this.tableName}"
|
|
280
|
-
WHERE changeId IN (${changeIds.map(
|
|
286
|
+
WHERE changeId IN (${changeIds.map((_c) => "?").join()})
|
|
281
287
|
`, changeIds);
|
|
282
288
|
}
|
|
283
289
|
/**
|
|
@@ -285,7 +291,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
285
291
|
* Table must be initialized before calling this method.
|
|
286
292
|
*/
|
|
287
293
|
deleteSupersededChangesOlderThanSync(tableName, beforeTimestamp) {
|
|
288
|
-
this.db.execSync(`
|
|
294
|
+
this.db.execSync?.(`
|
|
289
295
|
DELETE FROM "${this.tableName}"
|
|
290
296
|
WHERE tableName = ?
|
|
291
297
|
AND supersededAt IS NOT NULL
|
|
@@ -342,7 +348,7 @@ class ChangeTrackingTable extends orm_1.SQLDataSource {
|
|
|
342
348
|
await this.initTable();
|
|
343
349
|
await this.db.exec(`
|
|
344
350
|
DELETE FROM "${this.tableName}"
|
|
345
|
-
WHERE changeId IN (${changeIds.map(
|
|
351
|
+
WHERE changeId IN (${changeIds.map((_c) => "?").join()})
|
|
346
352
|
`, changeIds);
|
|
347
353
|
}
|
|
348
354
|
/**
|
package/dist/data/channels.js
CHANGED
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.channelSchema = void 0;
|
|
4
4
|
exports.Channels = Channels;
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
|
-
const types_1 = require("./orm/types");
|
|
7
6
|
const user_context_singleton_1 = require("../context/user-context-singleton");
|
|
8
|
-
const table_definitions_system_1 = require("./orm/table-definitions.system");
|
|
9
7
|
const zod_types_1 = require("../types/zod-types");
|
|
8
|
+
const table_definitions_system_1 = require("./orm/table-definitions.system");
|
|
9
|
+
const types_1 = require("./orm/types");
|
|
10
10
|
exports.channelSchema = zod_1.z.object({
|
|
11
11
|
channelId: zod_types_1.zodPeerId,
|
|
12
12
|
name: zod_1.z.string(),
|
|
@@ -15,9 +15,9 @@ exports.channelSchema = zod_1.z.object({
|
|
|
15
15
|
owningGroupId: zod_types_1.zodPeerId,
|
|
16
16
|
});
|
|
17
17
|
const metaData = {
|
|
18
|
-
name:
|
|
19
|
-
description:
|
|
20
|
-
primaryKeyName:
|
|
18
|
+
name: "Channels",
|
|
19
|
+
description: "Different channels of communication for peers and assistants",
|
|
20
|
+
primaryKeyName: "channelId",
|
|
21
21
|
fields: (0, types_1.schemaToFields)(exports.channelSchema),
|
|
22
22
|
};
|
|
23
23
|
(0, table_definitions_system_1.registerSystemTableDefinition)(metaData, exports.channelSchema);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { IPeerDevice } from "../types/peer-device";
|
|
3
|
-
import { ITableMetaData, Table
|
|
2
|
+
import type { IPeerDevice } from "../types/peer-device";
|
|
3
|
+
import { type ITableDependencies, type ITableMetaData, Table } from "./orm";
|
|
4
4
|
export declare const dataLockSchema: z.ZodObject<{
|
|
5
5
|
dataLockId: z.ZodEffects<z.ZodString, string, string>;
|
|
6
6
|
recordId: z.ZodString;
|
package/dist/data/data-locks.js
CHANGED
|
@@ -4,10 +4,10 @@ exports.DataLocksTable = exports.dataLockSchema = void 0;
|
|
|
4
4
|
exports.DataLocks = DataLocks;
|
|
5
5
|
const lodash_1 = require("lodash");
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
|
+
const context_1 = require("../context");
|
|
7
8
|
const zod_types_1 = require("../types/zod-types");
|
|
8
9
|
const utils_1 = require("../utils");
|
|
9
10
|
const orm_1 = require("./orm");
|
|
10
|
-
const context_1 = require("../context");
|
|
11
11
|
const table_definitions_system_1 = require("./orm/table-definitions.system");
|
|
12
12
|
/*
|
|
13
13
|
This works by waiting for a majority of peers to acknowledge the lock.
|
|
@@ -33,13 +33,11 @@ exports.dataLockSchema = zod_1.z.object({
|
|
|
33
33
|
acknowledged: zod_1.z.number().optional(), // timestamp of acknowledgment
|
|
34
34
|
});
|
|
35
35
|
const dataLocksTableMetaData = {
|
|
36
|
-
name:
|
|
37
|
-
primaryKeyName:
|
|
38
|
-
description:
|
|
36
|
+
name: "DataLocks",
|
|
37
|
+
primaryKeyName: "dataLockId",
|
|
38
|
+
description: "Data locks table to track exclusive write access to records in other tables.",
|
|
39
39
|
fields: (0, orm_1.schemaToFields)(exports.dataLockSchema),
|
|
40
|
-
indexes: [
|
|
41
|
-
{ fields: ['recordId'] },
|
|
42
|
-
],
|
|
40
|
+
indexes: [{ fields: ["recordId"] }],
|
|
43
41
|
};
|
|
44
42
|
class DataLocksTable extends orm_1.Table {
|
|
45
43
|
DEFAULT_LOCK_TIME_MS = 300_000; // 5 minutes
|
|
@@ -51,7 +49,7 @@ class DataLocksTable extends orm_1.Table {
|
|
|
51
49
|
// signal to other peers when we become aware of a new data lock
|
|
52
50
|
this.dataChanged.subscribe(async (evt) => {
|
|
53
51
|
const dataLock = evt.dataObject;
|
|
54
|
-
if (evt.op ===
|
|
52
|
+
if (evt.op === "insert") {
|
|
55
53
|
dataLock.acknowledged = (0, utils_1.getTimestamp)();
|
|
56
54
|
this.dataSource.update(dataLock);
|
|
57
55
|
}
|
|
@@ -62,7 +60,7 @@ class DataLocksTable extends orm_1.Table {
|
|
|
62
60
|
recordId,
|
|
63
61
|
lockedUntil: { $gt: Date.now() }, // Only consider locks that are still valid
|
|
64
62
|
});
|
|
65
|
-
return (0, lodash_1.sortBy)(locks,
|
|
63
|
+
return (0, lodash_1.sortBy)(locks, "dataLockId")[0];
|
|
66
64
|
}
|
|
67
65
|
async releaseLock(dataLock) {
|
|
68
66
|
// Remove the lock from the database
|
|
@@ -77,7 +75,7 @@ class DataLocksTable extends orm_1.Table {
|
|
|
77
75
|
return await this.insert(newLock);
|
|
78
76
|
}
|
|
79
77
|
async acquireLock(recordIdOrLock, timeoutMs = this.DEFAULT_TIMEOUT_MS, lockTimeMs = this.DEFAULT_LOCK_TIME_MS) {
|
|
80
|
-
const lock = typeof recordIdOrLock ===
|
|
78
|
+
const lock = typeof recordIdOrLock === "string"
|
|
81
79
|
? await this.createLock(recordIdOrLock, lockTimeMs)
|
|
82
80
|
: recordIdOrLock;
|
|
83
81
|
const recordId = lock.recordId;
|
|
@@ -104,7 +102,7 @@ class DataLocksTable extends orm_1.Table {
|
|
|
104
102
|
}
|
|
105
103
|
dataLock.lockedUntil = Date.now() + lockTimeMs;
|
|
106
104
|
const renewedLock = await this.update(dataLock);
|
|
107
|
-
|
|
105
|
+
const currentLock = await this.getCurrentLock(dataLock.recordId);
|
|
108
106
|
if (!currentLock || currentLock.dataLockId !== dataLock.dataLockId) {
|
|
109
107
|
// currently we don't allow renewing a lock if it is not the current lock - this could change in the future if needed
|
|
110
108
|
console.warn(`Lock renewal failed for ${dataLock.dataLockId} on ${dataLock.recordId}`);
|
|
@@ -115,23 +113,23 @@ class DataLocksTable extends orm_1.Table {
|
|
|
115
113
|
async countLockAcknowledgements(lock) {
|
|
116
114
|
if (!this.peerDevice)
|
|
117
115
|
throw new Error(`Peer device not set for DataLocksTable`);
|
|
118
|
-
const changes = await this.peerDevice.listChanges({
|
|
116
|
+
const changes = (await this.peerDevice.listChanges({
|
|
119
117
|
tableName: dataLocksTableMetaData.name,
|
|
120
118
|
recordId: lock.dataLockId,
|
|
121
|
-
op:
|
|
122
|
-
});
|
|
119
|
+
op: "set", // V2 uses 'set' for updates
|
|
120
|
+
}));
|
|
123
121
|
// In V2, look for changes at path "/acknowledged" or full record changes at path "/"
|
|
124
122
|
const acknowledgedUpdates = changes
|
|
125
|
-
.map(change => {
|
|
126
|
-
if (change.path ===
|
|
123
|
+
.map((change) => {
|
|
124
|
+
if (change.path === "/acknowledged") {
|
|
127
125
|
return change.value;
|
|
128
126
|
}
|
|
129
|
-
else if (change.path ===
|
|
127
|
+
else if (change.path === "/" && change.value && typeof change.value === "object") {
|
|
130
128
|
return change.value.acknowledged;
|
|
131
129
|
}
|
|
132
130
|
return undefined;
|
|
133
131
|
})
|
|
134
|
-
.filter(a => a !== undefined);
|
|
132
|
+
.filter((a) => a !== undefined);
|
|
135
133
|
// NOTE this could potentially miscount if two peers acknowledge the lock with the same timestamp (very unlikely)
|
|
136
134
|
return (0, lodash_1.uniq)(acknowledgedUpdates).length;
|
|
137
135
|
}
|
|
@@ -140,16 +138,16 @@ class DataLocksTable extends orm_1.Table {
|
|
|
140
138
|
throw new Error(`Peer device not set for DataLocksTable`);
|
|
141
139
|
const connectionCount = (await this.peerDevice.getNetworkInfo()).connections.length;
|
|
142
140
|
const ackCnt = await this.countLockAcknowledgements(lock);
|
|
143
|
-
const acksNeeded = Math.ceil(
|
|
141
|
+
const acksNeeded = Math.ceil(connectionCount * 0.7 + 1); // 70% of the connections and +1 for the local device
|
|
144
142
|
if (ackCnt >= acksNeeded) {
|
|
145
|
-
return
|
|
143
|
+
return "confirmed";
|
|
146
144
|
}
|
|
147
|
-
return
|
|
145
|
+
return "pending";
|
|
148
146
|
}
|
|
149
147
|
async waitForLockConfirmedAndCurrent(lock, timeoutMs = this.DEFAULT_TIMEOUT_MS) {
|
|
150
148
|
const startTime = Date.now();
|
|
151
149
|
let resolveLock;
|
|
152
|
-
const confirmPromise = new Promise(
|
|
150
|
+
const confirmPromise = new Promise((resolve) => {
|
|
153
151
|
resolveLock = resolve;
|
|
154
152
|
});
|
|
155
153
|
const subscription = this.dataChanged.subscribe(async (evt) => {
|
|
@@ -159,7 +157,7 @@ class DataLocksTable extends orm_1.Table {
|
|
|
159
157
|
});
|
|
160
158
|
const checkLockStatus = async () => {
|
|
161
159
|
const status = await this.lockStatus(lock);
|
|
162
|
-
if (status ===
|
|
160
|
+
if (status === "confirmed") {
|
|
163
161
|
const currentLock = await this.getCurrentLock(lock.recordId);
|
|
164
162
|
if (currentLock?.dataLockId === lock.dataLockId) {
|
|
165
163
|
subscription.unsubscribe();
|