@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.
- package/README.md +58 -72
- package/docs/GENERATION.md +63 -0
- package/lib/actions/analytics.js +1 -1
- package/lib/actions/apps.d.ts +2 -2
- package/lib/actions/apps.js +1 -1
- package/lib/actions/connections.js +1 -1
- package/lib/actions/content.js +1 -1
- package/lib/actions/contentGeneration.d.ts +40 -0
- package/lib/actions/contentGeneration.js +206 -0
- package/lib/actions/conversations.js +1 -1
- package/lib/actions/crm.js +1 -1
- package/lib/actions/crud.d.ts +2 -2
- package/lib/actions/crud.js +1 -1
- package/lib/actions/dynamodb.js +1 -1
- package/lib/actions/email.js +1 -1
- package/lib/actions/files.d.ts +42 -4
- package/lib/actions/files.js +1 -1
- package/lib/actions/flags.js +1 -1
- package/lib/actions/geminiVideo.d.ts +19 -0
- package/lib/actions/geminiVideo.js +161 -0
- package/lib/actions/groups.js +1 -1
- package/lib/actions/higgsfield.d.ts +20 -0
- package/lib/actions/higgsfield.js +148 -0
- package/lib/actions/imageGeneration.d.ts +37 -0
- package/lib/actions/imageGeneration.js +121 -0
- package/lib/actions/images.js +1 -1
- package/lib/actions/index.d.ts +5 -0
- package/lib/actions/index.js +6 -1
- package/lib/actions/ios.js +1 -1
- package/lib/actions/locations.js +1 -1
- package/lib/actions/messages.js +1 -1
- package/lib/actions/notifications.js +1 -1
- package/lib/actions/payments.js +27 -26
- package/lib/actions/personas.d.ts +4 -4
- package/lib/actions/personas.js +1 -1
- package/lib/actions/posts.js +1 -1
- package/lib/actions/query.js +1 -1
- package/lib/actions/reactions.d.ts +6 -6
- package/lib/actions/reactions.js +1 -1
- package/lib/actions/rum.js +1 -1
- package/lib/actions/s3.d.ts +4 -4
- package/lib/actions/s3.js +22 -6
- package/lib/actions/search.js +1 -1
- package/lib/actions/sms.js +1 -1
- package/lib/actions/statistics.js +1 -1
- package/lib/actions/subscriptions.js +1 -1
- package/lib/actions/tags.d.ts +2 -2
- package/lib/actions/tags.js +1 -1
- package/lib/actions/users.d.ts +2 -2
- package/lib/actions/users.js +1 -1
- package/lib/actions/videoGeneration.d.ts +20 -0
- package/lib/actions/videoGeneration.js +32 -0
- package/lib/actions/videos.js +1 -1
- package/lib/adapters/arangoAdapter.js +1 -1
- package/lib/adapters/contentAdapter.js +1 -1
- package/lib/adapters/fileAdapter.js +1 -1
- package/lib/adapters/geminiGenerationAdapter.d.ts +34 -0
- package/lib/adapters/geminiGenerationAdapter.js +41 -0
- package/lib/adapters/higgsfieldAdapter.d.ts +120 -0
- package/lib/adapters/higgsfieldAdapter.js +131 -0
- package/lib/adapters/imageAdapter.js +1 -1
- package/lib/adapters/imageGenerationAdapter.d.ts +17 -0
- package/lib/adapters/imageGenerationAdapter.js +18 -0
- package/lib/adapters/index.d.ts +3 -0
- package/lib/adapters/index.js +4 -1
- package/lib/adapters/messageAdapter.js +1 -1
- package/lib/adapters/postAdapter.js +1 -1
- package/lib/adapters/reaktorAdapter.js +1 -1
- package/lib/adapters/tagAdapter.js +1 -1
- package/lib/adapters/userAdapter.d.ts +76 -1
- package/lib/adapters/userAdapter.js +1 -1
- package/lib/config.d.ts +19 -14
- package/lib/config.js +9 -1
- package/lib/constants/collections.js +1 -1
- package/lib/handlers/graphqlHandler.js +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/lambdas/actions/websockets.d.ts +5 -0
- package/lib/lambdas/actions/websockets.js +16 -1
- package/lib/lambdas/authorizer.js +1 -1
- package/lib/lambdas/connection.d.ts +2 -2
- package/lib/lambdas/connection.js +1 -1
- package/lib/lambdas/utils/message.js +1 -1
- package/lib/lambdas/utils/websocket.d.ts +4 -4
- package/lib/lambdas/utils/websocket.js +1 -1
- package/lib/mocks/conversation.js +1 -1
- package/lib/mocks/file.js +1 -1
- package/lib/mocks/group.js +1 -1
- package/lib/mocks/image.js +1 -1
- package/lib/mocks/post.js +1 -1
- package/lib/mocks/tag.js +1 -1
- package/lib/mocks/user.js +1 -1
- package/lib/mocks/video.js +1 -1
- package/lib/mutations/analytics/analytics.js +1 -1
- package/lib/mutations/content/content.js +15 -1
- package/lib/mutations/crm/crm.js +1 -1
- package/lib/mutations/events/events.js +1 -1
- package/lib/mutations/flags/flags.js +1 -1
- package/lib/mutations/groups/groups.js +1 -1
- package/lib/mutations/higgsfield/higgsfield.d.ts +1 -0
- package/lib/mutations/higgsfield/higgsfield.js +62 -0
- package/lib/mutations/images/images.js +10 -1
- package/lib/mutations/index.d.ts +2 -1
- package/lib/mutations/index.js +11 -2
- package/lib/mutations/locations/locations.js +1 -1
- package/lib/mutations/messages/messages.js +1 -1
- package/lib/mutations/personas/personas.js +1 -1
- package/lib/mutations/posts/posts.js +1 -1
- package/lib/mutations/reactions/reactions.js +1 -1
- package/lib/mutations/rum/rum.js +1 -1
- package/lib/mutations/statistics/statistics.js +1 -1
- package/lib/mutations/subscriptions/subscriptions.js +1 -1
- package/lib/mutations/tags/tags.js +1 -1
- package/lib/mutations/users/users.js +1 -1
- package/lib/mutations/videos/videos.js +24 -10
- package/lib/objectTypes/analytics.js +1 -1
- package/lib/objectTypes/app.js +1 -1
- package/lib/objectTypes/bankAccount.js +1 -1
- package/lib/objectTypes/connection.js +1 -1
- package/lib/objectTypes/content.js +1 -1
- package/lib/objectTypes/contentGeneration.d.ts +2 -0
- package/lib/objectTypes/contentGeneration.js +30 -0
- package/lib/objectTypes/conversation.js +1 -1
- package/lib/objectTypes/creditCard.js +1 -1
- package/lib/objectTypes/crm.js +1 -1
- package/lib/objectTypes/document.js +1 -1
- package/lib/objectTypes/error.js +1 -1
- package/lib/objectTypes/event.js +1 -1
- package/lib/objectTypes/external.js +1 -1
- package/lib/objectTypes/file.js +1 -1
- package/lib/objectTypes/filter.js +1 -1
- package/lib/objectTypes/flag.js +1 -1
- package/lib/objectTypes/group.js +1 -1
- package/lib/objectTypes/higgsfield.d.ts +5 -0
- package/lib/objectTypes/higgsfield.js +149 -0
- package/lib/objectTypes/iapSubscription.js +1 -1
- package/lib/objectTypes/image.js +1 -1
- package/lib/objectTypes/imageGeneration.d.ts +2 -0
- package/lib/objectTypes/imageGeneration.js +33 -0
- package/lib/objectTypes/index.d.ts +2 -0
- package/lib/objectTypes/index.js +3 -1
- package/lib/objectTypes/location.js +1 -1
- package/lib/objectTypes/message.js +1 -1
- package/lib/objectTypes/passcode.js +1 -1
- package/lib/objectTypes/persona.d.ts +37 -2
- package/lib/objectTypes/persona.js +1 -1
- package/lib/objectTypes/plan.js +1 -1
- package/lib/objectTypes/post.js +1 -1
- package/lib/objectTypes/query.js +1 -1
- package/lib/objectTypes/reaction.js +1 -1
- package/lib/objectTypes/relation.js +1 -1
- package/lib/objectTypes/rum.js +1 -1
- package/lib/objectTypes/search.js +1 -1
- package/lib/objectTypes/statistics.js +1 -1
- package/lib/objectTypes/subscription.js +1 -1
- package/lib/objectTypes/tag.js +1 -1
- package/lib/objectTypes/user.js +1 -1
- package/lib/objectTypes/video.js +1 -1
- package/lib/objectTypes/videoGeneration.d.ts +2 -0
- package/lib/objectTypes/videoGeneration.js +31 -0
- package/lib/queries/analytics/analytics.js +1 -1
- package/lib/queries/content/content.js +1 -1
- package/lib/queries/crm/crm.js +1 -1
- package/lib/queries/events/events.js +1 -1
- package/lib/queries/flags/flags.js +1 -1
- package/lib/queries/groups/groups.js +1 -1
- package/lib/queries/higgsfield/higgsfield.d.ts +1 -0
- package/lib/queries/higgsfield/higgsfield.js +22 -0
- package/lib/queries/images/images.js +1 -1
- package/lib/queries/index.d.ts +2 -1
- package/lib/queries/index.js +7 -2
- package/lib/queries/locations/locations.js +1 -1
- package/lib/queries/messages/messages.js +1 -1
- package/lib/queries/personas/personas.js +1 -1
- package/lib/queries/posts/posts.js +1 -1
- package/lib/queries/query/query.js +1 -1
- package/lib/queries/reactions/reactions.js +1 -1
- package/lib/queries/statistics/statistics.js +1 -1
- package/lib/queries/subscriptions/subscriptions.js +1 -1
- package/lib/queries/tags/tags.js +1 -1
- package/lib/queries/users/users.js +1 -1
- package/lib/queries/videos/videos.js +1 -1
- package/lib/templates/email/layout.js +1 -1
- package/lib/templates/email/passwordForgot.js +1 -1
- package/lib/templates/email/passwordRecovery.js +1 -1
- package/lib/templates/email/verifyEmail.js +1 -1
- package/lib/templates/email/welcome.js +1 -1
- package/lib/templates/sms/passwordForgot.js +1 -1
- package/lib/templates/sms/passwordRecovery.js +1 -1
- package/lib/templates/sms/verifyEmail.js +1 -1
- package/lib/templates/sms/verifyPhone.js +1 -1
- package/lib/templates/sms/welcome.js +1 -1
- package/lib/types/analytics.types.d.ts +16 -16
- package/lib/types/analytics.types.js +1 -1
- package/lib/types/apps.types.d.ts +4 -4
- package/lib/types/apps.types.js +1 -1
- package/lib/types/arangodb.types.d.ts +20 -20
- package/lib/types/arangodb.types.js +1 -1
- package/lib/types/auth.types.js +1 -1
- package/lib/types/connections.types.d.ts +2 -2
- package/lib/types/connections.types.js +1 -1
- package/lib/types/content.types.d.ts +6 -6
- package/lib/types/content.types.js +1 -1
- package/lib/types/conversations.types.d.ts +2 -2
- package/lib/types/conversations.types.js +1 -1
- package/lib/types/crm.types.d.ts +30 -30
- package/lib/types/crm.types.js +1 -1
- package/lib/types/email.types.d.ts +2 -2
- package/lib/types/email.types.js +1 -1
- package/lib/types/error.types.d.ts +1 -0
- package/lib/types/error.types.js +2 -1
- package/lib/types/files.types.d.ts +2 -2
- package/lib/types/files.types.js +1 -1
- package/lib/types/flags.types.d.ts +8 -8
- package/lib/types/flags.types.js +1 -1
- package/lib/types/google.types.js +1 -1
- package/lib/types/groups.types.d.ts +2 -2
- package/lib/types/groups.types.js +1 -1
- package/lib/types/images.types.d.ts +2 -2
- package/lib/types/images.types.js +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/locations.types.d.ts +2 -2
- package/lib/types/locations.types.js +1 -1
- package/lib/types/messages.types.d.ts +2 -2
- package/lib/types/messages.types.js +1 -1
- package/lib/types/notifications.types.js +1 -1
- package/lib/types/payments.types.d.ts +14 -14
- package/lib/types/payments.types.js +1 -1
- package/lib/types/personas.types.d.ts +2 -2
- package/lib/types/personas.types.js +1 -1
- package/lib/types/posts.types.d.ts +2 -2
- package/lib/types/posts.types.js +1 -1
- package/lib/types/rum.types.d.ts +6 -6
- package/lib/types/rum.types.js +1 -1
- package/lib/types/statistics.types.js +1 -1
- package/lib/types/tags.types.d.ts +4 -4
- package/lib/types/tags.types.js +1 -1
- package/lib/types/users.types.d.ts +2 -2
- package/lib/types/users.types.js +1 -1
- package/lib/types/videos.types.d.ts +2 -2
- package/lib/types/videos.types.js +1 -1
- package/lib/types/websockets.types.d.ts +4 -4
- package/lib/types/websockets.types.js +1 -1
- package/lib/upload.js +1 -1
- package/lib/utils/adapterUtils.js +1 -1
- package/lib/utils/analyticsUtils.js +1 -1
- package/lib/utils/appContext.js +1 -1
- package/lib/utils/aqlHelpers.js +1 -1
- package/lib/utils/arangodbUtils.js +1 -1
- package/lib/utils/authUtils.js +1 -1
- package/lib/utils/awsUtils.js +1 -1
- package/lib/utils/collectionRegistry.d.ts +2 -2
- package/lib/utils/collectionRegistry.js +1 -1
- package/lib/utils/contextUtils.js +1 -1
- package/lib/utils/dbI18n.example.js +1 -1
- package/lib/utils/dbI18n.js +1 -1
- package/lib/utils/googleTranslate.js +1 -1
- package/lib/utils/graphqlUtils.js +1 -1
- package/lib/utils/imageUtils.js +1 -1
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/index.js +4 -1
- package/lib/utils/languageDetection.js +1 -1
- package/lib/utils/localeUtils.example.js +1 -1
- package/lib/utils/localeUtils.js +1 -1
- package/lib/utils/mediaAccess.d.ts +5 -0
- package/lib/utils/mediaAccess.js +57 -0
- package/lib/utils/middlewareUtils.js +1 -1
- package/lib/utils/nodeRealtime.d.ts +14 -0
- package/lib/utils/nodeRealtime.js +84 -0
- package/lib/utils/opaqueToken.d.ts +4 -0
- package/lib/utils/opaqueToken.js +7 -0
- package/lib/utils/queryBuilder.js +1 -1
- package/lib/utils/schemaUtils.js +1 -1
- package/lib/utils/sessionUtils.js +1 -1
- package/lib/utils/stripeUtils.d.ts +1 -1
- package/lib/utils/stripeUtils.js +2 -3
- package/lib/utils/stripeUtils.ts.bak +12 -0
- package/lib/utils/templateUtils.js +1 -1
- package/lib/utils/testUtils.js +1 -1
- package/lib/utils/translationQueue.example.js +1 -1
- package/lib/utils/translationQueue.js +1 -1
- package/lib/videoProcessing.js +1 -1
- package/package.json +24 -23
- package/lib/durableChat/conversations.d.ts +0 -62
- package/lib/durableChat/conversations.js +0 -729
- package/lib/durableChat/errors.d.ts +0 -6
- package/lib/durableChat/errors.js +0 -11
- package/lib/durableChat/events.d.ts +0 -22
- package/lib/durableChat/events.js +0 -50
- package/lib/durableChat/index.d.ts +0 -8
- package/lib/durableChat/index.js +0 -10
- package/lib/durableChat/membership.d.ts +0 -24
- package/lib/durableChat/membership.js +0 -85
- package/lib/durableChat/messageTypes.d.ts +0 -76
- package/lib/durableChat/messageTypes.js +0 -3
- package/lib/durableChat/messages.d.ts +0 -16
- package/lib/durableChat/messages.js +0 -257
- package/lib/durableChat/transaction.d.ts +0 -10
- package/lib/durableChat/transaction.js +0 -53
- package/lib/durableChat/types.d.ts +0 -81
- 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';
|
package/lib/durableChat/types.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export { };
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2R1cmFibGVDaGF0L3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbktpbmQgPSAnZGlyZWN0JyB8ICdncm91cCc7XG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25TdGF0ZSA9ICdhY3RpdmUnIHwgJ2Nsb3NlZCcgfCAnZm9ybWluZyc7XG5leHBvcnQgdHlwZSBNZW1iZXJzaGlwUm9sZSA9ICdhZG1pbicgfCAnbWVtYmVyJyB8ICdvd25lcic7XG5leHBvcnQgdHlwZSBNZW1iZXJzaGlwU3RhdGUgPSAnYWN0aXZlJyB8ICdsZWZ0JyB8ICdyZW1vdmVkJztcblxuLyoqIEFuIGVwb2NoIGlzIGEgZ3JhbnQgZm9yIGEgYm91bmRlZCBoaXN0b3J5IGludGVydmFsLCBuZXZlciBhIGNsaWVudC1zZWxlY3RlZCBpZGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uTWVtYmVyc2hpcCB7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVwb2NoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpvaW5TZXF1ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSBsZWZ0U2VxdWVuY2U/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSByb2xlOiBNZW1iZXJzaGlwUm9sZTtcbiAgcmVhZG9ubHkgc3RhdGU6IE1lbWJlcnNoaXBTdGF0ZTtcbn1cblxuLyoqIE5hbWVzIG11c3QgcGFzcyB0aGUgY2FsbGVyJ3MgYXVkaWVuY2UgcHJvamVjdGlvbiBiZWZvcmUgYmVpbmcgc2VyaWFsaXplZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uU3VtbWFyeSB7XG4gIHJlYWRvbmx5IGFjdGl2ZU1lbWJlckNvdW50OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtpbmQ6IENvbnZlcnNhdGlvbktpbmQ7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXA6IENvbnZlcnNhdGlvbk1lbWJlcnNoaXA7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0ZTogQ29udmVyc2F0aW9uU3RhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uSW52aXRlIHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwaXJlc0F0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGludml0ZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGludml0ZWRCeVBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSByZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBzdGF0ZTogJ2FjY2VwdGVkJyB8ICdkZWNsaW5lZCcgfCAnZXhwaXJlZCcgfCAncGVuZGluZycgfCAncmV2b2tlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRGlyZWN0SW5wdXQge1xuICByZWFkb25seSBwYXJ0aWNpcGFudFBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUdyb3VwSW5wdXQge1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBtZW1iZXJQZXJzb25hSWRzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludml0ZU1lbWJlcklucHV0IHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBwZXJzb25hSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2NlcHRJbnZpdGVJbnB1dCB7XG4gIHJlYWRvbmx5IGV4cGVjdGVkUmV2aXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52aXRlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRGVjbGluZUludml0ZUlucHV0ID0gQWNjZXB0SW52aXRlSW5wdXQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlTWVtYmVyUm9sZUlucHV0IHtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBwZXJzb25hSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcm9sZTogRXhjbHVkZTxNZW1iZXJzaGlwUm9sZSwgJ293bmVyJz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlTWVtYmVySW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlYXZlQ29udmVyc2F0aW9uSW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RlZFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFRyYW5zZmVyT3duZXJzaGlwSW5wdXQgPSBSZW1vdmVNZW1iZXJJbnB1dDtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0RXZlbnQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV2ZW50U2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkga2luZDogJ21lbWJlcnNoaXAuY2hhbmdlZCcgfCAnbWVzc2FnZS5jaGFuZ2VkJyB8ICdyZWNlaXB0LmNoYW5nZWQnO1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG59XG5cblxuZXhwb3J0IHR5cGUge0F1dGhvcml6ZWRNZW1iZXJzaGlwLCBDaGF0SWRlbnRpdHksIENoYXRRdWVyeSwgTWVtYmVyc2hpcEFjY2Vzc0lucHV0fSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStGQSxXQUEwRyJ9
|