agl 1.0.17 → 21.0.2

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.
Files changed (277) hide show
  1. package/.smartconfig.json +55 -0
  2. package/changelog.md +1026 -0
  3. package/cli.js +14 -0
  4. package/dist_serve/bundle.js +44778 -0
  5. package/dist_serve/index.html +13 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.authmodels.d.ts +126 -0
  9. package/dist_ts/classes.authmodels.js +1422 -0
  10. package/dist_ts/classes.authstore.d.ts +160 -0
  11. package/dist_ts/classes.authstore.js +2483 -0
  12. package/dist_ts/classes.browserresourcehost.d.ts +85 -0
  13. package/dist_ts/classes.browserresourcehost.js +912 -0
  14. package/dist_ts/classes.cli.d.ts +21 -0
  15. package/dist_ts/classes.cli.js +1082 -0
  16. package/dist_ts/classes.config.d.ts +23 -0
  17. package/dist_ts/classes.config.js +267 -0
  18. package/dist_ts/classes.controller.d.ts +523 -0
  19. package/dist_ts/classes.controller.js +10611 -0
  20. package/dist_ts/classes.controllermanagement.d.ts +32 -0
  21. package/dist_ts/classes.controllermanagement.js +222 -0
  22. package/dist_ts/classes.draftmanager.d.ts +30 -0
  23. package/dist_ts/classes.draftmanager.js +179 -0
  24. package/dist_ts/classes.embeddeddb.d.ts +30 -0
  25. package/dist_ts/classes.embeddeddb.js +159 -0
  26. package/dist_ts/classes.flexframedtransport.d.ts +56 -0
  27. package/dist_ts/classes.flexframedtransport.js +275 -0
  28. package/dist_ts/classes.flexmodels.private.d.ts +231 -0
  29. package/dist_ts/classes.flexmodels.private.js +985 -0
  30. package/dist_ts/classes.flexmodels.public.d.ts +207 -0
  31. package/dist_ts/classes.flexmodels.public.js +885 -0
  32. package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
  33. package/dist_ts/classes.flexprojectionreader.js +580 -0
  34. package/dist_ts/classes.flexservice.d.ts +196 -0
  35. package/dist_ts/classes.flexservice.js +3704 -0
  36. package/dist_ts/classes.flexstore.d.ts +174 -0
  37. package/dist_ts/classes.flexstore.js +3400 -0
  38. package/dist_ts/classes.flexsupervisor.d.ts +105 -0
  39. package/dist_ts/classes.flexsupervisor.js +1191 -0
  40. package/dist_ts/classes.gitreversion.d.ts +431 -0
  41. package/dist_ts/classes.gitreversion.js +10592 -0
  42. package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
  43. package/dist_ts/classes.harnessoperationmanager.js +602 -0
  44. package/dist_ts/classes.opencodeclient.d.ts +146 -0
  45. package/dist_ts/classes.opencodeclient.js +3003 -0
  46. package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
  47. package/dist_ts/classes.opencodesupervisor.js +1003 -0
  48. package/dist_ts/classes.passkeymanager.d.ts +34 -0
  49. package/dist_ts/classes.passkeymanager.js +456 -0
  50. package/dist_ts/classes.processinspection.d.ts +50 -0
  51. package/dist_ts/classes.processinspection.js +484 -0
  52. package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
  53. package/dist_ts/classes.resourcecoordinator.js +294 -0
  54. package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
  55. package/dist_ts/classes.sessionintelligencereader.js +40 -0
  56. package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
  57. package/dist_ts/classes.systemmetricssampler.js +168 -0
  58. package/dist_ts/classes.terminalmanager.d.ts +95 -0
  59. package/dist_ts/classes.terminalmanager.js +981 -0
  60. package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
  61. package/dist_ts/classes.terminalresourcehost.js +84 -0
  62. package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
  63. package/dist_ts/classes.upgradecoordinator.js +2155 -0
  64. package/dist_ts/classes.upgradetransaction.d.ts +92 -0
  65. package/dist_ts/classes.upgradetransaction.js +2125 -0
  66. package/dist_ts/classes.uploadmanager.d.ts +24 -0
  67. package/dist_ts/classes.uploadmanager.js +210 -0
  68. package/dist_ts/classes.validation.d.ts +91 -0
  69. package/dist_ts/classes.validation.js +1087 -0
  70. package/dist_ts/flexharness.child.d.ts +1 -0
  71. package/dist_ts/flexharness.child.js +28 -0
  72. package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
  73. package/dist_ts/functions.canonicaldirectory.js +144 -0
  74. package/dist_ts/functions.controllerdataroot.d.ts +15 -0
  75. package/dist_ts/functions.controllerdataroot.js +76 -0
  76. package/dist_ts/functions.embeddeddb.d.ts +2 -0
  77. package/dist_ts/functions.embeddeddb.js +21 -0
  78. package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
  79. package/dist_ts/functions.flexcredentialstore.js +93 -0
  80. package/dist_ts/functions.opencodeauth.d.ts +3 -0
  81. package/dist_ts/functions.opencodeauth.js +31 -0
  82. package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
  83. package/dist_ts/functions.runtimeenvironment.js +79 -0
  84. package/dist_ts/functions.upgradefollower.d.ts +3 -0
  85. package/dist_ts/functions.upgradefollower.js +95 -0
  86. package/dist_ts/index.d.ts +24 -0
  87. package/dist_ts/index.js +25 -0
  88. package/dist_ts/interfaces.auth.d.ts +181 -0
  89. package/dist_ts/interfaces.auth.js +82 -0
  90. package/dist_ts/interfaces.config.d.ts +34 -0
  91. package/dist_ts/interfaces.config.js +2 -0
  92. package/dist_ts/interfaces.flexipc.d.ts +939 -0
  93. package/dist_ts/interfaces.flexipc.js +1492 -0
  94. package/dist_ts/interfaces.gitreversion.d.ts +246 -0
  95. package/dist_ts/interfaces.gitreversion.js +2 -0
  96. package/dist_ts/interfaces.lifecycle.d.ts +37 -0
  97. package/dist_ts/interfaces.lifecycle.js +2 -0
  98. package/dist_ts/interfaces.opencode.d.ts +101 -0
  99. package/dist_ts/interfaces.opencode.js +3 -0
  100. package/dist_ts/interfaces.projects.d.ts +156 -0
  101. package/dist_ts/interfaces.projects.js +5 -0
  102. package/dist_ts/plugins.d.ts +36 -0
  103. package/dist_ts/plugins.js +40 -0
  104. package/dist_ts_interfaces/index.d.ts +2 -0
  105. package/dist_ts_interfaces/index.js +3 -0
  106. package/dist_ts_interfaces/interfaces.d.ts +747 -0
  107. package/dist_ts_interfaces/interfaces.js +47 -0
  108. package/dist_ts_interfaces/plugins.d.ts +4 -0
  109. package/dist_ts_interfaces/plugins.js +3 -0
  110. package/dist_ts_interfaces/requests.d.ts +806 -0
  111. package/dist_ts_interfaces/requests.js +2 -0
  112. package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
  113. package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
  114. package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
  115. package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
  116. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
  117. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
  118. package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
  119. package/dist_ts_migration/classes.migrationrunner.js +34 -0
  120. package/dist_ts_migration/index.d.ts +12 -0
  121. package/dist_ts_migration/index.js +13 -0
  122. package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
  123. package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
  124. package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
  125. package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
  126. package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
  127. package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
  128. package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
  129. package/dist_ts_migration/v18_resourcelayout.js +23 -0
  130. package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
  131. package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
  132. package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
  133. package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
  134. package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
  135. package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
  136. package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
  137. package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
  138. package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
  139. package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
  140. package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
  141. package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
  142. package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
  143. package/dist_ts_migration/v6_protocoldocuments.js +138 -0
  144. package/html/index.html +13 -0
  145. package/{LICENSE → license.md} +2 -2
  146. package/package.json +86 -48
  147. package/readme.md +480 -0
  148. package/readme.plan.md +188 -0
  149. package/ts/00_commitinfo_data.ts +8 -0
  150. package/ts/classes.authmodels.ts +1245 -0
  151. package/ts/classes.authstore.ts +3274 -0
  152. package/ts/classes.browserresourcehost.ts +1205 -0
  153. package/ts/classes.cli.ts +1254 -0
  154. package/ts/classes.config.ts +351 -0
  155. package/ts/classes.controller.ts +14426 -0
  156. package/ts/classes.controllermanagement.ts +330 -0
  157. package/ts/classes.draftmanager.ts +232 -0
  158. package/ts/classes.embeddeddb.ts +166 -0
  159. package/ts/classes.flexframedtransport.ts +283 -0
  160. package/ts/classes.flexmodels.private.ts +823 -0
  161. package/ts/classes.flexmodels.public.ts +732 -0
  162. package/ts/classes.flexprojectionreader.ts +816 -0
  163. package/ts/classes.flexservice.ts +4302 -0
  164. package/ts/classes.flexstore.ts +4565 -0
  165. package/ts/classes.flexsupervisor.ts +1453 -0
  166. package/ts/classes.gitreversion.ts +13353 -0
  167. package/ts/classes.harnessoperationmanager.ts +870 -0
  168. package/ts/classes.opencodeclient.ts +4110 -0
  169. package/ts/classes.opencodesupervisor.ts +1280 -0
  170. package/ts/classes.passkeymanager.ts +570 -0
  171. package/ts/classes.processinspection.ts +623 -0
  172. package/ts/classes.resourcecoordinator.ts +436 -0
  173. package/ts/classes.sessionintelligencereader.ts +52 -0
  174. package/ts/classes.systemmetricssampler.ts +215 -0
  175. package/ts/classes.terminalmanager.ts +1207 -0
  176. package/ts/classes.terminalresourcehost.ts +122 -0
  177. package/ts/classes.upgradecoordinator.ts +2675 -0
  178. package/ts/classes.upgradetransaction.ts +2900 -0
  179. package/ts/classes.uploadmanager.ts +240 -0
  180. package/ts/classes.validation.ts +1409 -0
  181. package/ts/flexharness.child.ts +35 -0
  182. package/ts/functions.canonicaldirectory.ts +213 -0
  183. package/ts/functions.controllerdataroot.ts +107 -0
  184. package/ts/functions.embeddeddb.ts +22 -0
  185. package/ts/functions.flexcredentialstore.ts +128 -0
  186. package/ts/functions.opencodeauth.ts +34 -0
  187. package/ts/functions.runtimeenvironment.ts +90 -0
  188. package/ts/functions.upgradefollower.ts +115 -0
  189. package/ts/index.ts +36 -6
  190. package/ts/interfaces.auth.ts +316 -0
  191. package/ts/interfaces.config.ts +37 -0
  192. package/ts/interfaces.flexipc.ts +2586 -0
  193. package/ts/interfaces.gitreversion.ts +336 -0
  194. package/ts/interfaces.lifecycle.ts +46 -0
  195. package/ts/interfaces.opencode.ts +153 -0
  196. package/ts/interfaces.projects.ts +182 -0
  197. package/ts/plugins.ts +64 -0
  198. package/ts_interfaces/index.ts +2 -0
  199. package/ts_interfaces/interfaces.ts +827 -0
  200. package/ts_interfaces/plugins.ts +15 -0
  201. package/ts_interfaces/requests.ts +1186 -0
  202. package/ts_migration/classes.documentmigrationrunner.ts +32 -0
  203. package/ts_migration/classes.flexmigrationrunner.ts +33 -0
  204. package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
  205. package/ts_migration/classes.migrationrunner.ts +40 -0
  206. package/ts_migration/index.ts +12 -0
  207. package/ts_migration/v10_flexharnessv3migration.ts +35 -0
  208. package/ts_migration/v13_flexprojectionorder.ts +33 -0
  209. package/ts_migration/v16_flexprovidercredentials.ts +196 -0
  210. package/ts_migration/v18_resourcelayout.ts +55 -0
  211. package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
  212. package/ts_migration/v19_flexprojectmanagement.ts +28 -0
  213. package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
  214. package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
  215. package/ts_migration/v2_controllerdataroot.ts +2349 -0
  216. package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
  217. package/ts_migration/v6_protocoldocuments.ts +198 -0
  218. package/ts_web/00_commitinfo_data.ts +8 -0
  219. package/ts_web/classes.controllersocketclient.ts +517 -0
  220. package/ts_web/classes.sessiondraftsync.ts +390 -0
  221. package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
  222. package/ts_web/index.ts +2 -0
  223. package/ts_web/plugins.ts +31 -0
  224. package/.gitlab-ci.yml +0 -71
  225. package/.npmignore +0 -5
  226. package/README.md +0 -40
  227. package/dist/cli.js +0 -2
  228. package/dist/index.d.ts +0 -0
  229. package/dist/index.js +0 -9
  230. package/dist/mod_bundle/index.d.ts +0 -1
  231. package/dist/mod_bundle/index.js +0 -18
  232. package/dist/mod_bundle/mod.plugins.d.ts +0 -4
  233. package/dist/mod_bundle/mod.plugins.js +0 -11
  234. package/dist/mod_install/index.d.ts +0 -4
  235. package/dist/mod_install/index.js +0 -21
  236. package/dist/mod_install/mod.plugins.d.ts +0 -1
  237. package/dist/mod_install/mod.plugins.js +0 -7
  238. package/dist/mod_standard/index.d.ts +0 -4
  239. package/dist/mod_standard/index.js +0 -21
  240. package/dist/mod_standard/mod.browser.d.ts +0 -6
  241. package/dist/mod_standard/mod.browser.js +0 -14
  242. package/dist/mod_standard/mod.clean.d.ts +0 -4
  243. package/dist/mod_standard/mod.clean.js +0 -12
  244. package/dist/mod_standard/mod.compile.d.ts +0 -4
  245. package/dist/mod_standard/mod.compile.js +0 -21
  246. package/dist/mod_standard/mod.plugins.d.ts +0 -8
  247. package/dist/mod_standard/mod.plugins.js +0 -19
  248. package/dist/mod_standard/mod.test.d.ts +0 -4
  249. package/dist/mod_standard/mod.test.js +0 -12
  250. package/dist/plr.cli.d.ts +0 -3
  251. package/dist/plr.cli.js +0 -57
  252. package/dist/plr.config.d.ts +0 -11
  253. package/dist/plr.config.js +0 -26
  254. package/dist/plr.mods.d.ts +0 -17
  255. package/dist/plr.mods.js +0 -17
  256. package/dist/plr.paths.d.ts +0 -19
  257. package/dist/plr.paths.js +0 -26
  258. package/dist/plr.plugins.d.ts +0 -8
  259. package/dist/plr.plugins.js +0 -16
  260. package/npmextra.json +0 -10
  261. package/ts/mod_bundle/index.ts +0 -20
  262. package/ts/mod_bundle/mod.plugins.ts +0 -9
  263. package/ts/mod_install/index.ts +0 -20
  264. package/ts/mod_install/mod.plugins.ts +0 -1
  265. package/ts/mod_standard/index.ts +0 -23
  266. package/ts/mod_standard/mod.browser.ts +0 -17
  267. package/ts/mod_standard/mod.clean.ts +0 -13
  268. package/ts/mod_standard/mod.compile.ts +0 -23
  269. package/ts/mod_standard/mod.plugins.ts +0 -17
  270. package/ts/mod_standard/mod.test.ts +0 -13
  271. package/ts/plr.cli.ts +0 -60
  272. package/ts/plr.config.ts +0 -36
  273. package/ts/plr.mods.ts +0 -25
  274. package/ts/plr.paths.ts +0 -29
  275. package/ts/plr.plugins.ts +0 -17
  276. package/tslint.json +0 -3
  277. package/yarn.lock +0 -3464
@@ -0,0 +1,732 @@
1
+ import * as plugins from './plugins.js';
2
+ import {
3
+ hasFlexExactKeys,
4
+ isFlexPlainObject,
5
+ isFlexPublicMessage,
6
+ isFlexPublicSession,
7
+ } from './interfaces.flexipc.js';
8
+
9
+ type TFlexMessage = plugins.flexharness.IFlexMessage;
10
+ type TFlexSession = plugins.flexharness.IFlexSession;
11
+
12
+ export const flexPublicSessionLimit = 2048;
13
+ export const flexPublicMessageLimit = 2048;
14
+ export const flexPublicMessageBytesLimit = 64 * 1024 * 1024;
15
+ export const flexPublicSingleMessageBytesLimit = 480 * 1024;
16
+ export const flexPublicPageBytesLimit = 512 * 1024;
17
+ export const flexPublicPageLimit = 50;
18
+
19
+ export interface IFlexRecordManifest {
20
+ id: string;
21
+ sha256: string;
22
+ bytes: number;
23
+ }
24
+
25
+ export interface IFlexPublicSourceRevision {
26
+ incarnationId: string;
27
+ revision: number;
28
+ }
29
+
30
+ export interface IFlexPublicProjectionSource extends IFlexPublicSourceRevision {
31
+ sessionId: string;
32
+ }
33
+
34
+ export interface IFlexPublicCandidateManifest {
35
+ candidateId: string;
36
+ revision: number;
37
+ sha256: string;
38
+ bytes: number;
39
+ sessionRecords: IFlexRecordManifest[];
40
+ messageRecords: IFlexRecordManifest[];
41
+ sessionsTruncated: boolean;
42
+ messagesTruncated: boolean;
43
+ messageBytesTruncated: boolean;
44
+ visibleDigest: string;
45
+ scopeSource: IFlexPublicSourceRevision;
46
+ projectionSources: IFlexPublicProjectionSource[];
47
+ }
48
+
49
+ export interface IFlexPublicCandidateDocument extends IFlexPublicCandidateManifest {
50
+ id: string;
51
+ controllerId: string;
52
+ scopeId: string;
53
+ createdAt: string;
54
+ }
55
+
56
+ export interface IFlexPublicHeadDocument {
57
+ id: string;
58
+ controllerId: string;
59
+ storageKey: string;
60
+ revision: number;
61
+ currentPublicCandidateId: string;
62
+ publicCandidates: IFlexPublicCandidateManifest[];
63
+ }
64
+
65
+ export interface IFlexPublicSessionRecordDocument {
66
+ id: string;
67
+ controllerId: string;
68
+ scopeId: string;
69
+ candidateId: string;
70
+ revision: number;
71
+ session: TFlexSession;
72
+ createdAt: string;
73
+ }
74
+
75
+ export interface IFlexPublicMessageRecordDocument {
76
+ id: string;
77
+ controllerId: string;
78
+ scopeId: string;
79
+ candidateId: string;
80
+ revision: number;
81
+ messageIndex: number;
82
+ message: TFlexMessage;
83
+ createdAt: string;
84
+ }
85
+
86
+ export interface IFlexProjectionMessageDescriptor {
87
+ id: string;
88
+ index: number;
89
+ /** Absent only on projection sources created before source-order repair. */
90
+ messageIndex?: number;
91
+ sha256: string;
92
+ bytes: number;
93
+ messageCreatedAt: string;
94
+ sessionId: string;
95
+ messageId: string;
96
+ }
97
+
98
+ export interface IFlexProjectionSourceManifest {
99
+ candidateId: string;
100
+ /** Absent only on persisted source chains created before source-order repair. */
101
+ orderVersion?: 1;
102
+ sha256: string;
103
+ bytes: number;
104
+ messageCount: number;
105
+ messagesTruncated: boolean;
106
+ visibleDigest: string;
107
+ latestMessage?: IFlexProjectionMessageDescriptor;
108
+ }
109
+
110
+ export interface IFlexProjectionSourceDocument extends IFlexProjectionSourceManifest {
111
+ id: string;
112
+ controllerId: string;
113
+ scopeId: string;
114
+ sessionId: string;
115
+ incarnationId: string;
116
+ revision: number;
117
+ createdAt: string;
118
+ }
119
+
120
+ export interface IFlexProjectionMessageRecordDocument extends IFlexProjectionMessageDescriptor {
121
+ controllerId: string;
122
+ scopeId: string;
123
+ candidateId: string;
124
+ incarnationId: string;
125
+ revision: number;
126
+ message: TFlexMessage;
127
+ previous?: IFlexProjectionMessageDescriptor;
128
+ createdAt: string;
129
+ }
130
+
131
+ const digestPattern = /^[a-f0-9]{64}$/u;
132
+ const candidateIdPattern = /^[A-Za-z0-9_-]{22}$/u;
133
+
134
+ const isBoundedString = (valueArg: unknown, maximumBytesArg: number): valueArg is string =>
135
+ typeof valueArg === 'string'
136
+ && valueArg.length > 0
137
+ && Buffer.byteLength(valueArg, 'utf8') <= maximumBytesArg;
138
+
139
+ const isNonNegativeInteger = (valueArg: unknown): valueArg is number =>
140
+ Number.isSafeInteger(valueArg) && (valueArg as number) >= 0;
141
+
142
+ const isIsoDate = (valueArg: unknown): valueArg is string =>
143
+ typeof valueArg === 'string'
144
+ && Number.isFinite(Date.parse(valueArg))
145
+ && new Date(valueArg).toISOString() === valueArg;
146
+
147
+ export const isFlexProjectionMessageDescriptor = (
148
+ valueArg: unknown,
149
+ ): valueArg is IFlexProjectionMessageDescriptor => isFlexPlainObject(valueArg)
150
+ && hasFlexExactKeys(valueArg, [
151
+ 'id', 'index', 'sha256', 'bytes', 'messageCreatedAt', 'sessionId', 'messageId',
152
+ ], ['messageIndex'])
153
+ && isBoundedString(valueArg.id, 1024)
154
+ && isNonNegativeInteger(valueArg.index)
155
+ && (valueArg.messageIndex === undefined || isNonNegativeInteger(valueArg.messageIndex))
156
+ && typeof valueArg.sha256 === 'string'
157
+ && digestPattern.test(valueArg.sha256)
158
+ && isNonNegativeInteger(valueArg.bytes)
159
+ && valueArg.bytes <= flexPublicSingleMessageBytesLimit + 4096
160
+ && isIsoDate(valueArg.messageCreatedAt)
161
+ && isBoundedString(valueArg.sessionId, 512)
162
+ && isBoundedString(valueArg.messageId, 512);
163
+
164
+ export const isFlexProjectionSourceManifest = (
165
+ valueArg: unknown,
166
+ ): valueArg is IFlexProjectionSourceManifest => isFlexPlainObject(valueArg)
167
+ && hasFlexExactKeys(valueArg, [
168
+ 'candidateId', 'sha256', 'bytes', 'messageCount', 'messagesTruncated', 'visibleDigest',
169
+ ], ['latestMessage', 'orderVersion'])
170
+ && typeof valueArg.candidateId === 'string'
171
+ && candidateIdPattern.test(valueArg.candidateId)
172
+ && (valueArg.orderVersion === undefined || valueArg.orderVersion === 1)
173
+ && typeof valueArg.sha256 === 'string'
174
+ && digestPattern.test(valueArg.sha256)
175
+ && isNonNegativeInteger(valueArg.bytes)
176
+ && valueArg.bytes <= 4096
177
+ && isNonNegativeInteger(valueArg.messageCount)
178
+ && typeof valueArg.messagesTruncated === 'boolean'
179
+ && typeof valueArg.visibleDigest === 'string'
180
+ && digestPattern.test(valueArg.visibleDigest)
181
+ && (valueArg.latestMessage === undefined
182
+ ? valueArg.messageCount === 0
183
+ : isFlexProjectionMessageDescriptor(valueArg.latestMessage)
184
+ && valueArg.messageCount === valueArg.latestMessage.index + 1)
185
+ && (
186
+ valueArg.orderVersion !== 1
187
+ || valueArg.latestMessage === undefined
188
+ || (
189
+ isFlexProjectionMessageDescriptor(valueArg.latestMessage)
190
+ && valueArg.latestMessage.messageIndex !== undefined
191
+ )
192
+ );
193
+
194
+ export const isFlexRecordManifest = (valueArg: unknown): valueArg is IFlexRecordManifest =>
195
+ isFlexPlainObject(valueArg)
196
+ && hasFlexExactKeys(valueArg, ['id', 'sha256', 'bytes'])
197
+ && isBoundedString(valueArg.id, 1024)
198
+ && typeof valueArg.sha256 === 'string'
199
+ && digestPattern.test(valueArg.sha256)
200
+ && isNonNegativeInteger(valueArg.bytes);
201
+
202
+ const isFlexPublicSourceRevision = (valueArg: unknown): valueArg is IFlexPublicSourceRevision =>
203
+ isFlexPlainObject(valueArg)
204
+ && hasFlexExactKeys(valueArg, ['incarnationId', 'revision'])
205
+ && typeof valueArg.incarnationId === 'string'
206
+ && candidateIdPattern.test(valueArg.incarnationId)
207
+ && isNonNegativeInteger(valueArg.revision)
208
+ && valueArg.revision >= 1;
209
+
210
+ const isFlexPublicProjectionSource = (
211
+ valueArg: unknown,
212
+ ): valueArg is IFlexPublicProjectionSource => isFlexPlainObject(valueArg)
213
+ && hasFlexExactKeys(valueArg, ['sessionId', 'incarnationId', 'revision'])
214
+ && isBoundedString(valueArg.sessionId, 512)
215
+ && typeof valueArg.incarnationId === 'string'
216
+ && candidateIdPattern.test(valueArg.incarnationId)
217
+ && isNonNegativeInteger(valueArg.revision)
218
+ && valueArg.revision >= 1;
219
+
220
+ export const isFlexPublicCandidateManifest = (
221
+ valueArg: unknown,
222
+ ): valueArg is IFlexPublicCandidateManifest => isFlexPlainObject(valueArg)
223
+ && hasFlexExactKeys(valueArg, [
224
+ 'candidateId',
225
+ 'revision',
226
+ 'sha256',
227
+ 'bytes',
228
+ 'sessionRecords',
229
+ 'messageRecords',
230
+ 'sessionsTruncated',
231
+ 'messagesTruncated',
232
+ 'messageBytesTruncated',
233
+ 'visibleDigest',
234
+ 'scopeSource',
235
+ 'projectionSources',
236
+ ])
237
+ && typeof valueArg.candidateId === 'string'
238
+ && candidateIdPattern.test(valueArg.candidateId)
239
+ && isNonNegativeInteger(valueArg.revision)
240
+ && typeof valueArg.sha256 === 'string'
241
+ && digestPattern.test(valueArg.sha256)
242
+ && isNonNegativeInteger(valueArg.bytes)
243
+ && Array.isArray(valueArg.sessionRecords)
244
+ && valueArg.sessionRecords.length <= flexPublicSessionLimit
245
+ && valueArg.sessionRecords.every(isFlexRecordManifest)
246
+ && Array.isArray(valueArg.messageRecords)
247
+ && valueArg.messageRecords.length <= flexPublicMessageLimit
248
+ && valueArg.messageRecords.every(isFlexRecordManifest)
249
+ && typeof valueArg.sessionsTruncated === 'boolean'
250
+ && typeof valueArg.messagesTruncated === 'boolean'
251
+ && typeof valueArg.messageBytesTruncated === 'boolean'
252
+ && typeof valueArg.visibleDigest === 'string'
253
+ && digestPattern.test(valueArg.visibleDigest)
254
+ && isFlexPublicSourceRevision(valueArg.scopeSource)
255
+ && Array.isArray(valueArg.projectionSources)
256
+ && valueArg.projectionSources.length <= flexPublicSessionLimit
257
+ && valueArg.projectionSources.every(isFlexPublicProjectionSource)
258
+ && new Set(valueArg.projectionSources.map((source) => source.sessionId)).size
259
+ === valueArg.projectionSources.length;
260
+
261
+ export function assertFlexPublicCandidateDocument(
262
+ valueArg: unknown,
263
+ ): asserts valueArg is IFlexPublicCandidateDocument {
264
+ if (
265
+ !isFlexPlainObject(valueArg)
266
+ || !hasFlexExactKeys(valueArg, [
267
+ 'id',
268
+ 'controllerId',
269
+ 'scopeId',
270
+ 'candidateId',
271
+ 'revision',
272
+ 'sha256',
273
+ 'bytes',
274
+ 'sessionRecords',
275
+ 'messageRecords',
276
+ 'sessionsTruncated',
277
+ 'messagesTruncated',
278
+ 'messageBytesTruncated',
279
+ 'visibleDigest',
280
+ 'scopeSource',
281
+ 'projectionSources',
282
+ 'createdAt',
283
+ ])
284
+ || !isBoundedString(valueArg.id, 1024)
285
+ || !isBoundedString(valueArg.controllerId, 512)
286
+ || !isBoundedString(valueArg.scopeId, 512)
287
+ || !isIsoDate(valueArg.createdAt)
288
+ || !isFlexPublicCandidateManifest({
289
+ candidateId: valueArg.candidateId,
290
+ revision: valueArg.revision,
291
+ sha256: valueArg.sha256,
292
+ bytes: valueArg.bytes,
293
+ sessionRecords: valueArg.sessionRecords,
294
+ messageRecords: valueArg.messageRecords,
295
+ sessionsTruncated: valueArg.sessionsTruncated,
296
+ messagesTruncated: valueArg.messagesTruncated,
297
+ messageBytesTruncated: valueArg.messageBytesTruncated,
298
+ visibleDigest: valueArg.visibleDigest,
299
+ scopeSource: valueArg.scopeSource,
300
+ projectionSources: valueArg.projectionSources,
301
+ })
302
+ ) throw new Error('Invalid Flex public candidate document.');
303
+ }
304
+
305
+ export function assertFlexPublicHeadDocument(
306
+ valueArg: unknown,
307
+ ): asserts valueArg is IFlexPublicHeadDocument {
308
+ if (
309
+ !isFlexPlainObject(valueArg)
310
+ || !hasFlexExactKeys(valueArg, [
311
+ 'id', 'controllerId', 'storageKey', 'revision',
312
+ 'currentPublicCandidateId', 'publicCandidates',
313
+ ])
314
+ || !isBoundedString(valueArg.id, 1024)
315
+ || !isBoundedString(valueArg.controllerId, 512)
316
+ || !isBoundedString(valueArg.storageKey, 512)
317
+ || !isNonNegativeInteger(valueArg.revision)
318
+ || valueArg.revision < 1
319
+ || typeof valueArg.currentPublicCandidateId !== 'string'
320
+ || !candidateIdPattern.test(valueArg.currentPublicCandidateId)
321
+ || !Array.isArray(valueArg.publicCandidates)
322
+ || valueArg.publicCandidates.length < 1
323
+ || valueArg.publicCandidates.length > 4
324
+ || !valueArg.publicCandidates.every(isFlexPublicCandidateManifest)
325
+ || valueArg.publicCandidates[0]?.candidateId !== valueArg.currentPublicCandidateId
326
+ || valueArg.publicCandidates[0]?.revision !== valueArg.revision
327
+ || valueArg.publicCandidates.some((candidate, index, candidates) => (
328
+ index > 0 && candidate.revision >= candidates[index - 1]!.revision
329
+ ))
330
+ ) throw new Error('Invalid Flex public head document.');
331
+ }
332
+
333
+ export function assertFlexPublicSessionRecordDocument(
334
+ valueArg: unknown,
335
+ ): asserts valueArg is IFlexPublicSessionRecordDocument {
336
+ if (
337
+ !isFlexPlainObject(valueArg)
338
+ || !hasFlexExactKeys(valueArg, [
339
+ 'id', 'controllerId', 'scopeId', 'candidateId', 'revision', 'session', 'createdAt',
340
+ ])
341
+ || !isBoundedString(valueArg.id, 1024)
342
+ || !isBoundedString(valueArg.controllerId, 512)
343
+ || !isBoundedString(valueArg.scopeId, 512)
344
+ || typeof valueArg.candidateId !== 'string'
345
+ || !candidateIdPattern.test(valueArg.candidateId)
346
+ || !isNonNegativeInteger(valueArg.revision)
347
+ || !isIsoDate(valueArg.createdAt)
348
+ || !isFlexPublicSession(valueArg.session)
349
+ || valueArg.session.scopeId !== valueArg.scopeId
350
+ ) throw new Error('Invalid Flex public session record.');
351
+ }
352
+
353
+ export function assertFlexPublicMessageRecordDocument(
354
+ valueArg: unknown,
355
+ ): asserts valueArg is IFlexPublicMessageRecordDocument {
356
+ if (
357
+ !isFlexPlainObject(valueArg)
358
+ || !hasFlexExactKeys(valueArg, [
359
+ 'id', 'controllerId', 'scopeId', 'candidateId', 'revision', 'messageIndex',
360
+ 'message', 'createdAt',
361
+ ])
362
+ || !isBoundedString(valueArg.id, 1024)
363
+ || !isBoundedString(valueArg.controllerId, 512)
364
+ || !isBoundedString(valueArg.scopeId, 512)
365
+ || typeof valueArg.candidateId !== 'string'
366
+ || !candidateIdPattern.test(valueArg.candidateId)
367
+ || !isNonNegativeInteger(valueArg.revision)
368
+ || !isNonNegativeInteger(valueArg.messageIndex)
369
+ || !isIsoDate(valueArg.createdAt)
370
+ || !isFlexPublicMessage(valueArg.message)
371
+ ) throw new Error('Invalid Flex public message record.');
372
+ }
373
+
374
+ export function assertFlexProjectionSourceDocument(
375
+ valueArg: unknown,
376
+ ): asserts valueArg is IFlexProjectionSourceDocument {
377
+ if (
378
+ !isFlexPlainObject(valueArg)
379
+ || !hasFlexExactKeys(valueArg, [
380
+ 'id', 'controllerId', 'scopeId', 'sessionId', 'incarnationId', 'revision',
381
+ 'candidateId', 'sha256', 'bytes', 'messageCount', 'messagesTruncated',
382
+ 'visibleDigest', 'createdAt',
383
+ ], ['latestMessage', 'orderVersion'])
384
+ || !isBoundedString(valueArg.id, 1024)
385
+ || !isBoundedString(valueArg.controllerId, 512)
386
+ || !isBoundedString(valueArg.scopeId, 512)
387
+ || !isBoundedString(valueArg.sessionId, 512)
388
+ || typeof valueArg.incarnationId !== 'string'
389
+ || !candidateIdPattern.test(valueArg.incarnationId)
390
+ || !isNonNegativeInteger(valueArg.revision)
391
+ || valueArg.revision < 1
392
+ || !isIsoDate(valueArg.createdAt)
393
+ || !isFlexProjectionSourceManifest({
394
+ candidateId: valueArg.candidateId,
395
+ ...(valueArg.orderVersion === undefined ? {} : { orderVersion: valueArg.orderVersion }),
396
+ sha256: valueArg.sha256,
397
+ bytes: valueArg.bytes,
398
+ messageCount: valueArg.messageCount,
399
+ messagesTruncated: valueArg.messagesTruncated,
400
+ visibleDigest: valueArg.visibleDigest,
401
+ ...(valueArg.latestMessage === undefined ? {} : { latestMessage: valueArg.latestMessage }),
402
+ })
403
+ ) throw new Error('Invalid Flex projection source document.');
404
+ }
405
+
406
+ export function assertFlexProjectionMessageRecordDocument(
407
+ valueArg: unknown,
408
+ ): asserts valueArg is IFlexProjectionMessageRecordDocument {
409
+ if (
410
+ !isFlexPlainObject(valueArg)
411
+ || !hasFlexExactKeys(valueArg, [
412
+ 'id', 'controllerId', 'scopeId', 'candidateId', 'sessionId', 'incarnationId',
413
+ 'revision', 'index', 'sha256', 'bytes', 'messageCreatedAt', 'messageId',
414
+ 'message', 'createdAt',
415
+ ], ['messageIndex', 'previous'])
416
+ || !isBoundedString(valueArg.controllerId, 512)
417
+ || !isBoundedString(valueArg.scopeId, 512)
418
+ || typeof valueArg.candidateId !== 'string'
419
+ || !candidateIdPattern.test(valueArg.candidateId)
420
+ || !isBoundedString(valueArg.sessionId, 512)
421
+ || typeof valueArg.incarnationId !== 'string'
422
+ || !candidateIdPattern.test(valueArg.incarnationId)
423
+ || !isNonNegativeInteger(valueArg.revision)
424
+ || valueArg.revision < 1
425
+ || !isIsoDate(valueArg.createdAt)
426
+ || !isFlexProjectionMessageDescriptor({
427
+ id: valueArg.id,
428
+ index: valueArg.index,
429
+ ...(valueArg.messageIndex === undefined ? {} : { messageIndex: valueArg.messageIndex }),
430
+ sha256: valueArg.sha256,
431
+ bytes: valueArg.bytes,
432
+ messageCreatedAt: valueArg.messageCreatedAt,
433
+ sessionId: valueArg.sessionId,
434
+ messageId: valueArg.messageId,
435
+ })
436
+ || !isFlexPublicMessage(valueArg.message)
437
+ || valueArg.message.sessionId !== valueArg.sessionId
438
+ || valueArg.message.messageId !== valueArg.messageId
439
+ || valueArg.message.createdAt !== valueArg.messageCreatedAt
440
+ || (valueArg.previous !== undefined
441
+ && !isFlexProjectionMessageDescriptor(valueArg.previous))
442
+ ) throw new Error('Invalid Flex projection message record.');
443
+ }
444
+
445
+ @plugins.smartdata.compoundIndex({
446
+ name: 'flex_public_candidate_orphans',
447
+ key: { controllerId: 1, createdAt: 1, _id: 1 },
448
+ })
449
+ @plugins.smartdata.managed({ collectionName: 'flex_public_candidates' })
450
+ export class FlexPublicCandidateModel extends plugins.smartdata.SmartDataDbDoc<
451
+ FlexPublicCandidateModel,
452
+ IFlexPublicCandidateDocument
453
+ > {
454
+ @plugins.smartdata.unI()
455
+ public id!: string;
456
+
457
+ @plugins.smartdata.svDb()
458
+ public controllerId!: string;
459
+
460
+ @plugins.smartdata.index()
461
+ public scopeId!: string;
462
+
463
+ @plugins.smartdata.index()
464
+ public candidateId!: string;
465
+
466
+ @plugins.smartdata.svDb()
467
+ public revision!: number;
468
+
469
+ @plugins.smartdata.svDb()
470
+ public sha256!: string;
471
+
472
+ @plugins.smartdata.svDb()
473
+ public bytes!: number;
474
+
475
+ @plugins.smartdata.svDb()
476
+ public sessionRecords!: IFlexRecordManifest[];
477
+
478
+ @plugins.smartdata.svDb()
479
+ public messageRecords!: IFlexRecordManifest[];
480
+
481
+ @plugins.smartdata.svDb()
482
+ public sessionsTruncated!: boolean;
483
+
484
+ @plugins.smartdata.svDb()
485
+ public messagesTruncated!: boolean;
486
+
487
+ @plugins.smartdata.svDb()
488
+ public messageBytesTruncated!: boolean;
489
+
490
+ @plugins.smartdata.svDb()
491
+ public visibleDigest!: string;
492
+
493
+ @plugins.smartdata.svDb()
494
+ public scopeSource!: IFlexPublicSourceRevision;
495
+
496
+ @plugins.smartdata.svDb()
497
+ public projectionSources!: IFlexPublicProjectionSource[];
498
+
499
+ @plugins.smartdata.index()
500
+ public createdAt!: string;
501
+ }
502
+
503
+ @plugins.smartdata.compoundIndex({
504
+ name: 'flex_public_head_candidate_owner',
505
+ key: { controllerId: 1, 'publicCandidates.candidateId': 1 },
506
+ })
507
+ @plugins.smartdata.managed({ collectionName: 'flex_public_heads' })
508
+ @plugins.smartdata.exactPersistence({ assertDocument: assertFlexPublicHeadDocument })
509
+ export class FlexPublicHeadModel extends plugins.smartdata.SmartDataDbDoc<
510
+ FlexPublicHeadModel,
511
+ IFlexPublicHeadDocument
512
+ > {
513
+ declare static exact: plugins.smartdata.TExact<FlexPublicHeadModel>;
514
+
515
+ @plugins.smartdata.unI()
516
+ public id!: string;
517
+
518
+ @plugins.smartdata.index()
519
+ public controllerId!: string;
520
+
521
+ @plugins.smartdata.index()
522
+ public storageKey!: string;
523
+
524
+ @plugins.smartdata.svDb()
525
+ public revision!: number;
526
+
527
+ @plugins.smartdata.svDb()
528
+ public currentPublicCandidateId!: string;
529
+
530
+ @plugins.smartdata.svDb()
531
+ public publicCandidates!: IFlexPublicCandidateManifest[];
532
+ }
533
+
534
+ @plugins.smartdata.managed({ collectionName: 'flex_public_sessions' })
535
+ export class FlexPublicSessionRecordModel extends plugins.smartdata.SmartDataDbDoc<
536
+ FlexPublicSessionRecordModel,
537
+ IFlexPublicSessionRecordDocument
538
+ > {
539
+ @plugins.smartdata.unI()
540
+ public id!: string;
541
+
542
+ @plugins.smartdata.svDb()
543
+ public controllerId!: string;
544
+
545
+ @plugins.smartdata.index()
546
+ public scopeId!: string;
547
+
548
+ @plugins.smartdata.index()
549
+ public candidateId!: string;
550
+
551
+ @plugins.smartdata.svDb()
552
+ public revision!: number;
553
+
554
+ @plugins.smartdata.svDb()
555
+ public session!: TFlexSession;
556
+
557
+ @plugins.smartdata.index()
558
+ public createdAt!: string;
559
+ }
560
+
561
+ @plugins.smartdata.managed({ collectionName: 'flex_public_messages' })
562
+ export class FlexPublicMessageRecordModel extends plugins.smartdata.SmartDataDbDoc<
563
+ FlexPublicMessageRecordModel,
564
+ IFlexPublicMessageRecordDocument
565
+ > {
566
+ @plugins.smartdata.unI()
567
+ public id!: string;
568
+
569
+ @plugins.smartdata.svDb()
570
+ public controllerId!: string;
571
+
572
+ @plugins.smartdata.index()
573
+ public scopeId!: string;
574
+
575
+ @plugins.smartdata.index()
576
+ public candidateId!: string;
577
+
578
+ @plugins.smartdata.svDb()
579
+ public revision!: number;
580
+
581
+ @plugins.smartdata.svDb()
582
+ public messageIndex!: number;
583
+
584
+ @plugins.smartdata.svDb()
585
+ public message!: TFlexMessage;
586
+
587
+ @plugins.smartdata.index()
588
+ public createdAt!: string;
589
+ }
590
+
591
+ @plugins.smartdata.compoundIndex({
592
+ name: 'flex_projection_source_orphans',
593
+ key: { controllerId: 1, createdAt: 1, _id: 1 },
594
+ })
595
+ @plugins.smartdata.managed({ collectionName: 'flex_projection_sources' })
596
+ export class FlexProjectionSourceModel extends plugins.smartdata.SmartDataDbDoc<
597
+ FlexProjectionSourceModel,
598
+ IFlexProjectionSourceDocument
599
+ > {
600
+ @plugins.smartdata.unI()
601
+ public id!: string;
602
+
603
+ @plugins.smartdata.svDb()
604
+ public controllerId!: string;
605
+
606
+ @plugins.smartdata.index()
607
+ public scopeId!: string;
608
+
609
+ @plugins.smartdata.index()
610
+ public sessionId!: string;
611
+
612
+ @plugins.smartdata.index()
613
+ public candidateId!: string;
614
+
615
+ @plugins.smartdata.svDb()
616
+ public incarnationId!: string;
617
+
618
+ @plugins.smartdata.svDb()
619
+ public revision!: number;
620
+
621
+ @plugins.smartdata.svDb()
622
+ public orderVersion?: 1;
623
+
624
+ @plugins.smartdata.svDb()
625
+ public sha256!: string;
626
+
627
+ @plugins.smartdata.svDb()
628
+ public bytes!: number;
629
+
630
+ @plugins.smartdata.svDb()
631
+ public messageCount!: number;
632
+
633
+ @plugins.smartdata.svDb()
634
+ public messagesTruncated!: boolean;
635
+
636
+ @plugins.smartdata.svDb()
637
+ public visibleDigest!: string;
638
+
639
+ @plugins.smartdata.svDb()
640
+ public latestMessage?: IFlexProjectionMessageDescriptor;
641
+
642
+ @plugins.smartdata.index()
643
+ public createdAt!: string;
644
+ }
645
+
646
+ @plugins.smartdata.managed({ collectionName: 'flex_projection_messages' })
647
+ export class FlexProjectionMessageRecordModel extends plugins.smartdata.SmartDataDbDoc<
648
+ FlexProjectionMessageRecordModel,
649
+ IFlexProjectionMessageRecordDocument
650
+ > {
651
+ @plugins.smartdata.unI()
652
+ public id!: string;
653
+
654
+ @plugins.smartdata.svDb()
655
+ public controllerId!: string;
656
+
657
+ @plugins.smartdata.index()
658
+ public scopeId!: string;
659
+
660
+ @plugins.smartdata.index()
661
+ public candidateId!: string;
662
+
663
+ @plugins.smartdata.index()
664
+ public sessionId!: string;
665
+
666
+ @plugins.smartdata.svDb()
667
+ public incarnationId!: string;
668
+
669
+ @plugins.smartdata.svDb()
670
+ public revision!: number;
671
+
672
+ @plugins.smartdata.svDb()
673
+ public index!: number;
674
+
675
+ @plugins.smartdata.svDb()
676
+ public messageIndex?: number;
677
+
678
+ @plugins.smartdata.svDb()
679
+ public sha256!: string;
680
+
681
+ @plugins.smartdata.svDb()
682
+ public bytes!: number;
683
+
684
+ @plugins.smartdata.svDb()
685
+ public messageCreatedAt!: string;
686
+
687
+ @plugins.smartdata.svDb()
688
+ public messageId!: string;
689
+
690
+ @plugins.smartdata.svDb()
691
+ public message!: TFlexMessage;
692
+
693
+ @plugins.smartdata.svDb()
694
+ public previous?: IFlexProjectionMessageDescriptor;
695
+
696
+ @plugins.smartdata.index()
697
+ public createdAt!: string;
698
+ }
699
+
700
+ export const flexHeadId = (controllerIdArg: string, scopeIdArg: string): string =>
701
+ `flex-head:${plugins.crypto.createHash('sha256')
702
+ .update(controllerIdArg, 'utf8')
703
+ .update('\0', 'utf8')
704
+ .update(scopeIdArg, 'utf8')
705
+ .digest('hex')}`;
706
+
707
+ export const flexPublicHeadId = (controllerIdArg: string, scopeIdArg: string): string =>
708
+ `flex-public-head:${plugins.crypto.createHash('sha256')
709
+ .update(controllerIdArg, 'utf8')
710
+ .update('\0', 'utf8')
711
+ .update(scopeIdArg, 'utf8')
712
+ .digest('hex')}`;
713
+
714
+ export const registerFlexPublicModels = (
715
+ managerArg: { db: plugins.smartdata.SmartdataDb },
716
+ ): void => {
717
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexPublicCandidateModel);
718
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexPublicHeadModel);
719
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexPublicSessionRecordModel);
720
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexPublicMessageRecordModel);
721
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexProjectionSourceModel);
722
+ plugins.smartdata.setDefaultManagerForDoc(managerArg, FlexProjectionMessageRecordModel);
723
+ };
724
+
725
+ export const initFlexPublicModels = async (): Promise<void> => {
726
+ await FlexPublicCandidateModel.init();
727
+ await FlexPublicHeadModel.init();
728
+ await FlexPublicSessionRecordModel.init();
729
+ await FlexPublicMessageRecordModel.init();
730
+ await FlexProjectionSourceModel.init();
731
+ await FlexProjectionMessageRecordModel.init();
732
+ };