@nlabs/reaktor 1.9.0 → 1.9.1

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 (301) hide show
  1. package/README.md +58 -72
  2. package/docs/GENERATION.md +63 -0
  3. package/lib/actions/analytics.js +1 -1
  4. package/lib/actions/apps.d.ts +2 -2
  5. package/lib/actions/apps.js +1 -1
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +1 -1
  8. package/lib/actions/contentGeneration.d.ts +40 -0
  9. package/lib/actions/contentGeneration.js +206 -0
  10. package/lib/actions/conversations.js +1 -1
  11. package/lib/actions/crm.js +1 -1
  12. package/lib/actions/crud.d.ts +2 -2
  13. package/lib/actions/crud.js +1 -1
  14. package/lib/actions/dynamodb.js +1 -1
  15. package/lib/actions/email.js +1 -1
  16. package/lib/actions/files.d.ts +42 -4
  17. package/lib/actions/files.js +1 -1
  18. package/lib/actions/flags.js +1 -1
  19. package/lib/actions/geminiVideo.d.ts +19 -0
  20. package/lib/actions/geminiVideo.js +161 -0
  21. package/lib/actions/groups.js +1 -1
  22. package/lib/actions/higgsfield.d.ts +20 -0
  23. package/lib/actions/higgsfield.js +148 -0
  24. package/lib/actions/imageGeneration.d.ts +37 -0
  25. package/lib/actions/imageGeneration.js +121 -0
  26. package/lib/actions/images.js +1 -1
  27. package/lib/actions/index.d.ts +5 -0
  28. package/lib/actions/index.js +6 -1
  29. package/lib/actions/ios.js +1 -1
  30. package/lib/actions/locations.js +1 -1
  31. package/lib/actions/messages.js +1 -1
  32. package/lib/actions/notifications.js +1 -1
  33. package/lib/actions/payments.js +27 -26
  34. package/lib/actions/personas.d.ts +4 -4
  35. package/lib/actions/personas.js +1 -1
  36. package/lib/actions/posts.js +1 -1
  37. package/lib/actions/query.js +1 -1
  38. package/lib/actions/reactions.d.ts +6 -6
  39. package/lib/actions/reactions.js +1 -1
  40. package/lib/actions/rum.js +1 -1
  41. package/lib/actions/s3.d.ts +4 -4
  42. package/lib/actions/s3.js +22 -6
  43. package/lib/actions/search.js +1 -1
  44. package/lib/actions/sms.js +1 -1
  45. package/lib/actions/statistics.js +1 -1
  46. package/lib/actions/subscriptions.js +1 -1
  47. package/lib/actions/tags.d.ts +2 -2
  48. package/lib/actions/tags.js +1 -1
  49. package/lib/actions/users.d.ts +2 -2
  50. package/lib/actions/users.js +1 -1
  51. package/lib/actions/videoGeneration.d.ts +20 -0
  52. package/lib/actions/videoGeneration.js +32 -0
  53. package/lib/actions/videos.js +1 -1
  54. package/lib/adapters/arangoAdapter.js +1 -1
  55. package/lib/adapters/contentAdapter.js +1 -1
  56. package/lib/adapters/fileAdapter.js +1 -1
  57. package/lib/adapters/geminiGenerationAdapter.d.ts +34 -0
  58. package/lib/adapters/geminiGenerationAdapter.js +41 -0
  59. package/lib/adapters/higgsfieldAdapter.d.ts +120 -0
  60. package/lib/adapters/higgsfieldAdapter.js +131 -0
  61. package/lib/adapters/imageAdapter.js +1 -1
  62. package/lib/adapters/imageGenerationAdapter.d.ts +17 -0
  63. package/lib/adapters/imageGenerationAdapter.js +18 -0
  64. package/lib/adapters/index.d.ts +3 -0
  65. package/lib/adapters/index.js +4 -1
  66. package/lib/adapters/messageAdapter.js +1 -1
  67. package/lib/adapters/postAdapter.js +1 -1
  68. package/lib/adapters/reaktorAdapter.js +1 -1
  69. package/lib/adapters/tagAdapter.js +1 -1
  70. package/lib/adapters/userAdapter.d.ts +76 -1
  71. package/lib/adapters/userAdapter.js +1 -1
  72. package/lib/config.d.ts +19 -14
  73. package/lib/config.js +9 -1
  74. package/lib/constants/collections.js +1 -1
  75. package/lib/handlers/graphqlHandler.js +1 -1
  76. package/lib/index.d.ts +1 -1
  77. package/lib/index.js +2 -2
  78. package/lib/lambdas/actions/websockets.d.ts +5 -0
  79. package/lib/lambdas/actions/websockets.js +16 -1
  80. package/lib/lambdas/authorizer.js +1 -1
  81. package/lib/lambdas/connection.d.ts +2 -2
  82. package/lib/lambdas/connection.js +1 -1
  83. package/lib/lambdas/utils/message.js +1 -1
  84. package/lib/lambdas/utils/websocket.d.ts +4 -4
  85. package/lib/lambdas/utils/websocket.js +1 -1
  86. package/lib/mocks/conversation.js +1 -1
  87. package/lib/mocks/file.js +1 -1
  88. package/lib/mocks/group.js +1 -1
  89. package/lib/mocks/image.js +1 -1
  90. package/lib/mocks/post.js +1 -1
  91. package/lib/mocks/tag.js +1 -1
  92. package/lib/mocks/user.js +1 -1
  93. package/lib/mocks/video.js +1 -1
  94. package/lib/mutations/analytics/analytics.js +1 -1
  95. package/lib/mutations/content/content.js +15 -1
  96. package/lib/mutations/crm/crm.js +1 -1
  97. package/lib/mutations/events/events.js +1 -1
  98. package/lib/mutations/flags/flags.js +1 -1
  99. package/lib/mutations/groups/groups.js +1 -1
  100. package/lib/mutations/higgsfield/higgsfield.d.ts +1 -0
  101. package/lib/mutations/higgsfield/higgsfield.js +62 -0
  102. package/lib/mutations/images/images.js +10 -1
  103. package/lib/mutations/index.d.ts +2 -1
  104. package/lib/mutations/index.js +11 -2
  105. package/lib/mutations/locations/locations.js +1 -1
  106. package/lib/mutations/messages/messages.js +1 -1
  107. package/lib/mutations/personas/personas.js +1 -1
  108. package/lib/mutations/posts/posts.js +1 -1
  109. package/lib/mutations/reactions/reactions.js +1 -1
  110. package/lib/mutations/rum/rum.js +1 -1
  111. package/lib/mutations/statistics/statistics.js +1 -1
  112. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  113. package/lib/mutations/tags/tags.js +1 -1
  114. package/lib/mutations/users/users.js +1 -1
  115. package/lib/mutations/videos/videos.js +24 -10
  116. package/lib/objectTypes/analytics.js +1 -1
  117. package/lib/objectTypes/app.js +1 -1
  118. package/lib/objectTypes/bankAccount.js +1 -1
  119. package/lib/objectTypes/connection.js +1 -1
  120. package/lib/objectTypes/content.js +1 -1
  121. package/lib/objectTypes/contentGeneration.d.ts +2 -0
  122. package/lib/objectTypes/contentGeneration.js +30 -0
  123. package/lib/objectTypes/conversation.js +1 -1
  124. package/lib/objectTypes/creditCard.js +1 -1
  125. package/lib/objectTypes/crm.js +1 -1
  126. package/lib/objectTypes/document.js +1 -1
  127. package/lib/objectTypes/error.js +1 -1
  128. package/lib/objectTypes/event.js +1 -1
  129. package/lib/objectTypes/external.js +1 -1
  130. package/lib/objectTypes/file.js +1 -1
  131. package/lib/objectTypes/filter.js +1 -1
  132. package/lib/objectTypes/flag.js +1 -1
  133. package/lib/objectTypes/group.js +1 -1
  134. package/lib/objectTypes/higgsfield.d.ts +5 -0
  135. package/lib/objectTypes/higgsfield.js +149 -0
  136. package/lib/objectTypes/iapSubscription.js +1 -1
  137. package/lib/objectTypes/image.js +1 -1
  138. package/lib/objectTypes/imageGeneration.d.ts +2 -0
  139. package/lib/objectTypes/imageGeneration.js +33 -0
  140. package/lib/objectTypes/index.d.ts +2 -0
  141. package/lib/objectTypes/index.js +3 -1
  142. package/lib/objectTypes/location.js +1 -1
  143. package/lib/objectTypes/message.js +1 -1
  144. package/lib/objectTypes/passcode.js +1 -1
  145. package/lib/objectTypes/persona.d.ts +37 -2
  146. package/lib/objectTypes/persona.js +1 -1
  147. package/lib/objectTypes/plan.js +1 -1
  148. package/lib/objectTypes/post.js +1 -1
  149. package/lib/objectTypes/query.js +1 -1
  150. package/lib/objectTypes/reaction.js +1 -1
  151. package/lib/objectTypes/relation.js +1 -1
  152. package/lib/objectTypes/rum.js +1 -1
  153. package/lib/objectTypes/search.js +1 -1
  154. package/lib/objectTypes/statistics.js +1 -1
  155. package/lib/objectTypes/subscription.js +1 -1
  156. package/lib/objectTypes/tag.js +1 -1
  157. package/lib/objectTypes/user.js +1 -1
  158. package/lib/objectTypes/video.js +1 -1
  159. package/lib/objectTypes/videoGeneration.d.ts +2 -0
  160. package/lib/objectTypes/videoGeneration.js +31 -0
  161. package/lib/queries/analytics/analytics.js +1 -1
  162. package/lib/queries/content/content.js +1 -1
  163. package/lib/queries/crm/crm.js +1 -1
  164. package/lib/queries/events/events.js +1 -1
  165. package/lib/queries/flags/flags.js +1 -1
  166. package/lib/queries/groups/groups.js +1 -1
  167. package/lib/queries/higgsfield/higgsfield.d.ts +1 -0
  168. package/lib/queries/higgsfield/higgsfield.js +22 -0
  169. package/lib/queries/images/images.js +1 -1
  170. package/lib/queries/index.d.ts +2 -1
  171. package/lib/queries/index.js +7 -2
  172. package/lib/queries/locations/locations.js +1 -1
  173. package/lib/queries/messages/messages.js +1 -1
  174. package/lib/queries/personas/personas.js +1 -1
  175. package/lib/queries/posts/posts.js +1 -1
  176. package/lib/queries/query/query.js +1 -1
  177. package/lib/queries/reactions/reactions.js +1 -1
  178. package/lib/queries/statistics/statistics.js +1 -1
  179. package/lib/queries/subscriptions/subscriptions.js +1 -1
  180. package/lib/queries/tags/tags.js +1 -1
  181. package/lib/queries/users/users.js +1 -1
  182. package/lib/queries/videos/videos.js +1 -1
  183. package/lib/templates/email/layout.js +1 -1
  184. package/lib/templates/email/passwordForgot.js +1 -1
  185. package/lib/templates/email/passwordRecovery.js +1 -1
  186. package/lib/templates/email/verifyEmail.js +1 -1
  187. package/lib/templates/email/welcome.js +1 -1
  188. package/lib/templates/sms/passwordForgot.js +1 -1
  189. package/lib/templates/sms/passwordRecovery.js +1 -1
  190. package/lib/templates/sms/verifyEmail.js +1 -1
  191. package/lib/templates/sms/verifyPhone.js +1 -1
  192. package/lib/templates/sms/welcome.js +1 -1
  193. package/lib/types/analytics.types.d.ts +16 -16
  194. package/lib/types/analytics.types.js +1 -1
  195. package/lib/types/apps.types.d.ts +4 -4
  196. package/lib/types/apps.types.js +1 -1
  197. package/lib/types/arangodb.types.d.ts +20 -20
  198. package/lib/types/arangodb.types.js +1 -1
  199. package/lib/types/auth.types.js +1 -1
  200. package/lib/types/connections.types.d.ts +2 -2
  201. package/lib/types/connections.types.js +1 -1
  202. package/lib/types/content.types.d.ts +6 -6
  203. package/lib/types/content.types.js +1 -1
  204. package/lib/types/conversations.types.d.ts +2 -2
  205. package/lib/types/conversations.types.js +1 -1
  206. package/lib/types/crm.types.d.ts +30 -30
  207. package/lib/types/crm.types.js +1 -1
  208. package/lib/types/email.types.d.ts +2 -2
  209. package/lib/types/email.types.js +1 -1
  210. package/lib/types/error.types.d.ts +1 -0
  211. package/lib/types/error.types.js +2 -1
  212. package/lib/types/files.types.d.ts +2 -2
  213. package/lib/types/files.types.js +1 -1
  214. package/lib/types/flags.types.d.ts +8 -8
  215. package/lib/types/flags.types.js +1 -1
  216. package/lib/types/google.types.js +1 -1
  217. package/lib/types/groups.types.d.ts +2 -2
  218. package/lib/types/groups.types.js +1 -1
  219. package/lib/types/images.types.d.ts +2 -2
  220. package/lib/types/images.types.js +1 -1
  221. package/lib/types/index.js +1 -1
  222. package/lib/types/locations.types.d.ts +2 -2
  223. package/lib/types/locations.types.js +1 -1
  224. package/lib/types/messages.types.d.ts +2 -2
  225. package/lib/types/messages.types.js +1 -1
  226. package/lib/types/notifications.types.js +1 -1
  227. package/lib/types/payments.types.d.ts +14 -14
  228. package/lib/types/payments.types.js +1 -1
  229. package/lib/types/personas.types.d.ts +2 -2
  230. package/lib/types/personas.types.js +1 -1
  231. package/lib/types/posts.types.d.ts +2 -2
  232. package/lib/types/posts.types.js +1 -1
  233. package/lib/types/rum.types.d.ts +6 -6
  234. package/lib/types/rum.types.js +1 -1
  235. package/lib/types/statistics.types.js +1 -1
  236. package/lib/types/tags.types.d.ts +4 -4
  237. package/lib/types/tags.types.js +1 -1
  238. package/lib/types/users.types.d.ts +2 -2
  239. package/lib/types/users.types.js +1 -1
  240. package/lib/types/videos.types.d.ts +2 -2
  241. package/lib/types/videos.types.js +1 -1
  242. package/lib/types/websockets.types.d.ts +4 -4
  243. package/lib/types/websockets.types.js +1 -1
  244. package/lib/upload.js +1 -1
  245. package/lib/utils/adapterUtils.js +1 -1
  246. package/lib/utils/analyticsUtils.js +1 -1
  247. package/lib/utils/appContext.js +1 -1
  248. package/lib/utils/aqlHelpers.js +1 -1
  249. package/lib/utils/arangodbUtils.js +1 -1
  250. package/lib/utils/authUtils.js +1 -1
  251. package/lib/utils/awsUtils.js +1 -1
  252. package/lib/utils/collectionRegistry.d.ts +2 -2
  253. package/lib/utils/collectionRegistry.js +1 -1
  254. package/lib/utils/contextUtils.js +1 -1
  255. package/lib/utils/dbI18n.example.js +1 -1
  256. package/lib/utils/dbI18n.js +1 -1
  257. package/lib/utils/googleTranslate.js +1 -1
  258. package/lib/utils/graphqlUtils.js +1 -1
  259. package/lib/utils/imageUtils.js +1 -1
  260. package/lib/utils/index.d.ts +3 -0
  261. package/lib/utils/index.js +4 -1
  262. package/lib/utils/languageDetection.js +1 -1
  263. package/lib/utils/localeUtils.example.js +1 -1
  264. package/lib/utils/localeUtils.js +1 -1
  265. package/lib/utils/mediaAccess.d.ts +5 -0
  266. package/lib/utils/mediaAccess.js +57 -0
  267. package/lib/utils/middlewareUtils.js +1 -1
  268. package/lib/utils/nodeRealtime.d.ts +14 -0
  269. package/lib/utils/nodeRealtime.js +84 -0
  270. package/lib/utils/opaqueToken.d.ts +4 -0
  271. package/lib/utils/opaqueToken.js +7 -0
  272. package/lib/utils/queryBuilder.js +1 -1
  273. package/lib/utils/schemaUtils.js +1 -1
  274. package/lib/utils/sessionUtils.js +1 -1
  275. package/lib/utils/stripeUtils.d.ts +1 -1
  276. package/lib/utils/stripeUtils.js +2 -3
  277. package/lib/utils/stripeUtils.ts.bak +12 -0
  278. package/lib/utils/templateUtils.js +1 -1
  279. package/lib/utils/testUtils.js +1 -1
  280. package/lib/utils/translationQueue.example.js +1 -1
  281. package/lib/utils/translationQueue.js +1 -1
  282. package/lib/videoProcessing.js +1 -1
  283. package/package.json +24 -23
  284. package/lib/durableChat/conversations.d.ts +0 -62
  285. package/lib/durableChat/conversations.js +0 -729
  286. package/lib/durableChat/errors.d.ts +0 -6
  287. package/lib/durableChat/errors.js +0 -11
  288. package/lib/durableChat/events.d.ts +0 -22
  289. package/lib/durableChat/events.js +0 -50
  290. package/lib/durableChat/index.d.ts +0 -8
  291. package/lib/durableChat/index.js +0 -10
  292. package/lib/durableChat/membership.d.ts +0 -24
  293. package/lib/durableChat/membership.js +0 -85
  294. package/lib/durableChat/messageTypes.d.ts +0 -76
  295. package/lib/durableChat/messageTypes.js +0 -3
  296. package/lib/durableChat/messages.d.ts +0 -16
  297. package/lib/durableChat/messages.js +0 -257
  298. package/lib/durableChat/transaction.d.ts +0 -10
  299. package/lib/durableChat/transaction.js +0 -53
  300. package/lib/durableChat/types.d.ts +0 -81
  301. package/lib/durableChat/types.js +0 -3
