@peers-app/peers-sdk 0.1.4
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/README.md +1 -0
- package/dist/context/data-context.d.ts +31 -0
- package/dist/context/data-context.js +56 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.js +19 -0
- package/dist/context/user-context-singleton.d.ts +11 -0
- package/dist/context/user-context-singleton.js +121 -0
- package/dist/context/user-context.d.ts +55 -0
- package/dist/context/user-context.js +205 -0
- package/dist/data/assistants.d.ts +68 -0
- package/dist/data/assistants.js +64 -0
- package/dist/data/change-tracking.d.ts +219 -0
- package/dist/data/change-tracking.js +119 -0
- package/dist/data/channels.d.ts +29 -0
- package/dist/data/channels.js +25 -0
- package/dist/data/data-locks.d.ts +37 -0
- package/dist/data/data-locks.js +180 -0
- package/dist/data/data-locks.test.d.ts +1 -0
- package/dist/data/data-locks.test.js +456 -0
- package/dist/data/device-sync-info.d.ts +19 -0
- package/dist/data/device-sync-info.js +24 -0
- package/dist/data/devices.d.ts +51 -0
- package/dist/data/devices.js +36 -0
- package/dist/data/embeddings.d.ts +47 -0
- package/dist/data/embeddings.js +36 -0
- package/dist/data/files/file-read-stream.d.ts +27 -0
- package/dist/data/files/file-read-stream.js +195 -0
- package/dist/data/files/file-write-stream.d.ts +20 -0
- package/dist/data/files/file-write-stream.js +113 -0
- package/dist/data/files/file.types.d.ts +47 -0
- package/dist/data/files/file.types.js +55 -0
- package/dist/data/files/files.d.ts +28 -0
- package/dist/data/files/files.js +127 -0
- package/dist/data/files/files.test.d.ts +1 -0
- package/dist/data/files/files.test.js +728 -0
- package/dist/data/files/index.d.ts +4 -0
- package/dist/data/files/index.js +23 -0
- package/dist/data/group-member-roles.d.ts +9 -0
- package/dist/data/group-member-roles.js +25 -0
- package/dist/data/group-members.d.ts +39 -0
- package/dist/data/group-members.js +68 -0
- package/dist/data/group-members.test.d.ts +1 -0
- package/dist/data/group-members.test.js +287 -0
- package/dist/data/group-permissions.d.ts +8 -0
- package/dist/data/group-permissions.js +73 -0
- package/dist/data/group-share.d.ts +50 -0
- package/dist/data/group-share.js +196 -0
- package/dist/data/groups.d.ts +50 -0
- package/dist/data/groups.js +73 -0
- package/dist/data/groups.test.d.ts +1 -0
- package/dist/data/groups.test.js +153 -0
- package/dist/data/index.d.ts +31 -0
- package/dist/data/index.js +47 -0
- package/dist/data/knowledge/knowledge-frames.d.ts +34 -0
- package/dist/data/knowledge/knowledge-frames.js +34 -0
- package/dist/data/knowledge/knowledge-links.d.ts +30 -0
- package/dist/data/knowledge/knowledge-links.js +25 -0
- package/dist/data/knowledge/knowledge-values.d.ts +35 -0
- package/dist/data/knowledge/knowledge-values.js +35 -0
- package/dist/data/knowledge/peer-types.d.ts +112 -0
- package/dist/data/knowledge/peer-types.js +27 -0
- package/dist/data/knowledge/predicates.d.ts +34 -0
- package/dist/data/knowledge/predicates.js +27 -0
- package/dist/data/messages.d.ts +57 -0
- package/dist/data/messages.js +97 -0
- package/dist/data/orm/client-proxy.data-source.d.ts +27 -0
- package/dist/data/orm/client-proxy.data-source.js +65 -0
- package/dist/data/orm/cursor.d.ts +25 -0
- package/dist/data/orm/cursor.js +47 -0
- package/dist/data/orm/cursor.test.d.ts +1 -0
- package/dist/data/orm/cursor.test.js +315 -0
- package/dist/data/orm/data-query.d.ts +96 -0
- package/dist/data/orm/data-query.js +208 -0
- package/dist/data/orm/data-query.mongo.d.ts +17 -0
- package/dist/data/orm/data-query.mongo.js +267 -0
- package/dist/data/orm/data-query.mongo.test.d.ts +1 -0
- package/dist/data/orm/data-query.mongo.test.js +398 -0
- package/dist/data/orm/data-query.sqlite.d.ts +14 -0
- package/dist/data/orm/data-query.sqlite.js +297 -0
- package/dist/data/orm/data-query.sqlite.test.d.ts +1 -0
- package/dist/data/orm/data-query.sqlite.test.js +377 -0
- package/dist/data/orm/data-query.test.d.ts +1 -0
- package/dist/data/orm/data-query.test.js +553 -0
- package/dist/data/orm/decorators.d.ts +6 -0
- package/dist/data/orm/decorators.js +21 -0
- package/dist/data/orm/dependency-injection.test.d.ts +1 -0
- package/dist/data/orm/dependency-injection.test.js +171 -0
- package/dist/data/orm/doc.d.ts +26 -0
- package/dist/data/orm/doc.js +124 -0
- package/dist/data/orm/event-registry.d.ts +24 -0
- package/dist/data/orm/event-registry.js +40 -0
- package/dist/data/orm/event-registry.test.d.ts +1 -0
- package/dist/data/orm/event-registry.test.js +44 -0
- package/dist/data/orm/factory.d.ts +8 -0
- package/dist/data/orm/factory.js +147 -0
- package/dist/data/orm/index.d.ts +16 -0
- package/dist/data/orm/index.js +32 -0
- package/dist/data/orm/multi-cursors.d.ts +11 -0
- package/dist/data/orm/multi-cursors.js +146 -0
- package/dist/data/orm/multi-cursors.test.d.ts +1 -0
- package/dist/data/orm/multi-cursors.test.js +455 -0
- package/dist/data/orm/sql-db.d.ts +6 -0
- package/dist/data/orm/sql-db.js +2 -0
- package/dist/data/orm/sql.data-source.d.ts +38 -0
- package/dist/data/orm/sql.data-source.js +379 -0
- package/dist/data/orm/sql.data-source.test.d.ts +1 -0
- package/dist/data/orm/sql.data-source.test.js +406 -0
- package/dist/data/orm/subscribable.data-source.d.ts +25 -0
- package/dist/data/orm/subscribable.data-source.js +72 -0
- package/dist/data/orm/table-container-events.test.d.ts +1 -0
- package/dist/data/orm/table-container-events.test.js +93 -0
- package/dist/data/orm/table-container.d.ts +39 -0
- package/dist/data/orm/table-container.js +96 -0
- package/dist/data/orm/table-definitions.system.d.ts +9 -0
- package/dist/data/orm/table-definitions.system.js +29 -0
- package/dist/data/orm/table-definitions.type.d.ts +19 -0
- package/dist/data/orm/table-definitions.type.js +2 -0
- package/dist/data/orm/table-dependencies.d.ts +32 -0
- package/dist/data/orm/table-dependencies.js +2 -0
- package/dist/data/orm/table.d.ts +42 -0
- package/dist/data/orm/table.event-source.test.d.ts +1 -0
- package/dist/data/orm/table.event-source.test.js +341 -0
- package/dist/data/orm/table.js +244 -0
- package/dist/data/orm/types.d.ts +20 -0
- package/dist/data/orm/types.js +115 -0
- package/dist/data/orm/types.test.d.ts +1 -0
- package/dist/data/orm/types.test.js +71 -0
- package/dist/data/package-permissions.d.ts +7 -0
- package/dist/data/package-permissions.js +18 -0
- package/dist/data/packages.d.ts +92 -0
- package/dist/data/packages.js +90 -0
- package/dist/data/peer-events/peer-event-handlers.d.ts +21 -0
- package/dist/data/peer-events/peer-event-handlers.js +28 -0
- package/dist/data/peer-events/peer-event-types.d.ts +119 -0
- package/dist/data/peer-events/peer-event-types.js +29 -0
- package/dist/data/peer-events/peer-events.d.ts +41 -0
- package/dist/data/peer-events/peer-events.js +102 -0
- package/dist/data/persistent-vars.d.ts +87 -0
- package/dist/data/persistent-vars.js +230 -0
- package/dist/data/tool-tests.d.ts +37 -0
- package/dist/data/tool-tests.js +27 -0
- package/dist/data/tools.d.ts +358 -0
- package/dist/data/tools.js +48 -0
- package/dist/data/user-permissions.d.ts +15 -0
- package/dist/data/user-permissions.js +39 -0
- package/dist/data/user-permissions.test.d.ts +1 -0
- package/dist/data/user-permissions.test.js +252 -0
- package/dist/data/users.d.ts +38 -0
- package/dist/data/users.js +73 -0
- package/dist/data/workflow-logs.d.ts +106 -0
- package/dist/data/workflow-logs.js +67 -0
- package/dist/data/workflow-runs.d.ts +103 -0
- package/dist/data/workflow-runs.js +313 -0
- package/dist/data/workflows.d.ts +16 -0
- package/dist/data/workflows.js +21 -0
- package/dist/device/connection.d.ts +41 -0
- package/dist/device/connection.js +249 -0
- package/dist/device/connection.test.d.ts +1 -0
- package/dist/device/connection.test.js +292 -0
- package/dist/device/device-election.d.ts +36 -0
- package/dist/device/device-election.js +137 -0
- package/dist/device/device.d.ts +22 -0
- package/dist/device/device.js +110 -0
- package/dist/device/device.test.d.ts +1 -0
- package/dist/device/device.test.js +203 -0
- package/dist/device/get-trust-level.d.ts +3 -0
- package/dist/device/get-trust-level.js +87 -0
- package/dist/device/socket.type.d.ts +20 -0
- package/dist/device/socket.type.js +15 -0
- package/dist/device/streamed-socket.d.ts +27 -0
- package/dist/device/streamed-socket.js +154 -0
- package/dist/device/streamed-socket.test.d.ts +1 -0
- package/dist/device/streamed-socket.test.js +44 -0
- package/dist/events.d.ts +35 -0
- package/dist/events.js +128 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +50 -0
- package/dist/keys.d.ts +51 -0
- package/dist/keys.js +234 -0
- package/dist/keys.test.d.ts +1 -0
- package/dist/keys.test.js +215 -0
- package/dist/mentions.d.ts +9 -0
- package/dist/mentions.js +46 -0
- package/dist/observable.d.ts +19 -0
- package/dist/observable.js +112 -0
- package/dist/observable.test.d.ts +1 -0
- package/dist/observable.test.js +183 -0
- package/dist/package-loader/get-require.d.ts +10 -0
- package/dist/package-loader/get-require.js +31 -0
- package/dist/package-loader/index.d.ts +1 -0
- package/dist/package-loader/index.js +17 -0
- package/dist/package-loader/package-loader.d.ts +16 -0
- package/dist/package-loader/package-loader.js +102 -0
- package/dist/peers-ui/peers-ui.d.ts +15 -0
- package/dist/peers-ui/peers-ui.js +23 -0
- package/dist/peers-ui/peers-ui.types.d.ts +35 -0
- package/dist/peers-ui/peers-ui.types.js +3 -0
- package/dist/rpc-types.d.ts +45 -0
- package/dist/rpc-types.js +47 -0
- package/dist/serial-json.d.ts +5 -0
- package/dist/serial-json.js +186 -0
- package/dist/serial-json.test.d.ts +1 -0
- package/dist/serial-json.test.js +86 -0
- package/dist/system-ids.d.ts +6 -0
- package/dist/system-ids.js +10 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/tools-factory.d.ts +5 -0
- package/dist/tools/tools-factory.js +34 -0
- package/dist/types/app-nav.d.ts +18 -0
- package/dist/types/app-nav.js +10 -0
- package/dist/types/assistant-runner-args.d.ts +9 -0
- package/dist/types/assistant-runner-args.js +2 -0
- package/dist/types/field-type.d.ts +37 -0
- package/dist/types/field-type.js +26 -0
- package/dist/types/peer-device.d.ts +40 -0
- package/dist/types/peer-device.js +14 -0
- package/dist/types/peers-package.d.ts +23 -0
- package/dist/types/peers-package.js +2 -0
- package/dist/types/workflow-logger.d.ts +2 -0
- package/dist/types/workflow-logger.js +2 -0
- package/dist/types/workflow-run-context.d.ts +12 -0
- package/dist/types/workflow-run-context.js +2 -0
- package/dist/types/workflow.d.ts +72 -0
- package/dist/types/workflow.js +24 -0
- package/dist/types/zod-types.d.ts +7 -0
- package/dist/types/zod-types.js +12 -0
- package/dist/users.query.d.ts +13 -0
- package/dist/users.query.js +134 -0
- package/dist/utils.d.ts +39 -0
- package/dist/utils.js +240 -0
- package/dist/utils.test.d.ts +1 -0
- package/dist/utils.test.js +140 -0
- package/package.json +50 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DataContext } from "../../context/data-context";
|
|
3
|
+
export declare const peerEventHandlerSchema: z.ZodObject<{
|
|
4
|
+
peerEventHandlerId: z.ZodString;
|
|
5
|
+
peerEventTypeId: z.ZodString;
|
|
6
|
+
handlerWorkflowId: z.ZodString;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
peerEventTypeId: string;
|
|
9
|
+
peerEventHandlerId: string;
|
|
10
|
+
handlerWorkflowId: string;
|
|
11
|
+
}, {
|
|
12
|
+
peerEventTypeId: string;
|
|
13
|
+
peerEventHandlerId: string;
|
|
14
|
+
handlerWorkflowId: string;
|
|
15
|
+
}>;
|
|
16
|
+
export type IPeerEventHandler = z.infer<typeof peerEventHandlerSchema>;
|
|
17
|
+
export declare function PeerEventHandlers(dataContext?: DataContext): import("../orm").Table<{
|
|
18
|
+
peerEventTypeId: string;
|
|
19
|
+
peerEventHandlerId: string;
|
|
20
|
+
handlerWorkflowId: string;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.peerEventHandlerSchema = void 0;
|
|
4
|
+
exports.PeerEventHandlers = PeerEventHandlers;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const types_1 = require("../orm/types");
|
|
7
|
+
const user_context_singleton_1 = require("../../context/user-context-singleton");
|
|
8
|
+
const table_definitions_system_1 = require("../orm/table-definitions.system");
|
|
9
|
+
exports.peerEventHandlerSchema = zod_1.z.object({
|
|
10
|
+
peerEventHandlerId: zod_1.z.string(),
|
|
11
|
+
peerEventTypeId: zod_1.z.string().describe('The event type that will be handled'),
|
|
12
|
+
handlerWorkflowId: zod_1.z.string().describe('The workflow that will be triggered when this event occurs'),
|
|
13
|
+
});
|
|
14
|
+
const metaData = {
|
|
15
|
+
name: 'PeerEventHandlers',
|
|
16
|
+
description: 'The handlers registered for peer events',
|
|
17
|
+
primaryKeyName: 'peerEventHandlerId',
|
|
18
|
+
fields: (0, types_1.schemaToFields)(exports.peerEventHandlerSchema),
|
|
19
|
+
indexes: [
|
|
20
|
+
{
|
|
21
|
+
fields: ['peerEventTypeId'],
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
(0, table_definitions_system_1.registerSystemTableDefinition)(metaData, exports.peerEventHandlerSchema);
|
|
26
|
+
function PeerEventHandlers(dataContext) {
|
|
27
|
+
return (0, user_context_singleton_1.getTableContainer)(dataContext).getTable(metaData, exports.peerEventHandlerSchema);
|
|
28
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DataContext } from "../../context/data-context";
|
|
3
|
+
export declare const peerEventTypeSchema: z.ZodObject<{
|
|
4
|
+
peerEventTypeId: z.ZodString;
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
description: z.ZodString;
|
|
7
|
+
createdAt: z.ZodDefault<z.ZodDate>;
|
|
8
|
+
schema: z.ZodObject<{
|
|
9
|
+
type: z.ZodNativeEnum<typeof import("../tools").IOSchemaType>;
|
|
10
|
+
fields: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
11
|
+
name: z.ZodString;
|
|
12
|
+
description: z.ZodOptional<z.ZodString>;
|
|
13
|
+
type: z.ZodNativeEnum<typeof import("../..").FieldType>;
|
|
14
|
+
defaultValue: z.ZodOptional<z.ZodAny>;
|
|
15
|
+
optional: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
isArray: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
subType: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
name: string;
|
|
20
|
+
type: import("../..").FieldType;
|
|
21
|
+
optional?: boolean | undefined;
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
defaultValue?: any;
|
|
24
|
+
isArray?: boolean | undefined;
|
|
25
|
+
subType?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
name: string;
|
|
28
|
+
type: import("../..").FieldType;
|
|
29
|
+
optional?: boolean | undefined;
|
|
30
|
+
description?: string | undefined;
|
|
31
|
+
defaultValue?: any;
|
|
32
|
+
isArray?: boolean | undefined;
|
|
33
|
+
subType?: string | undefined;
|
|
34
|
+
}>, "many">>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
type: import("../tools").IOSchemaType;
|
|
37
|
+
fields: {
|
|
38
|
+
name: string;
|
|
39
|
+
type: import("../..").FieldType;
|
|
40
|
+
optional?: boolean | undefined;
|
|
41
|
+
description?: string | undefined;
|
|
42
|
+
defaultValue?: any;
|
|
43
|
+
isArray?: boolean | undefined;
|
|
44
|
+
subType?: string | undefined;
|
|
45
|
+
}[];
|
|
46
|
+
}, {
|
|
47
|
+
type: import("../tools").IOSchemaType;
|
|
48
|
+
fields?: {
|
|
49
|
+
name: string;
|
|
50
|
+
type: import("../..").FieldType;
|
|
51
|
+
optional?: boolean | undefined;
|
|
52
|
+
description?: string | undefined;
|
|
53
|
+
defaultValue?: any;
|
|
54
|
+
isArray?: boolean | undefined;
|
|
55
|
+
subType?: string | undefined;
|
|
56
|
+
}[] | undefined;
|
|
57
|
+
}>;
|
|
58
|
+
cronSchedule: z.ZodOptional<z.ZodString>;
|
|
59
|
+
nextScheduledTime: z.ZodOptional<z.ZodNumber>;
|
|
60
|
+
}, "strip", z.ZodTypeAny, {
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
schema: {
|
|
64
|
+
type: import("../tools").IOSchemaType;
|
|
65
|
+
fields: {
|
|
66
|
+
name: string;
|
|
67
|
+
type: import("../..").FieldType;
|
|
68
|
+
optional?: boolean | undefined;
|
|
69
|
+
description?: string | undefined;
|
|
70
|
+
defaultValue?: any;
|
|
71
|
+
isArray?: boolean | undefined;
|
|
72
|
+
subType?: string | undefined;
|
|
73
|
+
}[];
|
|
74
|
+
};
|
|
75
|
+
peerEventTypeId: string;
|
|
76
|
+
createdAt: Date;
|
|
77
|
+
cronSchedule?: string | undefined;
|
|
78
|
+
nextScheduledTime?: number | undefined;
|
|
79
|
+
}, {
|
|
80
|
+
name: string;
|
|
81
|
+
description: string;
|
|
82
|
+
schema: {
|
|
83
|
+
type: import("../tools").IOSchemaType;
|
|
84
|
+
fields?: {
|
|
85
|
+
name: string;
|
|
86
|
+
type: import("../..").FieldType;
|
|
87
|
+
optional?: boolean | undefined;
|
|
88
|
+
description?: string | undefined;
|
|
89
|
+
defaultValue?: any;
|
|
90
|
+
isArray?: boolean | undefined;
|
|
91
|
+
subType?: string | undefined;
|
|
92
|
+
}[] | undefined;
|
|
93
|
+
};
|
|
94
|
+
peerEventTypeId: string;
|
|
95
|
+
createdAt?: Date | undefined;
|
|
96
|
+
cronSchedule?: string | undefined;
|
|
97
|
+
nextScheduledTime?: number | undefined;
|
|
98
|
+
}>;
|
|
99
|
+
export type IPeerEventType = z.infer<typeof peerEventTypeSchema>;
|
|
100
|
+
export declare function PeerEventTypes(dataContext?: DataContext): import("../orm").Table<{
|
|
101
|
+
name: string;
|
|
102
|
+
description: string;
|
|
103
|
+
schema: {
|
|
104
|
+
type: import("../tools").IOSchemaType;
|
|
105
|
+
fields: {
|
|
106
|
+
name: string;
|
|
107
|
+
type: import("../..").FieldType;
|
|
108
|
+
optional?: boolean | undefined;
|
|
109
|
+
description?: string | undefined;
|
|
110
|
+
defaultValue?: any;
|
|
111
|
+
isArray?: boolean | undefined;
|
|
112
|
+
subType?: string | undefined;
|
|
113
|
+
}[];
|
|
114
|
+
};
|
|
115
|
+
peerEventTypeId: string;
|
|
116
|
+
createdAt: Date;
|
|
117
|
+
cronSchedule?: string | undefined;
|
|
118
|
+
nextScheduledTime?: number | undefined;
|
|
119
|
+
}>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.peerEventTypeSchema = void 0;
|
|
4
|
+
exports.PeerEventTypes = PeerEventTypes;
|
|
5
|
+
const types_1 = require("../orm/types");
|
|
6
|
+
const user_context_singleton_1 = require("../../context/user-context-singleton");
|
|
7
|
+
const table_definitions_system_1 = require("../orm/table-definitions.system");
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const tools_1 = require("../tools");
|
|
10
|
+
exports.peerEventTypeSchema = zod_1.z.object({
|
|
11
|
+
peerEventTypeId: zod_1.z.string(),
|
|
12
|
+
name: zod_1.z.string().describe('The name of the event'),
|
|
13
|
+
description: zod_1.z.string().describe('The description of the event type and what it represents'),
|
|
14
|
+
createdAt: zod_1.z.date().default(() => new Date()).describe('The date the event type was created'),
|
|
15
|
+
schema: tools_1.ioSchema.describe('The schema of the event data'),
|
|
16
|
+
cronSchedule: zod_1.z.string().optional().describe('The cron schedule for this event'),
|
|
17
|
+
nextScheduledTime: zod_1.z.number().optional().describe('The next time this event is scheduled to run based on the cron schedule'),
|
|
18
|
+
});
|
|
19
|
+
const metaData = {
|
|
20
|
+
name: 'PeerEventTypes',
|
|
21
|
+
description: 'The types of events that are possible in this Peers network, what their schemas are, and what tools will be triggered, etc.',
|
|
22
|
+
primaryKeyName: 'peerEventTypeId',
|
|
23
|
+
fields: (0, types_1.schemaToFields)(exports.peerEventTypeSchema),
|
|
24
|
+
iconClassName: 'bi bi-lightning-charge-fill',
|
|
25
|
+
};
|
|
26
|
+
(0, table_definitions_system_1.registerSystemTableDefinition)(metaData, exports.peerEventTypeSchema);
|
|
27
|
+
function PeerEventTypes(dataContext) {
|
|
28
|
+
return (0, user_context_singleton_1.getTableContainer)(dataContext).getTable(metaData, exports.peerEventTypeSchema);
|
|
29
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DataContext } from "../../context/data-context";
|
|
3
|
+
export declare const peerEventSchema: z.ZodObject<{
|
|
4
|
+
peerEventId: z.ZodEffects<z.ZodString, string, string>;
|
|
5
|
+
peerEventTypeId: z.ZodEffects<z.ZodString, string, string>;
|
|
6
|
+
parentMessageId: z.ZodEffects<z.ZodString, string, string>;
|
|
7
|
+
eventData: z.ZodObject<{}, "strip", z.ZodAny, z.objectOutputType<{}, z.ZodAny, "strip">, z.objectInputType<{}, z.ZodAny, "strip">>;
|
|
8
|
+
createdAt: z.ZodDefault<z.ZodDate>;
|
|
9
|
+
workflowRunsTriggered: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
peerEventTypeId: string;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
parentMessageId: string;
|
|
14
|
+
peerEventId: string;
|
|
15
|
+
eventData: {} & {
|
|
16
|
+
[k: string]: any;
|
|
17
|
+
};
|
|
18
|
+
workflowRunsTriggered?: string[] | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
peerEventTypeId: string;
|
|
21
|
+
parentMessageId: string;
|
|
22
|
+
peerEventId: string;
|
|
23
|
+
eventData: {} & {
|
|
24
|
+
[k: string]: any;
|
|
25
|
+
};
|
|
26
|
+
createdAt?: Date | undefined;
|
|
27
|
+
workflowRunsTriggered?: string[] | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
type _IEvent = z.infer<typeof peerEventSchema>;
|
|
30
|
+
export interface IPeerEvent<T = Record<string, any>> extends Omit<_IEvent, "eventData"> {
|
|
31
|
+
eventData: T;
|
|
32
|
+
}
|
|
33
|
+
export interface IEmitPeerEventArgs {
|
|
34
|
+
peerEventTypeId: string;
|
|
35
|
+
eventData: Record<string, any>;
|
|
36
|
+
channelOrThreadId?: string;
|
|
37
|
+
assistantId?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function PeerEvents(dataContext?: DataContext): import("../..").Table<IPeerEvent<Record<string, any>>>;
|
|
40
|
+
export declare function emitPeerEvent<T extends Record<string, any>>(args: IEmitPeerEventArgs): Promise<IPeerEvent<T>>;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.peerEventSchema = void 0;
|
|
4
|
+
exports.PeerEvents = PeerEvents;
|
|
5
|
+
exports.emitPeerEvent = emitPeerEvent;
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const mentions_1 = require("../../mentions");
|
|
8
|
+
const zod_types_1 = require("../../types/zod-types");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
const messages_1 = require("../messages");
|
|
11
|
+
const types_1 = require("../orm/types");
|
|
12
|
+
const user_context_singleton_1 = require("../../context/user-context-singleton");
|
|
13
|
+
const table_definitions_system_1 = require("../orm/table-definitions.system");
|
|
14
|
+
const users_1 = require("../users");
|
|
15
|
+
const workflow_runs_1 = require("../workflow-runs");
|
|
16
|
+
const peer_event_handlers_1 = require("./peer-event-handlers");
|
|
17
|
+
const peer_event_types_1 = require("./peer-event-types");
|
|
18
|
+
const __1 = require("../..");
|
|
19
|
+
exports.peerEventSchema = zod_1.z.object({
|
|
20
|
+
peerEventId: zod_types_1.zodPeerId,
|
|
21
|
+
peerEventTypeId: zod_types_1.zodPeerId.describe('The type of event'),
|
|
22
|
+
parentMessageId: zod_types_1.zodPeerId.describe('The message that this event will be emitted in the context of'),
|
|
23
|
+
eventData: zod_types_1.zodAnyObject.describe('The data of the event as defined by the event type schema'),
|
|
24
|
+
createdAt: zod_1.z.date().default(() => new Date()).describe('The date the event was created'),
|
|
25
|
+
workflowRunsTriggered: zod_1.z.string().array().optional().describe('The workflows that were triggered by this event'),
|
|
26
|
+
});
|
|
27
|
+
const metaData = {
|
|
28
|
+
name: 'PeerEvents',
|
|
29
|
+
description: 'The events that have occurred in the Peers network',
|
|
30
|
+
primaryKeyName: 'peerEventId',
|
|
31
|
+
fields: (0, types_1.schemaToFields)(exports.peerEventSchema),
|
|
32
|
+
};
|
|
33
|
+
(0, table_definitions_system_1.registerSystemTableDefinition)(metaData, exports.peerEventSchema);
|
|
34
|
+
function PeerEvents(dataContext) {
|
|
35
|
+
return (0, user_context_singleton_1.getTableContainer)(dataContext).getTable(metaData, exports.peerEventSchema);
|
|
36
|
+
}
|
|
37
|
+
async function emitPeerEvent(args) {
|
|
38
|
+
const { peerEventTypeId, channelOrThreadId: groupOrChannelId } = args;
|
|
39
|
+
let { eventData } = args;
|
|
40
|
+
const eventType = await (0, peer_event_types_1.PeerEventTypes)().get(peerEventTypeId);
|
|
41
|
+
if (!eventType) {
|
|
42
|
+
throw new Error(`Event type ${peerEventTypeId} not found`);
|
|
43
|
+
}
|
|
44
|
+
const schema = (0, types_1.fieldsToSchema)(eventType.schema.fields);
|
|
45
|
+
const defaults = {};
|
|
46
|
+
for (const field of eventType.schema.fields) {
|
|
47
|
+
const zodField = schema.shape[field.name];
|
|
48
|
+
const value = zodField.safeParse(eventData[field.name]);
|
|
49
|
+
if (value.success) {
|
|
50
|
+
defaults[field.name] = value.data;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
eventData = {
|
|
54
|
+
...defaults,
|
|
55
|
+
...eventData
|
|
56
|
+
};
|
|
57
|
+
schema.parse(eventData);
|
|
58
|
+
const me = await (0, users_1.getMe)();
|
|
59
|
+
const channelOrThreadId = groupOrChannelId || me.userId;
|
|
60
|
+
const assistantId = args.assistantId
|
|
61
|
+
|| (await (0, __1.getPrimaryAssistant)()).assistantId
|
|
62
|
+
|| __1.defaultAssistantId;
|
|
63
|
+
const peerEventId = (0, utils_1.newid)();
|
|
64
|
+
const eventMention = (0, mentions_1.formatMention)({ kind: 'event', id: peerEventTypeId, name: eventType.name });
|
|
65
|
+
// TODO get better link to event instance
|
|
66
|
+
const eventLink = ''; //`[logs](#events/${peerEventTypeId})`;
|
|
67
|
+
const handlers = await (0, peer_event_handlers_1.PeerEventHandlers)().list({ peerEventTypeId });
|
|
68
|
+
let handlerStr = '';
|
|
69
|
+
if (handlers.length === 0) {
|
|
70
|
+
handlerStr = 'No handlers subscribed to this event type';
|
|
71
|
+
}
|
|
72
|
+
else if (handlers.length === 1) {
|
|
73
|
+
handlerStr = `triggering 1 handler`;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
handlerStr = `triggering ${handlers.length} handlers`;
|
|
77
|
+
}
|
|
78
|
+
const eventMessage = await (0, messages_1.sendMessage)({
|
|
79
|
+
channelOrThreadIdOrWorkflowRunId: channelOrThreadId,
|
|
80
|
+
messageContent: `Emitting ${eventMention} ${eventLink} - ${handlerStr}`,
|
|
81
|
+
assistantId,
|
|
82
|
+
});
|
|
83
|
+
const event = {
|
|
84
|
+
peerEventId,
|
|
85
|
+
peerEventTypeId,
|
|
86
|
+
eventData: eventData,
|
|
87
|
+
createdAt: new Date(),
|
|
88
|
+
parentMessageId: eventMessage.messageId,
|
|
89
|
+
};
|
|
90
|
+
await PeerEvents().insert(event);
|
|
91
|
+
for (const handler of handlers) {
|
|
92
|
+
const workflowId = handler.handlerWorkflowId;
|
|
93
|
+
(0, workflow_runs_1.runWorkflow)({
|
|
94
|
+
workflowId,
|
|
95
|
+
parentMessageIdOrChannelIdOrGroupId: eventMessage.messageId,
|
|
96
|
+
vars: {
|
|
97
|
+
...eventData
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return event;
|
|
102
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Observable } from "../observable";
|
|
3
|
+
import { Table } from "./orm/table";
|
|
4
|
+
import { ITableMetaData } from "./orm/types";
|
|
5
|
+
import type { DataContext } from "../context/data-context";
|
|
6
|
+
import { UserContext } from "../context";
|
|
7
|
+
import { ISaveOptions } from "./orm";
|
|
8
|
+
declare const schema: z.ZodObject<{
|
|
9
|
+
persistentVarId: z.ZodString;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
scope: z.ZodEnum<["device", "user", "group", "groupDevice", "groupUser"]>;
|
|
12
|
+
value: z.ZodObject<{
|
|
13
|
+
value: z.ZodAny;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
value?: any;
|
|
16
|
+
}, {
|
|
17
|
+
value?: any;
|
|
18
|
+
}>;
|
|
19
|
+
description: z.ZodOptional<z.ZodString>;
|
|
20
|
+
userCreated: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
isSecret: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
name: string;
|
|
24
|
+
value: {
|
|
25
|
+
value?: any;
|
|
26
|
+
};
|
|
27
|
+
persistentVarId: string;
|
|
28
|
+
scope: "user" | "group" | "device" | "groupDevice" | "groupUser";
|
|
29
|
+
description?: string | undefined;
|
|
30
|
+
userCreated?: boolean | undefined;
|
|
31
|
+
isSecret?: boolean | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
name: string;
|
|
34
|
+
value: {
|
|
35
|
+
value?: any;
|
|
36
|
+
};
|
|
37
|
+
persistentVarId: string;
|
|
38
|
+
scope: "user" | "group" | "device" | "groupDevice" | "groupUser";
|
|
39
|
+
description?: string | undefined;
|
|
40
|
+
userCreated?: boolean | undefined;
|
|
41
|
+
isSecret?: boolean | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
export declare const persistentVarsMetaData: ITableMetaData;
|
|
44
|
+
export type IPersistentVar = z.infer<typeof schema>;
|
|
45
|
+
export declare class PersistentVarsTable extends Table<IPersistentVar> {
|
|
46
|
+
insert(persistentVar: IPersistentVar): Promise<IPersistentVar>;
|
|
47
|
+
update(persistentVar: IPersistentVar): Promise<IPersistentVar>;
|
|
48
|
+
save(persistentVar: IPersistentVar, opts?: ISaveOptions): Promise<IPersistentVar>;
|
|
49
|
+
getPersistentVarValue<T>(name: string): Promise<T | undefined>;
|
|
50
|
+
}
|
|
51
|
+
export declare function PersistentVars(dataContext?: DataContext): PersistentVarsTable;
|
|
52
|
+
export type PersistentVar<T> = Observable<T> & {
|
|
53
|
+
loadingPromise: Promise<PersistentVar<T>>;
|
|
54
|
+
};
|
|
55
|
+
export declare function getPersistentVar(name: string, dataContext?: DataContext): Promise<IPersistentVar | undefined>;
|
|
56
|
+
interface IPersistentVarOptions<T> {
|
|
57
|
+
scope?: 'device' | 'user' | 'group' | 'groupDevice' | 'groupUser';
|
|
58
|
+
defaultValue?: T;
|
|
59
|
+
userContext?: UserContext;
|
|
60
|
+
dataContext?: DataContext;
|
|
61
|
+
dbValue?: T;
|
|
62
|
+
isSecret?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A persistent variable that is stored only on this device, in the user's personal db
|
|
66
|
+
*/
|
|
67
|
+
export declare function deviceVar<T = string>(name: string, opts?: Omit<IPersistentVarOptions<T>, 'scope' | 'dataContext'>): PersistentVar<T>;
|
|
68
|
+
/**
|
|
69
|
+
* A persistent variable that is stored in the user's personal db and synced across all their devices
|
|
70
|
+
*/
|
|
71
|
+
export declare function userVar<T = string>(name: string, opts?: Omit<IPersistentVarOptions<T>, 'scope' | 'dataContext'>): PersistentVar<T>;
|
|
72
|
+
/**
|
|
73
|
+
* A persistent variable that is shared by all users in a group. It is stored in the group's db and synced across all users and devices in the group.
|
|
74
|
+
* It can have a different value for each group on the device.
|
|
75
|
+
*/
|
|
76
|
+
export declare function groupVar<T = string>(name: string, opts?: Omit<IPersistentVarOptions<T>, 'scope'>): PersistentVar<T>;
|
|
77
|
+
/**
|
|
78
|
+
* A persistent variable that is stored only on this device, in the user's personal db.
|
|
79
|
+
* It can have a different value for each group on the device but is not synced to other devices.
|
|
80
|
+
*/
|
|
81
|
+
export declare function groupDeviceVar<T = string>(name: string, opts?: Omit<IPersistentVarOptions<T>, 'scope'>): PersistentVar<T>;
|
|
82
|
+
/**
|
|
83
|
+
* A persistent variable that is stored in the user's personal db and synced across all their devices in the group.
|
|
84
|
+
* It can have a different value for each user in the group and a different value for each group the user is in.
|
|
85
|
+
*/
|
|
86
|
+
export declare function groupUserVar<T = string>(name: string, opts?: Omit<IPersistentVarOptions<T>, 'scope'>): PersistentVar<T>;
|
|
87
|
+
export {};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersistentVarsTable = exports.persistentVarsMetaData = void 0;
|
|
4
|
+
exports.PersistentVars = PersistentVars;
|
|
5
|
+
exports.getPersistentVar = getPersistentVar;
|
|
6
|
+
exports.deviceVar = deviceVar;
|
|
7
|
+
exports.userVar = userVar;
|
|
8
|
+
exports.groupVar = groupVar;
|
|
9
|
+
exports.groupDeviceVar = groupDeviceVar;
|
|
10
|
+
exports.groupUserVar = groupUserVar;
|
|
11
|
+
const lodash_1 = require("lodash");
|
|
12
|
+
const zod_1 = require("zod");
|
|
13
|
+
const observable_1 = require("../observable");
|
|
14
|
+
const utils_1 = require("../utils");
|
|
15
|
+
const table_1 = require("./orm/table");
|
|
16
|
+
const user_context_singleton_1 = require("../context/user-context-singleton");
|
|
17
|
+
const table_definitions_system_1 = require("./orm/table-definitions.system");
|
|
18
|
+
const types_1 = require("./orm/types");
|
|
19
|
+
const rpc_types_1 = require("../rpc-types");
|
|
20
|
+
const schema = zod_1.z.object({
|
|
21
|
+
persistentVarId: zod_1.z.string(),
|
|
22
|
+
name: zod_1.z.string(),
|
|
23
|
+
scope: zod_1.z.enum(['device', 'user', 'group', 'groupDevice', 'groupUser']),
|
|
24
|
+
value: zod_1.z.object({
|
|
25
|
+
value: zod_1.z.any(),
|
|
26
|
+
}).describe('The value of the persistent variable encoded as JSON'),
|
|
27
|
+
description: zod_1.z.string().optional(),
|
|
28
|
+
userCreated: zod_1.z.boolean().optional(),
|
|
29
|
+
isSecret: zod_1.z.boolean().optional(),
|
|
30
|
+
});
|
|
31
|
+
exports.persistentVarsMetaData = {
|
|
32
|
+
name: 'PersistentVars',
|
|
33
|
+
description: 'table to persist variables across sessions and devices',
|
|
34
|
+
primaryKeyName: 'persistentVarId',
|
|
35
|
+
fields: (0, types_1.schemaToFields)(schema),
|
|
36
|
+
iconClassName: 'bi bi-braces',
|
|
37
|
+
indexes: [
|
|
38
|
+
{ fields: ['name'], unique: true },
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
class PersistentVarsTable extends table_1.Table {
|
|
42
|
+
async insert(persistentVar) {
|
|
43
|
+
return this.save(persistentVar);
|
|
44
|
+
}
|
|
45
|
+
async update(persistentVar) {
|
|
46
|
+
return this.save(persistentVar);
|
|
47
|
+
}
|
|
48
|
+
async save(persistentVar, opts) {
|
|
49
|
+
if (!persistentVar.persistentVarId) {
|
|
50
|
+
persistentVar.persistentVarId = (0, utils_1.newid)();
|
|
51
|
+
}
|
|
52
|
+
const dbVar = await this.get(persistentVar.persistentVarId);
|
|
53
|
+
if (persistentVar.isSecret && persistentVar.value.value !== undefined && !rpc_types_1.isClient) {
|
|
54
|
+
if (!dbVar || dbVar.value.value !== persistentVar.value.value || dbVar.isSecret !== persistentVar.isSecret) {
|
|
55
|
+
persistentVar.value.value = await rpc_types_1.rpcServerCalls.encryptData(persistentVar.value.value || '', this.groupId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return super.save(persistentVar, opts);
|
|
59
|
+
}
|
|
60
|
+
async getPersistentVarValue(name) {
|
|
61
|
+
const pVars = await this.list({ name });
|
|
62
|
+
if (pVars.length > 1) {
|
|
63
|
+
console.warn(`Multiple persistent variables found with name "${name}". Using the last one.`);
|
|
64
|
+
}
|
|
65
|
+
const pVar = pVars[pVars.length - 1];
|
|
66
|
+
return pVar?.value?.value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.PersistentVarsTable = PersistentVarsTable;
|
|
70
|
+
(0, table_definitions_system_1.registerSystemTableDefinition)(exports.persistentVarsMetaData, schema, PersistentVarsTable);
|
|
71
|
+
function PersistentVars(dataContext) {
|
|
72
|
+
return (0, user_context_singleton_1.getTableContainer)(dataContext).getTable(exports.persistentVarsMetaData, schema, PersistentVarsTable);
|
|
73
|
+
}
|
|
74
|
+
async function getPersistentVar(name, dataContext) {
|
|
75
|
+
const pVars = await PersistentVars(dataContext).list({ name });
|
|
76
|
+
if (!pVars.length) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const pVarDevice = pVars.find(pVar => pVar.scope === 'device');
|
|
80
|
+
if (pVarDevice) {
|
|
81
|
+
return pVarDevice;
|
|
82
|
+
}
|
|
83
|
+
return pVars[0];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A persistent variable that is stored only on this device, in the user's personal db
|
|
87
|
+
*/
|
|
88
|
+
function deviceVar(name, opts) {
|
|
89
|
+
return pvar(name, { ...opts, scope: 'device' });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* A persistent variable that is stored in the user's personal db and synced across all their devices
|
|
93
|
+
*/
|
|
94
|
+
function userVar(name, opts) {
|
|
95
|
+
return pvar(name, { ...opts, scope: 'user' });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A persistent variable that is shared by all users in a group. It is stored in the group's db and synced across all users and devices in the group.
|
|
99
|
+
* It can have a different value for each group on the device.
|
|
100
|
+
*/
|
|
101
|
+
function groupVar(name, opts) {
|
|
102
|
+
return pvar(name, { ...opts, scope: 'group' });
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A persistent variable that is stored only on this device, in the user's personal db.
|
|
106
|
+
* It can have a different value for each group on the device but is not synced to other devices.
|
|
107
|
+
*/
|
|
108
|
+
function groupDeviceVar(name, opts) {
|
|
109
|
+
return pvar(name, { ...opts, scope: 'groupDevice' });
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A persistent variable that is stored in the user's personal db and synced across all their devices in the group.
|
|
113
|
+
* It can have a different value for each user in the group and a different value for each group the user is in.
|
|
114
|
+
*/
|
|
115
|
+
function groupUserVar(name, opts) {
|
|
116
|
+
return pvar(name, { ...opts, scope: 'groupUser' });
|
|
117
|
+
}
|
|
118
|
+
function pvar(name, opts) {
|
|
119
|
+
const currentValue = (0, observable_1.observable)(opts?.dbValue || opts?.defaultValue);
|
|
120
|
+
const scope = opts.scope || 'device';
|
|
121
|
+
let isSecret = opts.isSecret;
|
|
122
|
+
let rec = undefined;
|
|
123
|
+
currentValue.loadingPromise = new Promise(async (resolve) => {
|
|
124
|
+
const userContext = opts?.userContext || await (0, user_context_singleton_1.getUserContext)();
|
|
125
|
+
function getDataContext() {
|
|
126
|
+
if (opts?.dataContext) {
|
|
127
|
+
return opts.dataContext;
|
|
128
|
+
}
|
|
129
|
+
if (scope === 'group') {
|
|
130
|
+
return userContext.defaultDataContext();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
return userContext.userDataContext;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function getVarNameInDb() {
|
|
137
|
+
if (scope === 'groupDevice' || scope === 'groupUser') {
|
|
138
|
+
const dc = opts?.dataContext || userContext.defaultDataContext();
|
|
139
|
+
// if it's a group var saved in the user's personal db, it's postfixed with the dataContextId to make it unique
|
|
140
|
+
return name + `_` + dc.dataContextId;
|
|
141
|
+
}
|
|
142
|
+
return name;
|
|
143
|
+
}
|
|
144
|
+
async function loadRecFromDb() {
|
|
145
|
+
const dc = getDataContext();
|
|
146
|
+
const table = PersistentVars(dc);
|
|
147
|
+
const name = getVarNameInDb();
|
|
148
|
+
let dbRec = await table.findOne({ name });
|
|
149
|
+
if (dbRec) {
|
|
150
|
+
if (dbRec.scope !== scope) {
|
|
151
|
+
console.warn(`${name}: deleting old persistent var record because scopes don't match. If this is unexpected there could be two different persistent variables using the same name`);
|
|
152
|
+
await table.delete(dbRec);
|
|
153
|
+
dbRec = undefined;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!dbRec) {
|
|
157
|
+
dbRec = {
|
|
158
|
+
persistentVarId: (0, utils_1.newid)(),
|
|
159
|
+
name,
|
|
160
|
+
scope,
|
|
161
|
+
isSecret,
|
|
162
|
+
value: { value: opts?.defaultValue },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// if the db says it's secret but the caller didn't specify, assume it's secret
|
|
166
|
+
if (dbRec.isSecret !== undefined && opts.isSecret === undefined) {
|
|
167
|
+
isSecret = dbRec.isSecret;
|
|
168
|
+
}
|
|
169
|
+
return dbRec;
|
|
170
|
+
}
|
|
171
|
+
async function saveVarToDb(value) {
|
|
172
|
+
if (!rec) {
|
|
173
|
+
rec = await loadRecFromDb();
|
|
174
|
+
}
|
|
175
|
+
const oldValue = rec.value.value;
|
|
176
|
+
if ((0, lodash_1.isEqual)(value, oldValue)) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
rec.value.value = value;
|
|
180
|
+
const dc = getDataContext();
|
|
181
|
+
const table = PersistentVars(dc);
|
|
182
|
+
// delete if value equals default value
|
|
183
|
+
if (rec.value.value === opts?.defaultValue) {
|
|
184
|
+
await table.delete(rec);
|
|
185
|
+
rec.persistentVarId = (0, utils_1.newid)();
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
await table.save(rec);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// subscribe to db changes
|
|
192
|
+
userContext.subscribeToDataChangedAcrossAllGroups(PersistentVars(), async (evt) => {
|
|
193
|
+
const dbRec = evt.data.dataObject;
|
|
194
|
+
const dbName = getVarNameInDb();
|
|
195
|
+
if (dbRec.name === dbName && !rec) {
|
|
196
|
+
rec = await loadRecFromDb();
|
|
197
|
+
}
|
|
198
|
+
if (dbRec.persistentVarId === rec?.persistentVarId) {
|
|
199
|
+
rec = dbRec;
|
|
200
|
+
if (evt.data.op === 'delete') {
|
|
201
|
+
rec.persistentVarId = (0, utils_1.newid)(); // change id so next save creates new pVar
|
|
202
|
+
rec.value.value = opts?.defaultValue;
|
|
203
|
+
}
|
|
204
|
+
if (!(0, lodash_1.isEqual)(currentValue(), rec.value.value)) {
|
|
205
|
+
currentValue(rec.value.value);
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// update group-dependent variables if group context changes and it hasn't been pinned to a specific data context
|
|
211
|
+
const groupDependentScopes = ['group', 'groupDevice', 'groupUser'];
|
|
212
|
+
if (!opts?.dataContext && groupDependentScopes.includes(scope)) {
|
|
213
|
+
userContext.defaultDataContext.subscribe(async (newDataContext) => {
|
|
214
|
+
rec = await loadRecFromDb();
|
|
215
|
+
currentValue(rec.value.value);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (!Object.keys(opts ?? {}).includes('dbValue')) {
|
|
219
|
+
rec = await loadRecFromDb();
|
|
220
|
+
if (!(0, lodash_1.isEqual)(rec.value.value, currentValue())) {
|
|
221
|
+
currentValue(rec.value.value);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
currentValue.subscribe(newValue => {
|
|
225
|
+
saveVarToDb(newValue);
|
|
226
|
+
});
|
|
227
|
+
resolve(currentValue);
|
|
228
|
+
});
|
|
229
|
+
return currentValue;
|
|
230
|
+
}
|