@@ -1,257 +0,0 @@
1
- /* eslint-disable no-await-in-loop, no-underscore-dangle -- Ordered checks and Arango document identities. */ import { createHash, randomUUID } from 'node:crypto';
2
- import { ChatError } from './errors.js';
3
- import { isChatIdentifier } from './membership.js';
4
- const defaultHash = (value)=>createHash('sha256').update(JSON.stringify(value)).digest('hex');
5
- const validText = (content)=>typeof content === 'string' && Array.from(content).length <= 4000 && !/[\u0000\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(content);
6
- const requireValid = (valid)=>{
7
- if (!valid) {
8
- throw new ChatError('invalid_request');
9
- }
10
- };
11
- export const readDurableMessage = async (read, conversationId, messageId)=>{
12
- const message = await read('RETURN DOCUMENT("messages", @messageId)', {
13
- messageId
14
- });
15
- if (!message || message.conversationId !== conversationId || message.chatSchemaVersion !== 1) {
16
- throw new ChatError('forbidden');
17
- }
18
- return message;
19
- };
20
- export const createDurableMessagePersistence = (hooks)=>{
21
- const hash = hooks.hash || defaultHash;
22
- const now = hooks.now || Date.now;
23
- const uuid = hooks.uuid || randomUUID;
24
- const authorize = async (read, conversationId, purpose = 'history')=>{
25
- const membership = await hooks.authorizeMembership(read, hooks.identity, conversationId, purpose);
26
- const legacy = await read(`RETURN FIRST(FOR message IN messages
27
- FILTER message.conversationId == @conversationId
28
- AND (message.chatSchemaVersion != 1 OR !IS_NUMBER(message.sequence) OR message.sequence < 1)
29
- LIMIT 1 RETURN true)`, {
30
- conversationId
31
- });
32
- if (legacy === true) {
33
- throw new ChatError('conflict');
34
- }
35
- return membership;
36
- };
37
- const receipt = async (read, action, conversationId, key, payload)=>{
38
- const requestId = hash([
39
- action,
40
- conversationId,
41
- hooks.identity.personaId,
42
- key
43
- ]);
44
- const payloadHash = hash(payload);
45
- const record = await read('RETURN DOCUMENT("chatMessageRequests", @key)', {
46
- key: requestId
47
- });
48
- if (record && (record.payloadHash !== payloadHash || record.userId !== hooks.identity.userId)) {
49
- throw new ChatError('conflict');
50
- }
51
- return {
52
- prior: record?.result,
53
- save: (result)=>read('INSERT @record IN chatMessageRequests RETURN true', {
54
- record: {
55
- _key: requestId,
56
- added: now(),
57
- conversationId,
58
- payloadHash,
59
- personaId: hooks.identity.personaId,
60
- result,
61
- userId: hooks.identity.userId
62
- }
63
- })
64
- };
65
- };
66
- const rateLimit = async (read, action, limit, interval = 60000)=>{
67
- const key = hash([
68
- hooks.identity.userId,
69
- hooks.identity.personaId,
70
- action,
71
- Math.floor(now() / interval)
72
- ]);
73
- const allowed = await read(`LET bucket = DOCUMENT('chatRateLimits', @key)
74
- FILTER bucket == null OR bucket.count < @limit
75
- UPSERT {_key: @key} INSERT {_key: @key, count: 1, personaId: @personaId, userId: @userId}
76
- UPDATE {count: OLD.count + 1, personaId: @personaId, userId: @userId}
77
- IN chatRateLimits RETURN true`, {
78
- key,
79
- limit,
80
- personaId: hooks.identity.personaId,
81
- userId: hooks.identity.userId
82
- });
83
- if (allowed !== true) {
84
- throw new ChatError('rate_limited');
85
- }
86
- };
87
- const run = (operation, write = true)=>hooks.run(async (read)=>{
88
- await hooks.authorizeIdentity(read, hooks.identity);
89
- return operation(read);
90
- }, write);
91
- const sendMessage = (input)=>run(async (read)=>{
92
- requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.clientMessageId) && input.senderPersonaId === hooks.identity.personaId && validText(input.content) && Array.isArray(input.attachmentIds) && input.attachmentIds.length <= 4 && input.attachmentIds.every(isChatIdentifier) && new Set(input.attachmentIds).size === input.attachmentIds.length && (input.content.trim().length > 0 || input.attachmentIds.length > 0) && (input.replyToMessageId === undefined || isChatIdentifier(input.replyToMessageId)));
93
- const request = await receipt(read, 'send', input.conversationId, input.clientMessageId, input);
94
- if (request.prior) {
95
- return request.prior;
96
- }
97
- const membership = await authorize(read, input.conversationId, 'send');
98
- await rateLimit(read, 'send', 60);
99
- const attachments = [];
100
- for (const imageId of input.attachmentIds){
101
- attachments.push(await hooks.authorizeAttachment(read, imageId));
102
- }
103
- if (input.replyToMessageId) {
104
- const quoted = await readDurableMessage(read, input.conversationId, input.replyToMessageId);
105
- await hooks.authorizeMessageVisible(read, hooks.identity, quoted, membership);
106
- if (quoted.deleted || quoted.mobilePlatformDisposition !== 'allowed') {
107
- throw new ChatError('forbidden');
108
- }
109
- }
110
- const timestamp = now();
111
- const sequence = await read(`FOR conversation IN conversations FILTER conversation._key == @id
112
- AND conversation.chatSchemaVersion == 1 AND conversation.state == 'active'
113
- AND IS_NUMBER(conversation.lastSequence) AND conversation.lastSequence < 9007199254740991
114
- UPDATE conversation WITH {lastSequence: conversation.lastSequence + 1, modified: @now}
115
- IN conversations RETURN NEW.lastSequence`, {
116
- id: input.conversationId,
117
- now: timestamp
118
- });
119
- if (!Number.isSafeInteger(sequence) || Number(sequence) < 1) {
120
- throw new ChatError('unavailable');
121
- }
122
- const messageId = uuid();
123
- const contentVersion = hash([
124
- messageId,
125
- 1,
126
- input.content
127
- ]);
128
- const projection = await hooks.classifyContent({
129
- content: input.content || ' ',
130
- contentVersion
131
- });
132
- const record = {
133
- _key: messageId,
134
- added: timestamp,
135
- attachmentIds: input.attachmentIds,
136
- attachments,
137
- chatSchemaVersion: 1,
138
- clientMessageId: input.clientMessageId,
139
- content: input.content,
140
- contentRevision: 1,
141
- conversationId: input.conversationId,
142
- deleted: false,
143
- mobileContentVersion: contentVersion,
144
- mobileDecision: projection.decision,
145
- mobilePlatformDisposition: projection.platformDisposition || 'allowed',
146
- modified: timestamp,
147
- replyToMessageId: input.replyToMessageId,
148
- revision: 1,
149
- senderPersonaId: hooks.identity.personaId,
150
- sequence: sequence,
151
- userId: hooks.identity.userId
152
- };
153
- if (await read('INSERT @record IN messages RETURN true', {
154
- record
155
- }) !== true) {
156
- throw new ChatError('unavailable');
157
- }
158
- await hooks.appendEvent(read, {
159
- actorPersonaId: hooks.identity.personaId,
160
- conversationId: input.conversationId,
161
- kind: 'message.changed',
162
- membershipEpoch: membership.epoch,
163
- resourceId: messageId,
164
- revision: 1
165
- });
166
- const result = {
167
- clientMessageId: input.clientMessageId,
168
- messageId,
169
- revision: 1,
170
- sequence: sequence
171
- };
172
- if (await request.save(result) !== true) {
173
- throw new ChatError('unavailable');
174
- }
175
- return result;
176
- });
177
- const mutateMessage = (input, remove)=>run(async (read)=>{
178
- requireValid(Boolean(input) && isChatIdentifier(input.conversationId) && isChatIdentifier(input.messageId) && isChatIdentifier(input.idempotencyKey) && Number.isSafeInteger(input.expectedRevision) && input.expectedRevision >= 1 && (remove || 'content' in input && validText(input.content)));
179
- const request = await receipt(read, remove ? 'delete' : 'edit', input.conversationId, input.idempotencyKey, input);
180
- if (request.prior) {
181
- return request.prior;
182
- }
183
- const membership = await authorize(read, input.conversationId, 'send');
184
- const message = await readDurableMessage(read, input.conversationId, input.messageId);
185
- if (message.senderPersonaId !== hooks.identity.personaId || message.userId !== hooks.identity.userId || message.sequence < membership.joinSequence || message.deleted || message.mobilePlatformDisposition !== 'allowed') {
186
- throw new ChatError('forbidden');
187
- }
188
- if (message.revision !== input.expectedRevision || !remove && now() - message.added > 15 * 60000) {
189
- throw new ChatError('conflict');
190
- }
191
- await rateLimit(read, remove ? 'delete' : 'edit', 60);
192
- const content = !remove && 'content' in input ? input.content : '';
193
- const revision = message.revision + 1;
194
- const contentRevision = message.contentRevision + 1;
195
- const contentVersion = hash([
196
- message._key,
197
- contentRevision,
198
- content
199
- ]);
200
- const projection = await hooks.classifyContent({
201
- content: content || ' ',
202
- contentVersion
203
- });
204
- const updated = await read(`FOR current IN messages
205
- FILTER current._key == @id AND current.revision == @expectedRevision
206
- UPDATE current WITH {content: @content, contentRevision: @contentRevision, deleted: @deleted,
207
- attachmentIds: @attachmentIds, attachments: @attachments, replyToMessageId: @reply,
208
- mobileContentVersion: @contentVersion, mobileDecision: @decision,
209
- mobilePlatformDisposition: @platformDisposition, modified: @now, revision: @revision}
210
- IN messages RETURN true`, {
211
- attachmentIds: remove ? [] : message.attachmentIds,
212
- attachments: remove ? [] : message.attachments,
213
- content,
214
- contentRevision,
215
- contentVersion,
216
- decision: projection.decision,
217
- deleted: remove,
218
- expectedRevision: input.expectedRevision,
219
- id: message._key,
220
- now: now(),
221
- platformDisposition: projection.platformDisposition || 'allowed',
222
- reply: remove ? null : message.replyToMessageId || null,
223
- revision
224
- });
225
- if (updated !== true) {
226
- throw new ChatError('conflict');
227
- }
228
- await hooks.appendEvent(read, {
229
- actorPersonaId: hooks.identity.personaId,
230
- conversationId: input.conversationId,
231
- kind: 'message.changed',
232
- membershipEpoch: membership.epoch,
233
- resourceId: message._key,
234
- revision
235
- });
236
- const result = {
237
- messageId: message._key,
238
- revision,
239
- sequence: message.sequence
240
- };
241
- if (await request.save(result) !== true) {
242
- throw new ChatError('unavailable');
243
- }
244
- return result;
245
- });
246
- return {
247
- authorize,
248
- deleteMessage: (input)=>mutateMessage(input, true),
249
- editMessage: (input)=>mutateMessage(input, false),
250
- rateLimit,
251
- receipt,
252
- run,
253
- sendMessage
254
- };
255
- };
256
-
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2R1cmFibGVDaGF0L21lc3NhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AsIG5vLXVuZGVyc2NvcmUtZGFuZ2xlIC0tIE9yZGVyZWQgY2hlY2tzIGFuZCBBcmFuZ28gZG9jdW1lbnQgaWRlbnRpdGllcy4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcmFuZG9tVVVJRH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuXG5pbXBvcnQge0NoYXRFcnJvcn0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHtpc0NoYXRJZGVudGlmaWVyfSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2hhdFF1ZXJ5fSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuaW1wb3J0IHR5cGUge1xuICBEdXJhYmxlQ2hhdEF0dGFjaG1lbnQsIER1cmFibGVDaGF0TWVzc2FnZSwgRHVyYWJsZURlbGV0ZU1lc3NhZ2VJbnB1dCwgRHVyYWJsZUVkaXRNZXNzYWdlSW5wdXQsXG4gIER1cmFibGVNZXNzYWdlQWNrbm93bGVkZ2VtZW50LCBEdXJhYmxlTWVzc2FnZUhvb2tzLCBEdXJhYmxlTWVzc2FnZU11dGF0aW9uUmVzdWx0LCBEdXJhYmxlU2VuZE1lc3NhZ2VJbnB1dFxufSBmcm9tICcuL21lc3NhZ2VUeXBlcy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRIYXNoID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmRpZ2VzdCgnaGV4Jyk7XG5jb25zdCB2YWxpZFRleHQgPSAoY29udGVudDogdW5rbm93bik6IGNvbnRlbnQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJ1xuICAmJiBBcnJheS5mcm9tKGNvbnRlbnQpLmxlbmd0aCA8PSA0MDAwXG4gICYmICEvW1xcdTAwMDBcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/PCFbXFx1RDgwMC1cXHVEQkZGXSlbXFx1REMwMC1cXHVERkZGXS91LnRlc3QoY29udGVudCk7XG5jb25zdCByZXF1aXJlVmFsaWQgPSAodmFsaWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgaWYoIXZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IENoYXRFcnJvcignaW52YWxpZF9yZXF1ZXN0Jyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZWFkRHVyYWJsZU1lc3NhZ2UgPSBhc3luYyA8VERlY2lzaW9uPihcbiAgcmVhZDogQ2hhdFF1ZXJ5LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxEdXJhYmxlQ2hhdE1lc3NhZ2U8VERlY2lzaW9uPj4gPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVhZDxEdXJhYmxlQ2hhdE1lc3NhZ2U8VERlY2lzaW9uPj4oJ1JFVFVSTiBET0NVTUVOVChcIm1lc3NhZ2VzXCIsIEBtZXNzYWdlSWQpJywge21lc3NhZ2VJZH0pO1xuICBpZighbWVzc2FnZSB8fCBtZXNzYWdlLmNvbnZlcnNhdGlvbklkICE9PSBjb252ZXJzYXRpb25JZCB8fCBtZXNzYWdlLmNoYXRTY2hlbWFWZXJzaW9uICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IENoYXRFcnJvcignZm9yYmlkZGVuJyk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRHVyYWJsZU1lc3NhZ2VQZXJzaXN0ZW5jZSA9IDxURGVjaXNpb24+KGhvb2tzOiBEdXJhYmxlTWVzc2FnZUhvb2tzPFREZWNpc2lvbj4pID0+IHtcbiAgY29uc3QgaGFzaCA9IGhvb2tzLmhhc2ggfHwgZGVmYXVsdEhhc2g7XG4gIGNvbnN0IG5vdyA9IGhvb2tzLm5vdyB8fCBEYXRlLm5vdztcbiAgY29uc3QgdXVpZCA9IGhvb2tzLnV1aWQgfHwgcmFuZG9tVVVJRDtcbiAgY29uc3QgYXV0aG9yaXplID0gYXN5bmMgKHJlYWQ6IENoYXRRdWVyeSwgY29udmVyc2F0aW9uSWQ6IHN0cmluZywgcHVycG9zZTogJ2hpc3RvcnknIHwgJ3NlbmQnID0gJ2hpc3RvcnknKSA9PiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcCA9IGF3YWl0IGhvb2tzLmF1dGhvcml6ZU1lbWJlcnNoaXAocmVhZCwgaG9va3MuaWRlbnRpdHksIGNvbnZlcnNhdGlvbklkLCBwdXJwb3NlKTtcbiAgICBjb25zdCBsZWdhY3kgPSBhd2FpdCByZWFkPGJvb2xlYW4+KGBSRVRVUk4gRklSU1QoRk9SIG1lc3NhZ2UgSU4gbWVzc2FnZXNcbiAgICAgIEZJTFRFUiBtZXNzYWdlLmNvbnZlcnNhdGlvbklkID09IEBjb252ZXJzYXRpb25JZFxuICAgICAgICBBTkQgKG1lc3NhZ2UuY2hhdFNjaGVtYVZlcnNpb24gIT0gMSBPUiAhSVNfTlVNQkVSKG1lc3NhZ2Uuc2VxdWVuY2UpIE9SIG1lc3NhZ2Uuc2VxdWVuY2UgPCAxKVxuICAgICAgTElNSVQgMSBSRVRVUk4gdHJ1ZSlgLCB7Y29udmVyc2F0aW9uSWR9KTtcbiAgICBpZihsZWdhY3kgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2NvbmZsaWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBtZW1iZXJzaGlwO1xuICB9O1xuICBjb25zdCByZWNlaXB0ID0gYXN5bmMgPFQ+KFxuICAgIHJlYWQ6IENoYXRRdWVyeSwgYWN0aW9uOiBzdHJpbmcsIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duXG4gICkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IGhhc2goW2FjdGlvbiwgY29udmVyc2F0aW9uSWQsIGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwga2V5XSk7XG4gICAgY29uc3QgcGF5bG9hZEhhc2ggPSBoYXNoKHBheWxvYWQpO1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHJlYWQ8e3JlYWRvbmx5IHBheWxvYWRIYXNoOiBzdHJpbmc7IHJlYWRvbmx5IHJlc3VsdDogVDsgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmd9PihcbiAgICAgICdSRVRVUk4gRE9DVU1FTlQoXCJjaGF0TWVzc2FnZVJlcXVlc3RzXCIsIEBrZXkpJywge2tleTogcmVxdWVzdElkfSk7XG4gICAgaWYocmVjb3JkICYmIChyZWNvcmQucGF5bG9hZEhhc2ggIT09IHBheWxvYWRIYXNoIHx8IHJlY29yZC51c2VySWQgIT09IGhvb2tzLmlkZW50aXR5LnVzZXJJZCkpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2NvbmZsaWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7cHJpb3I6IHJlY29yZD8ucmVzdWx0LCBzYXZlOiAocmVzdWx0OiBUKSA9PiByZWFkPGJvb2xlYW4+KFxuICAgICAgJ0lOU0VSVCBAcmVjb3JkIElOIGNoYXRNZXNzYWdlUmVxdWVzdHMgUkVUVVJOIHRydWUnLCB7cmVjb3JkOiB7X2tleTogcmVxdWVzdElkLCBhZGRlZDogbm93KCksIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICBwYXlsb2FkSGFzaCwgcGVyc29uYUlkOiBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIHJlc3VsdCwgdXNlcklkOiBob29rcy5pZGVudGl0eS51c2VySWR9fSl9O1xuICB9O1xuICBjb25zdCByYXRlTGltaXQgPSBhc3luYyAocmVhZDogQ2hhdFF1ZXJ5LCBhY3Rpb246IHN0cmluZywgbGltaXQ6IG51bWJlciwgaW50ZXJ2YWwgPSA2MDAwMCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGtleSA9IGhhc2goW2hvb2tzLmlkZW50aXR5LnVzZXJJZCwgaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCBhY3Rpb24sIE1hdGguZmxvb3Iobm93KCkgLyBpbnRlcnZhbCldKTtcbiAgICBjb25zdCBhbGxvd2VkID0gYXdhaXQgcmVhZDxib29sZWFuPihgTEVUIGJ1Y2tldCA9IERPQ1VNRU5UKCdjaGF0UmF0ZUxpbWl0cycsIEBrZXkpXG4gICAgICBGSUxURVIgYnVja2V0ID09IG51bGwgT1IgYnVja2V0LmNvdW50IDwgQGxpbWl0XG4gICAgICBVUFNFUlQge19rZXk6IEBrZXl9IElOU0VSVCB7X2tleTogQGtleSwgY291bnQ6IDEsIHBlcnNvbmFJZDogQHBlcnNvbmFJZCwgdXNlcklkOiBAdXNlcklkfVxuICAgICAgVVBEQVRFIHtjb3VudDogT0xELmNvdW50ICsgMSwgcGVyc29uYUlkOiBAcGVyc29uYUlkLCB1c2VySWQ6IEB1c2VySWR9XG4gICAgICBJTiBjaGF0UmF0ZUxpbWl0cyBSRVRVUk4gdHJ1ZWAsIHtrZXksIGxpbWl0LCBwZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCwgdXNlcklkOiBob29rcy5pZGVudGl0eS51c2VySWR9KTtcbiAgICBpZihhbGxvd2VkICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdyYXRlX2xpbWl0ZWQnKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJ1biA9IDxUPihvcGVyYXRpb246IChyZWFkOiBDaGF0UXVlcnkpID0+IFByb21pc2U8VD4sIHdyaXRlID0gdHJ1ZSk6IFByb21pc2U8VD4gPT4gaG9va3MucnVuKGFzeW5jIChyZWFkKSA9PiB7XG4gICAgYXdhaXQgaG9va3MuYXV0aG9yaXplSWRlbnRpdHkocmVhZCwgaG9va3MuaWRlbnRpdHkpO1xuICAgIHJldHVybiBvcGVyYXRpb24ocmVhZCk7XG4gIH0sIHdyaXRlKTtcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSAoaW5wdXQ6IER1cmFibGVTZW5kTWVzc2FnZUlucHV0KTogUHJvbWlzZTxEdXJhYmxlTWVzc2FnZUFja25vd2xlZGdlbWVudD4gPT4gcnVuKGFzeW5jIChyZWFkKSA9PiB7XG4gICAgcmVxdWlyZVZhbGlkKEJvb2xlYW4oaW5wdXQpICYmIGlzQ2hhdElkZW50aWZpZXIoaW5wdXQuY29udmVyc2F0aW9uSWQpICYmIGlzQ2hhdElkZW50aWZpZXIoaW5wdXQuY2xpZW50TWVzc2FnZUlkKVxuICAgICAgJiYgaW5wdXQuc2VuZGVyUGVyc29uYUlkID09PSBob29rcy5pZGVudGl0eS5wZXJzb25hSWQgJiYgdmFsaWRUZXh0KGlucHV0LmNvbnRlbnQpXG4gICAgICAmJiBBcnJheS5pc0FycmF5KGlucHV0LmF0dGFjaG1lbnRJZHMpICYmIGlucHV0LmF0dGFjaG1lbnRJZHMubGVuZ3RoIDw9IDRcbiAgICAgICYmIGlucHV0LmF0dGFjaG1lbnRJZHMuZXZlcnkoaXNDaGF0SWRlbnRpZmllcikgJiYgbmV3IFNldChpbnB1dC5hdHRhY2htZW50SWRzKS5zaXplID09PSBpbnB1dC5hdHRhY2htZW50SWRzLmxlbmd0aFxuICAgICAgJiYgKGlucHV0LmNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDAgfHwgaW5wdXQuYXR0YWNobWVudElkcy5sZW5ndGggPiAwKVxuICAgICAgJiYgKGlucHV0LnJlcGx5VG9NZXNzYWdlSWQgPT09IHVuZGVmaW5lZCB8fCBpc0NoYXRJZGVudGlmaWVyKGlucHV0LnJlcGx5VG9NZXNzYWdlSWQpKSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHJlY2VpcHQ8RHVyYWJsZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQ+KFxuICAgICAgcmVhZCwgJ3NlbmQnLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgaW5wdXQuY2xpZW50TWVzc2FnZUlkLCBpbnB1dCk7XG4gICAgaWYocmVxdWVzdC5wcmlvcikge1xuICAgICAgcmV0dXJuIHJlcXVlc3QucHJpb3I7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlcnNoaXAgPSBhd2FpdCBhdXRob3JpemUocmVhZCwgaW5wdXQuY29udmVyc2F0aW9uSWQsICdzZW5kJyk7XG4gICAgYXdhaXQgcmF0ZUxpbWl0KHJlYWQsICdzZW5kJywgNjApO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzOiBEdXJhYmxlQ2hhdEF0dGFjaG1lbnRbXSA9IFtdO1xuICAgIGZvcihjb25zdCBpbWFnZUlkIG9mIGlucHV0LmF0dGFjaG1lbnRJZHMpIHtcbiAgICAgIGF0dGFjaG1lbnRzLnB1c2goYXdhaXQgaG9va3MuYXV0aG9yaXplQXR0YWNobWVudChyZWFkLCBpbWFnZUlkKSk7XG4gICAgfVxuICAgIGlmKGlucHV0LnJlcGx5VG9NZXNzYWdlSWQpIHtcbiAgICAgIGNvbnN0IHF1b3RlZCA9IGF3YWl0IHJlYWREdXJhYmxlTWVzc2FnZTxURGVjaXNpb24+KHJlYWQsIGlucHV0LmNvbnZlcnNhdGlvbklkLCBpbnB1dC5yZXBseVRvTWVzc2FnZUlkKTtcbiAgICAgIGF3YWl0IGhvb2tzLmF1dGhvcml6ZU1lc3NhZ2VWaXNpYmxlKHJlYWQsIGhvb2tzLmlkZW50aXR5LCBxdW90ZWQsIG1lbWJlcnNoaXApO1xuICAgICAgaWYocXVvdGVkLmRlbGV0ZWQgfHwgcXVvdGVkLm1vYmlsZVBsYXRmb3JtRGlzcG9zaXRpb24gIT09ICdhbGxvd2VkJykge1xuICAgICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gICAgY29uc3Qgc2VxdWVuY2UgPSBhd2FpdCByZWFkPG51bWJlcj4oYEZPUiBjb252ZXJzYXRpb24gSU4gY29udmVyc2F0aW9ucyBGSUxURVIgY29udmVyc2F0aW9uLl9rZXkgPT0gQGlkXG4gICAgICBBTkQgY29udmVyc2F0aW9uLmNoYXRTY2hlbWFWZXJzaW9uID09IDEgQU5EIGNvbnZlcnNhdGlvbi5zdGF0ZSA9PSAnYWN0aXZlJ1xuICAgICAgQU5EIElTX05VTUJFUihjb252ZXJzYXRpb24ubGFzdFNlcXVlbmNlKSBBTkQgY29udmVyc2F0aW9uLmxhc3RTZXF1ZW5jZSA8IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgIFVQREFURSBjb252ZXJzYXRpb24gV0lUSCB7bGFzdFNlcXVlbmNlOiBjb252ZXJzYXRpb24ubGFzdFNlcXVlbmNlICsgMSwgbW9kaWZpZWQ6IEBub3d9XG4gICAgICBJTiBjb252ZXJzYXRpb25zIFJFVFVSTiBORVcubGFzdFNlcXVlbmNlYCwge2lkOiBpbnB1dC5jb252ZXJzYXRpb25JZCwgbm93OiB0aW1lc3RhbXB9KTtcbiAgICBpZighTnVtYmVyLmlzU2FmZUludGVnZXIoc2VxdWVuY2UpIHx8IE51bWJlcihzZXF1ZW5jZSkgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCd1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlSWQgPSB1dWlkKCk7XG4gICAgY29uc3QgY29udGVudFZlcnNpb24gPSBoYXNoKFttZXNzYWdlSWQsIDEsIGlucHV0LmNvbnRlbnRdKTtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gYXdhaXQgaG9va3MuY2xhc3NpZnlDb250ZW50KHtjb250ZW50OiBpbnB1dC5jb250ZW50IHx8ICcgJywgY29udGVudFZlcnNpb259KTtcbiAgICBjb25zdCByZWNvcmQ6IER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+ID0ge19rZXk6IG1lc3NhZ2VJZCwgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICAgIGF0dGFjaG1lbnRJZHM6IGlucHV0LmF0dGFjaG1lbnRJZHMsIGF0dGFjaG1lbnRzLCBjaGF0U2NoZW1hVmVyc2lvbjogMSwgY2xpZW50TWVzc2FnZUlkOiBpbnB1dC5jbGllbnRNZXNzYWdlSWQsXG4gICAgICBjb250ZW50OiBpbnB1dC5jb250ZW50LCBjb250ZW50UmV2aXNpb246IDEsIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCwgZGVsZXRlZDogZmFsc2UsXG4gICAgICBtb2JpbGVDb250ZW50VmVyc2lvbjogY29udGVudFZlcnNpb24sIG1vYmlsZURlY2lzaW9uOiBwcm9qZWN0aW9uLmRlY2lzaW9uLFxuICAgICAgbW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbjogcHJvamVjdGlvbi5wbGF0Zm9ybURpc3Bvc2l0aW9uIHx8ICdhbGxvd2VkJywgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHJlcGx5VG9NZXNzYWdlSWQ6IGlucHV0LnJlcGx5VG9NZXNzYWdlSWQsIHJldmlzaW9uOiAxLCBzZW5kZXJQZXJzb25hSWQ6IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCxcbiAgICAgIHNlcXVlbmNlOiBzZXF1ZW5jZSEsIHVzZXJJZDogaG9va3MuaWRlbnRpdHkudXNlcklkfTtcbiAgICBpZihhd2FpdCByZWFkPGJvb2xlYW4+KCdJTlNFUlQgQHJlY29yZCBJTiBtZXNzYWdlcyBSRVRVUk4gdHJ1ZScsIHtyZWNvcmR9KSAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcigndW5hdmFpbGFibGUnKTtcbiAgICB9XG4gICAgYXdhaXQgaG9va3MuYXBwZW5kRXZlbnQocmVhZCwge2FjdG9yUGVyc29uYUlkOiBob29rcy5pZGVudGl0eS5wZXJzb25hSWQsIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCxcbiAgICAgIGtpbmQ6ICdtZXNzYWdlLmNoYW5nZWQnLCBtZW1iZXJzaGlwRXBvY2g6IG1lbWJlcnNoaXAuZXBvY2gsIHJlc291cmNlSWQ6IG1lc3NhZ2VJZCwgcmV2aXNpb246IDF9KTtcbiAgICBjb25zdCByZXN1bHQgPSB7Y2xpZW50TWVzc2FnZUlkOiBpbnB1dC5jbGllbnRNZXNzYWdlSWQsIG1lc3NhZ2VJZCwgcmV2aXNpb246IDEsIHNlcXVlbmNlOiBzZXF1ZW5jZSF9O1xuICAgIGlmKGF3YWl0IHJlcXVlc3Quc2F2ZShyZXN1bHQpICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCd1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbiAgY29uc3QgbXV0YXRlTWVzc2FnZSA9IChcbiAgICBpbnB1dDogRHVyYWJsZUVkaXRNZXNzYWdlSW5wdXQgfCBEdXJhYmxlRGVsZXRlTWVzc2FnZUlucHV0LCByZW1vdmU6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxEdXJhYmxlTWVzc2FnZU11dGF0aW9uUmVzdWx0PiA9PiBydW4oYXN5bmMgKHJlYWQpID0+IHtcbiAgICByZXF1aXJlVmFsaWQoQm9vbGVhbihpbnB1dCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5jb252ZXJzYXRpb25JZCkgJiYgaXNDaGF0SWRlbnRpZmllcihpbnB1dC5tZXNzYWdlSWQpXG4gICAgICAmJiBpc0NoYXRJZGVudGlmaWVyKGlucHV0LmlkZW1wb3RlbmN5S2V5KSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnB1dC5leHBlY3RlZFJldmlzaW9uKVxuICAgICAgJiYgaW5wdXQuZXhwZWN0ZWRSZXZpc2lvbiA+PSAxICYmIChyZW1vdmUgfHwgKCdjb250ZW50JyBpbiBpbnB1dCAmJiB2YWxpZFRleHQoaW5wdXQuY29udGVudCkpKSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHJlY2VpcHQ8RHVyYWJsZU1lc3NhZ2VNdXRhdGlvblJlc3VsdD4ocmVhZCwgcmVtb3ZlID8gJ2RlbGV0ZScgOiAnZWRpdCcsXG4gICAgICBpbnB1dC5jb252ZXJzYXRpb25JZCwgaW5wdXQuaWRlbXBvdGVuY3lLZXksIGlucHV0KTtcbiAgICBpZihyZXF1ZXN0LnByaW9yKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdC5wcmlvcjtcbiAgICB9XG4gICAgY29uc3QgbWVtYmVyc2hpcCA9IGF3YWl0IGF1dGhvcml6ZShyZWFkLCBpbnB1dC5jb252ZXJzYXRpb25JZCwgJ3NlbmQnKTtcbiAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVhZER1cmFibGVNZXNzYWdlPFREZWNpc2lvbj4ocmVhZCwgaW5wdXQuY29udmVyc2F0aW9uSWQsIGlucHV0Lm1lc3NhZ2VJZCk7XG4gICAgaWYobWVzc2FnZS5zZW5kZXJQZXJzb25hSWQgIT09IGhvb2tzLmlkZW50aXR5LnBlcnNvbmFJZCB8fCBtZXNzYWdlLnVzZXJJZCAhPT0gaG9va3MuaWRlbnRpdHkudXNlcklkXG4gICAgICB8fCBtZXNzYWdlLnNlcXVlbmNlIDwgbWVtYmVyc2hpcC5qb2luU2VxdWVuY2UgfHwgbWVzc2FnZS5kZWxldGVkIHx8IG1lc3NhZ2UubW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbiAhPT0gJ2FsbG93ZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgICB9XG4gICAgaWYobWVzc2FnZS5yZXZpc2lvbiAhPT0gaW5wdXQuZXhwZWN0ZWRSZXZpc2lvbiB8fCAoIXJlbW92ZSAmJiBub3coKSAtIG1lc3NhZ2UuYWRkZWQgPiAxNSAqIDYwMDAwKSkge1xuICAgICAgdGhyb3cgbmV3IENoYXRFcnJvcignY29uZmxpY3QnKTtcbiAgICB9XG4gICAgYXdhaXQgcmF0ZUxpbWl0KHJlYWQsIHJlbW92ZSA/ICdkZWxldGUnIDogJ2VkaXQnLCA2MCk7XG4gICAgY29uc3QgY29udGVudCA9ICFyZW1vdmUgJiYgJ2NvbnRlbnQnIGluIGlucHV0ID8gaW5wdXQuY29udGVudCA6ICcnO1xuICAgIGNvbnN0IHJldmlzaW9uID0gbWVzc2FnZS5yZXZpc2lvbiArIDE7XG4gICAgY29uc3QgY29udGVudFJldmlzaW9uID0gbWVzc2FnZS5jb250ZW50UmV2aXNpb24gKyAxO1xuICAgIGNvbnN0IGNvbnRlbnRWZXJzaW9uID0gaGFzaChbbWVzc2FnZS5fa2V5LCBjb250ZW50UmV2aXNpb24sIGNvbnRlbnRdKTtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gYXdhaXQgaG9va3MuY2xhc3NpZnlDb250ZW50KHtjb250ZW50OiBjb250ZW50IHx8ICcgJywgY29udGVudFZlcnNpb259KTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgcmVhZDxib29sZWFuPihgRk9SIGN1cnJlbnQgSU4gbWVzc2FnZXNcbiAgICAgIEZJTFRFUiBjdXJyZW50Ll9rZXkgPT0gQGlkIEFORCBjdXJyZW50LnJldmlzaW9uID09IEBleHBlY3RlZFJldmlzaW9uXG4gICAgICBVUERBVEUgY3VycmVudCBXSVRIIHtjb250ZW50OiBAY29udGVudCwgY29udGVudFJldmlzaW9uOiBAY29udGVudFJldmlzaW9uLCBkZWxldGVkOiBAZGVsZXRlZCxcbiAgICAgICAgYXR0YWNobWVudElkczogQGF0dGFjaG1lbnRJZHMsIGF0dGFjaG1lbnRzOiBAYXR0YWNobWVudHMsIHJlcGx5VG9NZXNzYWdlSWQ6IEByZXBseSxcbiAgICAgICAgbW9iaWxlQ29udGVudFZlcnNpb246IEBjb250ZW50VmVyc2lvbiwgbW9iaWxlRGVjaXNpb246IEBkZWNpc2lvbixcbiAgICAgICAgbW9iaWxlUGxhdGZvcm1EaXNwb3NpdGlvbjogQHBsYXRmb3JtRGlzcG9zaXRpb24sIG1vZGlmaWVkOiBAbm93LCByZXZpc2lvbjogQHJldmlzaW9ufVxuICAgICAgSU4gbWVzc2FnZXMgUkVUVVJOIHRydWVgLCB7YXR0YWNobWVudElkczogcmVtb3ZlID8gW10gOiBtZXNzYWdlLmF0dGFjaG1lbnRJZHMsXG4gICAgICBhdHRhY2htZW50czogcmVtb3ZlID8gW10gOiBtZXNzYWdlLmF0dGFjaG1lbnRzLCBjb250ZW50LCBjb250ZW50UmV2aXNpb24sIGNvbnRlbnRWZXJzaW9uLFxuICAgICAgZGVjaXNpb246IHByb2plY3Rpb24uZGVjaXNpb24sIGRlbGV0ZWQ6IHJlbW92ZSwgZXhwZWN0ZWRSZXZpc2lvbjogaW5wdXQuZXhwZWN0ZWRSZXZpc2lvbiwgaWQ6IG1lc3NhZ2UuX2tleSxcbiAgICAgIG5vdzogbm93KCksIHBsYXRmb3JtRGlzcG9zaXRpb246IHByb2plY3Rpb24ucGxhdGZvcm1EaXNwb3NpdGlvbiB8fCAnYWxsb3dlZCcsXG4gICAgICByZXBseTogcmVtb3ZlID8gbnVsbCA6IG1lc3NhZ2UucmVwbHlUb01lc3NhZ2VJZCB8fCBudWxsLCByZXZpc2lvbn0pO1xuICAgIGlmKHVwZGF0ZWQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2NvbmZsaWN0Jyk7XG4gICAgfVxuICAgIGF3YWl0IGhvb2tzLmFwcGVuZEV2ZW50KHJlYWQsIHthY3RvclBlcnNvbmFJZDogaG9va3MuaWRlbnRpdHkucGVyc29uYUlkLCBjb252ZXJzYXRpb25JZDogaW5wdXQuY29udmVyc2F0aW9uSWQsXG4gICAgICBraW5kOiAnbWVzc2FnZS5jaGFuZ2VkJywgbWVtYmVyc2hpcEVwb2NoOiBtZW1iZXJzaGlwLmVwb2NoLCByZXNvdXJjZUlkOiBtZXNzYWdlLl9rZXksIHJldmlzaW9ufSk7XG4gICAgY29uc3QgcmVzdWx0ID0ge21lc3NhZ2VJZDogbWVzc2FnZS5fa2V5LCByZXZpc2lvbiwgc2VxdWVuY2U6IG1lc3NhZ2Uuc2VxdWVuY2V9O1xuICAgIGlmKGF3YWl0IHJlcXVlc3Quc2F2ZShyZXN1bHQpICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCd1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuIHthdXRob3JpemUsIGRlbGV0ZU1lc3NhZ2U6IChpbnB1dDogRHVyYWJsZURlbGV0ZU1lc3NhZ2VJbnB1dCkgPT4gbXV0YXRlTWVzc2FnZShpbnB1dCwgdHJ1ZSksXG4gICAgZWRpdE1lc3NhZ2U6IChpbnB1dDogRHVyYWJsZUVkaXRNZXNzYWdlSW5wdXQpID0+IG11dGF0ZU1lc3NhZ2UoaW5wdXQsIGZhbHNlKSwgcmF0ZUxpbWl0LCByZWNlaXB0LCBydW4sIHNlbmRNZXNzYWdlfTtcbn07XG5cbmV4cG9ydCB0eXBlIER1cmFibGVNZXNzYWdlUGVyc2lzdGVuY2U8VERlY2lzaW9uID0gdW5rbm93bj4gPVxuICBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVEdXJhYmxlTWVzc2FnZVBlcnNpc3RlbmNlPFREZWNpc2lvbj4+O1xuIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJyYW5kb21VVUlEIiwiQ2hhdEVycm9yIiwiaXNDaGF0SWRlbnRpZmllciIsImRlZmF1bHRIYXNoIiwidmFsdWUiLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidmFsaWRUZXh0IiwiY29udGVudCIsIkFycmF5IiwiZnJvbSIsImxlbmd0aCIsInRlc3QiLCJyZXF1aXJlVmFsaWQiLCJ2YWxpZCIsInJlYWREdXJhYmxlTWVzc2FnZSIsInJlYWQiLCJjb252ZXJzYXRpb25JZCIsIm1lc3NhZ2VJZCIsIm1lc3NhZ2UiLCJjaGF0U2NoZW1hVmVyc2lvbiIsImNyZWF0ZUR1cmFibGVNZXNzYWdlUGVyc2lzdGVuY2UiLCJob29rcyIsImhhc2giLCJub3ciLCJEYXRlIiwidXVpZCIsImF1dGhvcml6ZSIsInB1cnBvc2UiLCJtZW1iZXJzaGlwIiwiYXV0aG9yaXplTWVtYmVyc2hpcCIsImlkZW50aXR5IiwibGVnYWN5IiwicmVjZWlwdCIsImFjdGlvbiIsImtleSIsInBheWxvYWQiLCJyZXF1ZXN0SWQiLCJwZXJzb25hSWQiLCJwYXlsb2FkSGFzaCIsInJlY29yZCIsInVzZXJJZCIsInByaW9yIiwicmVzdWx0Iiwic2F2ZSIsIl9rZXkiLCJhZGRlZCIsInJhdGVMaW1pdCIsImxpbWl0IiwiaW50ZXJ2YWwiLCJNYXRoIiwiZmxvb3IiLCJhbGxvd2VkIiwicnVuIiwib3BlcmF0aW9uIiwid3JpdGUiLCJhdXRob3JpemVJZGVudGl0eSIsInNlbmRNZXNzYWdlIiwiaW5wdXQiLCJCb29sZWFuIiwiY2xpZW50TWVzc2FnZUlkIiwic2VuZGVyUGVyc29uYUlkIiwiaXNBcnJheSIsImF0dGFjaG1lbnRJZHMiLCJldmVyeSIsIlNldCIsInNpemUiLCJ0cmltIiwicmVwbHlUb01lc3NhZ2VJZCIsInVuZGVmaW5lZCIsInJlcXVlc3QiLCJhdHRhY2htZW50cyIsImltYWdlSWQiLCJwdXNoIiwiYXV0aG9yaXplQXR0YWNobWVudCIsInF1b3RlZCIsImF1dGhvcml6ZU1lc3NhZ2VWaXNpYmxlIiwiZGVsZXRlZCIsIm1vYmlsZVBsYXRmb3JtRGlzcG9zaXRpb24iLCJ0aW1lc3RhbXAiLCJzZXF1ZW5jZSIsImlkIiwiTnVtYmVyIiwiaXNTYWZlSW50ZWdlciIsImNvbnRlbnRWZXJzaW9uIiwicHJvamVjdGlvbiIsImNsYXNzaWZ5Q29udGVudCIsImNvbnRlbnRSZXZpc2lvbiIsIm1vYmlsZUNvbnRlbnRWZXJzaW9uIiwibW9iaWxlRGVjaXNpb24iLCJkZWNpc2lvbiIsInBsYXRmb3JtRGlzcG9zaXRpb24iLCJtb2RpZmllZCIsInJldmlzaW9uIiwiYXBwZW5kRXZlbnQiLCJhY3RvclBlcnNvbmFJZCIsImtpbmQiLCJtZW1iZXJzaGlwRXBvY2giLCJlcG9jaCIsInJlc291cmNlSWQiLCJtdXRhdGVNZXNzYWdlIiwicmVtb3ZlIiwiaWRlbXBvdGVuY3lLZXkiLCJleHBlY3RlZFJldmlzaW9uIiwiam9pblNlcXVlbmNlIiwidXBkYXRlZCIsInJlcGx5IiwiZGVsZXRlTWVzc2FnZSIsImVkaXRNZXNzYWdlIl0sIm1hcHBpbmdzIjoiQUFBQSwyR0FBMkcsR0FDM0csU0FBUUEsVUFBVSxFQUFFQyxVQUFVLFFBQU8sY0FBYztBQUVuRCxTQUFRQyxTQUFTLFFBQU8sY0FBYztBQUN0QyxTQUFRQyxnQkFBZ0IsUUFBTyxrQkFBa0I7QUFRakQsTUFBTUMsY0FBYyxDQUFDQyxRQUEyQkwsV0FBVyxVQUFVTSxNQUFNLENBQUNDLEtBQUtDLFNBQVMsQ0FBQ0gsUUFBUUksTUFBTSxDQUFDO0FBQzFHLE1BQU1DLFlBQVksQ0FBQ0MsVUFBd0MsT0FBT0EsWUFBWSxZQUN6RUMsTUFBTUMsSUFBSSxDQUFDRixTQUFTRyxNQUFNLElBQUksUUFDOUIsQ0FBQyxnRkFBZ0ZDLElBQUksQ0FBQ0o7QUFDM0YsTUFBTUssZUFBZSxDQUFDQztJQUNwQixJQUFHLENBQUNBLE9BQU87UUFDVCxNQUFNLElBQUlmLFVBQVU7SUFDdEI7QUFDRjtBQUVBLE9BQU8sTUFBTWdCLHFCQUFxQixPQUNoQ0MsTUFBaUJDLGdCQUF3QkM7SUFFekMsTUFBTUMsVUFBVSxNQUFNSCxLQUFvQywyQ0FBMkM7UUFBQ0U7SUFBUztJQUMvRyxJQUFHLENBQUNDLFdBQVdBLFFBQVFGLGNBQWMsS0FBS0Esa0JBQWtCRSxRQUFRQyxpQkFBaUIsS0FBSyxHQUFHO1FBQzNGLE1BQU0sSUFBSXJCLFVBQVU7SUFDdEI7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
@@ -1,10 +0,0 @@
1
- import type { ApiContext } from '../types/auth.types.js';
2
- import type { ChatQuery } from './membership.js';
3
- export interface DurableTransactionCollections {
4
- readonly exclusive?: readonly string[];
5
- readonly read?: readonly string[];
6
- readonly write?: readonly string[];
7
- }
8
- export declare const createDurableQuery: (context: ApiContext) => ChatQuery;
9
- /** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */
10
- export declare const createDurableTransaction: (context: ApiContext, collections: DurableTransactionCollections, query?: ChatQuery) => <T>(operation: (read: ChatQuery) => Promise<T>) => Promise<T>;
@@ -1,53 +0,0 @@
1
- import { useDb } from '../utils/arangodbUtils.js';
2
- export const createDurableQuery = (context)=>{
3
- const db = useDb(context.databaseName);
4
- return async (query, bindVars)=>{
5
- const cursor = await db.query({
6
- bindVars,
7
- query
8
- });
9
- return cursor.next();
10
- };
11
- };
12
- /** Injected queries retain caller-owned transaction lifecycle; never fall back to another connection. */ export const createDurableTransaction = (context, collections, query)=>{
13
- if (query) {
14
- return (operation)=>operation(query);
15
- }
16
- const db = useDb(context.databaseName);
17
- return async (operation)=>{
18
- const transaction = await db.beginTransaction({
19
- exclusive: [
20
- ...collections.exclusive || []
21
- ],
22
- read: [
23
- ...collections.read || []
24
- ],
25
- write: [
26
- ...collections.write || []
27
- ]
28
- }, {
29
- allowImplicit: false,
30
- lockTimeout: 5,
31
- waitForSync: true
32
- });
33
- const read = async (query, bindVars)=>{
34
- const cursor = await transaction.step(()=>db.query({
35
- bindVars,
36
- query
37
- }));
38
- return cursor.next();
39
- };
40
- try {
41
- const result = await operation(read);
42
- await transaction.commit();
43
- return result;
44
- } catch (error) {
45
- try {
46
- await transaction.abort();
47
- } catch {}
48
- throw error;
49
- }
50
- };
51
- };
52
-
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2R1cmFibGVDaGF0L3RyYW5zYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhdFF1ZXJ5fSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIER1cmFibGVUcmFuc2FjdGlvbkNvbGxlY3Rpb25zIHtcbiAgcmVhZG9ubHkgZXhjbHVzaXZlPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IHJlYWQ/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgd3JpdGU/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUR1cmFibGVRdWVyeSA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogQ2hhdFF1ZXJ5ID0+IHtcbiAgY29uc3QgZGIgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIHJldHVybiBhc3luYyA8VD4ocXVlcnk6IHN0cmluZywgYmluZFZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgY3Vyc29yID0gYXdhaXQgZGIucXVlcnk8VD4oe2JpbmRWYXJzLCBxdWVyeX0pO1xuICAgIHJldHVybiBjdXJzb3IubmV4dCgpO1xuICB9O1xufTtcblxuLyoqIEluamVjdGVkIHF1ZXJpZXMgcmV0YWluIGNhbGxlci1vd25lZCB0cmFuc2FjdGlvbiBsaWZlY3ljbGU7IG5ldmVyIGZhbGwgYmFjayB0byBhbm90aGVyIGNvbm5lY3Rpb24uICovXG5leHBvcnQgY29uc3QgY3JlYXRlRHVyYWJsZVRyYW5zYWN0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LCBjb2xsZWN0aW9uczogRHVyYWJsZVRyYW5zYWN0aW9uQ29sbGVjdGlvbnMsIHF1ZXJ5PzogQ2hhdFF1ZXJ5XG4pID0+IHtcbiAgaWYocXVlcnkpIHtcbiAgICByZXR1cm4gPFQ+KG9wZXJhdGlvbjogKHJlYWQ6IENoYXRRdWVyeSkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4gPT4gb3BlcmF0aW9uKHF1ZXJ5KTtcbiAgfVxuICBjb25zdCBkYiA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIGFzeW5jIDxUPihvcGVyYXRpb246IChyZWFkOiBDaGF0UXVlcnkpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IGRiLmJlZ2luVHJhbnNhY3Rpb24oe1xuICAgICAgZXhjbHVzaXZlOiBbLi4uKGNvbGxlY3Rpb25zLmV4Y2x1c2l2ZSB8fCBbXSldLCByZWFkOiBbLi4uKGNvbGxlY3Rpb25zLnJlYWQgfHwgW10pXSxcbiAgICAgIHdyaXRlOiBbLi4uKGNvbGxlY3Rpb25zLndyaXRlIHx8IFtdKV1cbiAgICB9LCB7YWxsb3dJbXBsaWNpdDogZmFsc2UsIGxvY2tUaW1lb3V0OiA1LCB3YWl0Rm9yU3luYzogdHJ1ZX0pO1xuICAgIGNvbnN0IHJlYWQ6IENoYXRRdWVyeSA9IGFzeW5jIDxSPihxdWVyeTogc3RyaW5nLCBiaW5kVmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNvbnN0IGN1cnNvciA9IGF3YWl0IHRyYW5zYWN0aW9uLnN0ZXAoKCkgPT4gZGIucXVlcnk8Uj4oe2JpbmRWYXJzLCBxdWVyeX0pKTtcbiAgICAgIHJldHVybiBjdXJzb3IubmV4dCgpO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbihyZWFkKTtcbiAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLmNvbW1pdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5hYm9ydCgpO1xuICAgICAgfSBjYXRjaHsgLyogUHJlc2VydmUgb3JpZ2luYWwvYW1iaWd1b3VzIGNvbW1pdCBlcnJvcjsgbmV2ZXIgcmV0cnkgbXV0YXRpb25zLiAqLyB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbInVzZURiIiwiY3JlYXRlRHVyYWJsZVF1ZXJ5IiwiY29udGV4dCIsImRiIiwiZGF0YWJhc2VOYW1lIiwicXVlcnkiLCJiaW5kVmFycyIsImN1cnNvciIsIm5leHQiLCJjcmVhdGVEdXJhYmxlVHJhbnNhY3Rpb24iLCJjb2xsZWN0aW9ucyIsIm9wZXJhdGlvbiIsInRyYW5zYWN0aW9uIiwiYmVnaW5UcmFuc2FjdGlvbiIsImV4Y2x1c2l2ZSIsInJlYWQiLCJ3cml0ZSIsImFsbG93SW1wbGljaXQiLCJsb2NrVGltZW91dCIsIndhaXRGb3JTeW5jIiwic3RlcCIsInJlc3VsdCIsImNvbW1pdCIsImVycm9yIiwiYWJvcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLEtBQUssUUFBTyw0QkFBNEI7QUFXaEQsT0FBTyxNQUFNQyxxQkFBcUIsQ0FBQ0M7SUFDakMsTUFBTUMsS0FBS0gsTUFBTUUsUUFBUUUsWUFBWTtJQUNyQyxPQUFPLE9BQVVDLE9BQWVDO1FBQzlCLE1BQU1DLFNBQVMsTUFBTUosR0FBR0UsS0FBSyxDQUFJO1lBQUNDO1lBQVVEO1FBQUs7UUFDakQsT0FBT0UsT0FBT0MsSUFBSTtJQUNwQjtBQUNGLEVBQUU7QUFFRix1R0FBdUcsR0FDdkcsT0FBTyxNQUFNQywyQkFBMkIsQ0FDdENQLFNBQXFCUSxhQUE0Q0w7SUFFakUsSUFBR0EsT0FBTztRQUNSLE9BQU8sQ0FBSU0sWUFBMkRBLFVBQVVOO0lBQ2xGO0lBQ0EsTUFBTUYsS0FBS0gsTUFBTUUsUUFBUUUsWUFBWTtJQUNyQyxPQUFPLE9BQVVPO1FBQ2YsTUFBTUMsY0FBYyxNQUFNVCxHQUFHVSxnQkFBZ0IsQ0FBQztZQUM1Q0MsV0FBVzttQkFBS0osWUFBWUksU0FBUyxJQUFJLEVBQUU7YUFBRTtZQUFFQyxNQUFNO21CQUFLTCxZQUFZSyxJQUFJLElBQUksRUFBRTthQUFFO1lBQ2xGQyxPQUFPO21CQUFLTixZQUFZTSxLQUFLLElBQUksRUFBRTthQUFFO1FBQ3ZDLEdBQUc7WUFBQ0MsZUFBZTtZQUFPQyxhQUFhO1lBQUdDLGFBQWE7UUFBSTtRQUMzRCxNQUFNSixPQUFrQixPQUFVVixPQUFlQztZQUMvQyxNQUFNQyxTQUFTLE1BQU1LLFlBQVlRLElBQUksQ0FBQyxJQUFNakIsR0FBR0UsS0FBSyxDQUFJO29CQUFDQztvQkFBVUQ7Z0JBQUs7WUFDeEUsT0FBT0UsT0FBT0MsSUFBSTtRQUNwQjtRQUNBLElBQUk7WUFDRixNQUFNYSxTQUFTLE1BQU1WLFVBQVVJO1lBQy9CLE1BQU1ILFlBQVlVLE1BQU07WUFDeEIsT0FBT0Q7UUFDVCxFQUFFLE9BQU1FLE9BQU87WUFDYixJQUFJO2dCQUNGLE1BQU1YLFlBQVlZLEtBQUs7WUFDekIsRUFBRSxPQUFLLENBQXlFO1lBQ2hGLE1BQU1EO1FBQ1I7SUFDRjtBQUNGLEVBQUUifQ==
@@ -1,81 +0,0 @@
1
- export type ConversationKind = 'direct' | 'group';
2
- export type ConversationState = 'active' | 'closed' | 'forming';
3
- export type MembershipRole = 'admin' | 'member' | 'owner';
4
- export type MembershipState = 'active' | 'left' | 'removed';
5
- /** An epoch is a grant for a bounded history interval, never a client-selected identity. */
6
- export interface ConversationMembership {
7
- readonly conversationId: string;
8
- readonly epoch: string;
9
- readonly joinSequence: number;
10
- readonly leftSequence?: number;
11
- readonly personaId: string;
12
- readonly revision: number;
13
- readonly role: MembershipRole;
14
- readonly state: MembershipState;
15
- }
16
- /** Names must pass the caller's audience projection before being serialized. */
17
- export interface ConversationSummary {
18
- readonly activeMemberCount: number;
19
- readonly conversationId: string;
20
- readonly kind: ConversationKind;
21
- readonly membership: ConversationMembership;
22
- readonly membershipRevision: number;
23
- readonly name?: string;
24
- readonly state: ConversationState;
25
- }
26
- export interface ConversationInvite {
27
- readonly conversationId: string;
28
- readonly expiresAt: number;
29
- readonly inviteId: string;
30
- readonly invitedByPersonaId: string;
31
- readonly revision: number;
32
- readonly state: 'accepted' | 'declined' | 'expired' | 'pending' | 'revoked';
33
- }
34
- export interface CreateDirectInput {
35
- readonly participantPersonaId: string;
36
- }
37
- export interface CreateGroupInput {
38
- readonly idempotencyKey: string;
39
- readonly memberPersonaIds: readonly string[];
40
- readonly name: string;
41
- }
42
- export interface InviteMemberInput {
43
- readonly conversationId: string;
44
- readonly expectedRevision: number;
45
- readonly idempotencyKey: string;
46
- readonly personaId: string;
47
- }
48
- export interface AcceptInviteInput {
49
- readonly expectedRevision: number;
50
- readonly idempotencyKey: string;
51
- readonly inviteId: string;
52
- }
53
- export type DeclineInviteInput = AcceptInviteInput;
54
- export interface ChangeMemberRoleInput {
55
- readonly conversationId: string;
56
- readonly expectedRevision: number;
57
- readonly idempotencyKey: string;
58
- readonly personaId: string;
59
- readonly role: Exclude<MembershipRole, 'owner'>;
60
- }
61
- export interface RemoveMemberInput {
62
- readonly conversationId: string;
63
- readonly expectedRevision: number;
64
- readonly idempotencyKey: string;
65
- readonly personaId: string;
66
- }
67
- export interface LeaveConversationInput {
68
- readonly conversationId: string;
69
- readonly expectedRevision: number;
70
- readonly idempotencyKey: string;
71
- }
72
- export type TransferOwnershipInput = RemoveMemberInput;
73
- export interface ChatEvent {
74
- readonly conversationId: string;
75
- readonly eventId: string;
76
- readonly eventSequence: number;
77
- readonly kind: 'membership.changed' | 'message.changed' | 'receipt.changed';
78
- readonly resourceId: string;
79
- readonly revision: number;
80
- }
81
- export type { AuthorizedMembership, ChatIdentity, ChatQuery, MembershipAccessInput } from './membership.js';
@@ -1,3 +0,0 @@
1
- export { };
2
-
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2R1cmFibGVDaGF0L3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbktpbmQgPSAnZGlyZWN0JyB8ICdncm91cCc7XG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25TdGF0ZSA9ICdhY3RpdmUnIHwgJ2Nsb3NlZCcgfCAnZm9ybWluZyc7XG5leHBvcnQgdHlwZSBNZW1iZXJzaGlwUm9sZSA9ICdhZG1pbicgfCAnbWVtYmVyJyB8ICdvd25lcic7XG5leHBvcnQgdHlwZSBNZW1iZXJzaGlwU3RhdGUgPSAnYWN0aXZlJyB8ICdsZWZ0JyB8ICdyZW1vdmVkJztcblxuLyoqIEFuIGVwb2NoIGlzIGEgZ3JhbnQgZm9yIGEgYm91bmRlZCBoaXN0b3J5IGludGVydmFsLCBuZXZlciBhIGNsaWVudC1zZWxlY3RlZCBpZGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uTWVtYmVyc2hpcCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVwb2NoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpvaW5TZXF1ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSBsZWZ0U2VxdWVuY2U/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSByb2xlOiBNZW1iZXJzaGlwUm9sZTtcbiAgcmVhZG9ubHkgc3RhdGU6IE1lbWJlcnNoaXBTdGF0ZTtcbn1cblxuLyoqIE5hbWVzIG11c3QgcGFzcyB0aGUgY2FsbGVyJ3MgYXVkaWVuY2UgcHJvamVjdGlvbiBiZWZvcmUgYmVpbmcgc2VyaWFsaXplZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uU3VtbWFyeSB7XG4gIHJlYWRvbmx5IGFjdGl2ZU1lbWJlckNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtpbmQ6IENvbnZlcnNhdGlvbktpbmQ7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXA6IENvbnZlcnNhdGlvbk1lbWJlcnNoaXA7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0ZTogQ29udmVyc2F0aW9uU3RhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uSW52aXRlIHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGludml0ZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGludml0ZWRCeVBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBzdGF0ZTogJ2FjY2VwdGVkJyB8ICdkZWNsaW5lZCcgfCAnZXhwaXJlZCcgfCAncGVuZGluZycgfCAncmV2b2tlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRGlyZWN0SW5wdXQge1xuICByZWFkb25seSBwYXJ0aWNpcGFudFBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUdyb3VwSW5wdXQge1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBtZW1iZXJQZXJzb25hSWRzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludml0ZU1lbWJlcklucHV0IHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBwZXJzb25hSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2NlcHRJbnZpdGVJbnB1dCB7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52aXRlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRGVjbGluZUludml0ZUlucHV0ID0gQWNjZXB0SW52aXRlSW5wdXQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlTWVtYmVyUm9sZUlucHV0IHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBwZXJzb25hSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcm9sZTogRXhjbHVkZTxNZW1iZXJzaGlwUm9sZSwgJ293bmVyJz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlTWVtYmVySW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlYXZlQ29udmVyc2F0aW9uSW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zZmVyT3duZXJzaGlwSW5wdXQgPSBSZW1vdmVNZW1iZXJJbnB1dDtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0RXZlbnQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV2ZW50U2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkga2luZDogJ21lbWJlcnNoaXAuY2hhbmdlZCcgfCAnbWVzc2FnZS5jaGFuZ2VkJyB8ICdyZWNlaXB0LmNoYW5nZWQnO1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG59XG5cblxuZXhwb3J0IHR5cGUge0F1dGhvcml6ZWRNZW1iZXJzaGlwLCBDaGF0SWRlbnRpdHksIENoYXRRdWVyeSwgTWVtYmVyc2hpcEFjY2Vzc0lucHV0fSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStGQSxXQUEwRyJ9