@nlabs/reaktor 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +182 -0
- package/docs/ASSISTANT.md +138 -0
- package/docs/GENERATION.md +15 -0
- package/docs/NATIVE_PUSH.md +56 -0
- package/lib/actions/alfredFaq.d.ts +80 -0
- package/lib/actions/alfredFaq.js +206 -0
- package/lib/actions/contentGeneration.d.ts +1 -0
- package/lib/actions/contentGeneration.js +25 -6
- package/lib/actions/conversations.d.ts +1 -1
- package/lib/actions/conversations.js +19 -9
- package/lib/actions/crud.js +26 -1
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/messages.js +23 -7
- package/lib/actions/users.js +57 -4
- package/lib/assistant/core.d.ts +53 -0
- package/lib/assistant/core.js +123 -0
- package/lib/assistant/faq.d.ts +26 -0
- package/lib/assistant/faq.js +238 -0
- package/lib/assistant/faqCore.d.ts +23 -0
- package/lib/assistant/faqCore.js +20 -0
- package/lib/assistant/index.d.ts +7 -0
- package/lib/assistant/index.js +5 -0
- package/lib/assistant/service.d.ts +35 -0
- package/lib/assistant/service.js +201 -0
- package/lib/durableChat/conversations.d.ts +62 -0
- package/lib/durableChat/conversations.js +729 -0
- package/lib/durableChat/errors.d.ts +6 -0
- package/lib/durableChat/errors.js +11 -0
- package/lib/durableChat/events.d.ts +22 -0
- package/lib/durableChat/events.js +50 -0
- package/lib/durableChat/index.d.ts +8 -0
- package/lib/durableChat/index.js +10 -0
- package/lib/durableChat/membership.d.ts +24 -0
- package/lib/durableChat/membership.js +85 -0
- package/lib/durableChat/messageTypes.d.ts +76 -0
- package/lib/durableChat/messageTypes.js +3 -0
- package/lib/durableChat/messages.d.ts +16 -0
- package/lib/durableChat/messages.js +257 -0
- package/lib/durableChat/transaction.d.ts +10 -0
- package/lib/durableChat/transaction.js +53 -0
- package/lib/durableChat/types.d.ts +81 -0
- package/lib/durableChat/types.js +3 -0
- package/lib/index.d.ts +4 -4
- package/lib/index.js +5 -3
- package/lib/lambdas/actions/websockets.js +4 -4
- package/lib/nativePush/graphql.d.ts +14 -0
- package/lib/nativePush/graphql.js +105 -0
- package/lib/nativePush/index.d.ts +7 -0
- package/lib/nativePush/index.js +9 -0
- package/lib/nativePush/migrations.d.ts +2 -0
- package/lib/nativePush/migrations.js +36 -0
- package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
- package/lib/nativePush/nativePushContract.fixture.js +27 -0
- package/lib/nativePush/payload.d.ts +2 -0
- package/lib/nativePush/payload.js +106 -0
- package/lib/nativePush/repository.d.ts +9 -0
- package/lib/nativePush/repository.js +120 -0
- package/lib/nativePush/service.d.ts +2 -0
- package/lib/nativePush/service.js +110 -0
- package/lib/nativePush/snsProvider.d.ts +17 -0
- package/lib/nativePush/snsProvider.js +165 -0
- package/lib/nativePush/types.d.ts +89 -0
- package/lib/nativePush/types.js +3 -0
- package/lib/organizations/accountLifecycle.d.ts +7 -0
- package/lib/organizations/accountLifecycle.js +106 -0
- package/lib/organizations/authorization.d.ts +9 -0
- package/lib/organizations/authorization.js +40 -0
- package/lib/organizations/billing.d.ts +38 -0
- package/lib/organizations/billing.js +277 -0
- package/lib/organizations/billingProvider.d.ts +4 -0
- package/lib/organizations/billingProvider.js +287 -0
- package/lib/organizations/billingUpdates.d.ts +9 -0
- package/lib/organizations/billingUpdates.js +388 -0
- package/lib/organizations/index.d.ts +10 -0
- package/lib/organizations/index.js +12 -0
- package/lib/organizations/mail.d.ts +10 -0
- package/lib/organizations/mail.js +60 -0
- package/lib/organizations/memberDirectory.d.ts +15 -0
- package/lib/organizations/memberDirectory.js +28 -0
- package/lib/organizations/membership.d.ts +19 -0
- package/lib/organizations/membership.js +248 -0
- package/lib/organizations/passwordRecovery.d.ts +9 -0
- package/lib/organizations/passwordRecovery.js +50 -0
- package/lib/organizations/plans.d.ts +6 -0
- package/lib/organizations/plans.js +40 -0
- package/lib/organizations/providerPagination.d.ts +6 -0
- package/lib/organizations/providerPagination.js +23 -0
- package/lib/organizations/reconciliation.d.ts +11 -0
- package/lib/organizations/reconciliation.js +400 -0
- package/lib/organizations/signup.d.ts +25 -0
- package/lib/organizations/signup.js +169 -0
- package/lib/organizations/store.d.ts +25 -0
- package/lib/organizations/store.js +167 -0
- package/lib/organizations/types.d.ts +138 -0
- package/lib/organizations/types.js +3 -0
- package/lib/organizations/verification.d.ts +3 -0
- package/lib/organizations/verification.js +51 -0
- package/package.json +16 -3
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type ChatErrorCode = 'conflict' | 'forbidden' | 'invalid_request' | 'rate_limited' | 'unavailable';
|
|
2
|
+
export declare class DurableChatError extends Error {
|
|
3
|
+
readonly code: ChatErrorCode;
|
|
4
|
+
constructor(code: ChatErrorCode);
|
|
5
|
+
}
|
|
6
|
+
export { DurableChatError as ChatError };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class DurableChatError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code){
|
|
4
|
+
super(code);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = 'ChatError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export { DurableChatError as ChatError };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvZXJyb3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENoYXRFcnJvckNvZGUgPSAnY29uZmxpY3QnIHwgJ2ZvcmJpZGRlbicgfCAnaW52YWxpZF9yZXF1ZXN0JyB8ICdyYXRlX2xpbWl0ZWQnIHwgJ3VuYXZhaWxhYmxlJztcblxuZXhwb3J0IGNsYXNzIER1cmFibGVDaGF0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU6IENoYXRFcnJvckNvZGU7XG5cbiAgY29uc3RydWN0b3IoY29kZTogQ2hhdEVycm9yQ29kZSkge1xuICAgIHN1cGVyKGNvZGUpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5uYW1lID0gJ0NoYXRFcnJvcic7XG4gIH1cbn1cblxuZXhwb3J0IHtEdXJhYmxlQ2hhdEVycm9yIGFzIENoYXRFcnJvcn07XG4iXSwibmFtZXMiOlsiRHVyYWJsZUNoYXRFcnJvciIsIkVycm9yIiwiY29kZSIsIm5hbWUiLCJDaGF0RXJyb3IiXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sTUFBTUEseUJBQXlCQztJQUMzQkMsS0FBb0I7SUFFN0IsWUFBWUEsSUFBbUIsQ0FBRTtRQUMvQixLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQSxJQUFJLEdBQUdBO1FBQ1osSUFBSSxDQUFDQyxJQUFJLEdBQUc7SUFDZDtBQUNGO0FBRUEsU0FBUUgsb0JBQW9CSSxTQUFTLEdBQUUifQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ChatQuery } from './membership.js';
|
|
2
|
+
import type { ChatEvent } from './types.js';
|
|
3
|
+
export interface AppendChatEventInput {
|
|
4
|
+
readonly actorPersonaId: string;
|
|
5
|
+
readonly conversationId: string;
|
|
6
|
+
readonly kind: ChatEvent['kind'];
|
|
7
|
+
readonly membershipEpoch?: string;
|
|
8
|
+
readonly resourceId: string;
|
|
9
|
+
readonly revision: number;
|
|
10
|
+
}
|
|
11
|
+
export interface StoredChatEvent extends ChatEvent {
|
|
12
|
+
readonly _key: string;
|
|
13
|
+
readonly actorPersonaId: string;
|
|
14
|
+
readonly createdAt: number;
|
|
15
|
+
readonly leaseUntil: number;
|
|
16
|
+
readonly membershipEpoch?: string;
|
|
17
|
+
readonly nextAttemptAt: number;
|
|
18
|
+
readonly status: 'pending';
|
|
19
|
+
readonly type: ChatEvent['kind'];
|
|
20
|
+
}
|
|
21
|
+
/** Requires the caller's exclusive conversations/chatOutbox locks; never commits independently. */
|
|
22
|
+
export declare const appendChatEvent: (read: ChatQuery, input: AppendChatEventInput) => Promise<StoredChatEvent>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { ChatError } from './errors.js';
|
|
3
|
+
import { isChatIdentifier } from './membership.js';
|
|
4
|
+
/** Requires the caller's exclusive conversations/chatOutbox locks; never commits independently. */ export const appendChatEvent = async (read, input)=>{
|
|
5
|
+
if (!input || !isChatIdentifier(input.actorPersonaId) || !isChatIdentifier(input.conversationId) || !isChatIdentifier(input.resourceId) || !Number.isSafeInteger(input.revision) || input.revision < 1 || input.membershipEpoch !== undefined && !isChatIdentifier(input.membershipEpoch) || ![
|
|
6
|
+
'membership.changed',
|
|
7
|
+
'message.changed',
|
|
8
|
+
'receipt.changed'
|
|
9
|
+
].includes(input.kind)) {
|
|
10
|
+
throw new ChatError('invalid_request');
|
|
11
|
+
}
|
|
12
|
+
const sequence = await read(`LET conversation = DOCUMENT('conversations', @id)
|
|
13
|
+
FILTER conversation != null AND conversation.chatSchemaVersion == 1
|
|
14
|
+
AND (conversation.lastEventSequence == null OR
|
|
15
|
+
(IS_NUMBER(conversation.lastEventSequence) AND conversation.lastEventSequence >= 0
|
|
16
|
+
AND FLOOR(conversation.lastEventSequence) == conversation.lastEventSequence
|
|
17
|
+
AND conversation.lastEventSequence < 9007199254740991))
|
|
18
|
+
UPDATE @id WITH {lastEventSequence: (conversation.lastEventSequence == null ? 0 : conversation.lastEventSequence) + 1}
|
|
19
|
+
IN conversations RETURN NEW.lastEventSequence`, {
|
|
20
|
+
id: input.conversationId
|
|
21
|
+
});
|
|
22
|
+
if (!Number.isSafeInteger(sequence) || Number(sequence) < 1) {
|
|
23
|
+
throw new ChatError('unavailable');
|
|
24
|
+
}
|
|
25
|
+
const id = randomUUID();
|
|
26
|
+
const record = {
|
|
27
|
+
_key: id,
|
|
28
|
+
actorPersonaId: input.actorPersonaId,
|
|
29
|
+
conversationId: input.conversationId,
|
|
30
|
+
createdAt: Date.now(),
|
|
31
|
+
eventId: id,
|
|
32
|
+
eventSequence: sequence,
|
|
33
|
+
kind: input.kind,
|
|
34
|
+
leaseUntil: 0,
|
|
35
|
+
membershipEpoch: input.membershipEpoch,
|
|
36
|
+
nextAttemptAt: 0,
|
|
37
|
+
resourceId: input.resourceId,
|
|
38
|
+
revision: input.revision,
|
|
39
|
+
status: 'pending',
|
|
40
|
+
type: input.kind
|
|
41
|
+
};
|
|
42
|
+
if (await read('INSERT @record IN chatOutbox RETURN true', {
|
|
43
|
+
record
|
|
44
|
+
}) !== true) {
|
|
45
|
+
throw new ChatError('unavailable');
|
|
46
|
+
}
|
|
47
|
+
return record;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvZXZlbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuXG5pbXBvcnQge0NoYXRFcnJvcn0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHtpc0NoYXRJZGVudGlmaWVyfSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2hhdFF1ZXJ5fSBmcm9tICcuL21lbWJlcnNoaXAuanMnO1xuaW1wb3J0IHR5cGUge0NoYXRFdmVudH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwZW5kQ2hhdEV2ZW50SW5wdXQge1xuICByZWFkb25seSBhY3RvclBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBraW5kOiBDaGF0RXZlbnRbJ2tpbmQnXTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcEVwb2NoPzogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkQ2hhdEV2ZW50IGV4dGVuZHMgQ2hhdEV2ZW50IHtcbiAgcmVhZG9ubHkgX2tleTogc3RyaW5nO1xuICByZWFkb25seSBhY3RvclBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbGVhc2VVbnRpbDogbnVtYmVyO1xuICByZWFkb25seSBtZW1iZXJzaGlwRXBvY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5leHRBdHRlbXB0QXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RhdHVzOiAncGVuZGluZyc7XG4gIHJlYWRvbmx5IHR5cGU6IENoYXRFdmVudFsna2luZCddO1xufVxuXG4vKiogUmVxdWlyZXMgdGhlIGNhbGxlcidzIGV4Y2x1c2l2ZSBjb252ZXJzYXRpb25zL2NoYXRPdXRib3ggbG9ja3M7IG5ldmVyIGNvbW1pdHMgaW5kZXBlbmRlbnRseS4gKi9cbmV4cG9ydCBjb25zdCBhcHBlbmRDaGF0RXZlbnQgPSBhc3luYyAocmVhZDogQ2hhdFF1ZXJ5LCBpbnB1dDogQXBwZW5kQ2hhdEV2ZW50SW5wdXQpOiBQcm9taXNlPFN0b3JlZENoYXRFdmVudD4gPT4ge1xuICBpZighaW5wdXQgfHwgIWlzQ2hhdElkZW50aWZpZXIoaW5wdXQuYWN0b3JQZXJzb25hSWQpIHx8ICFpc0NoYXRJZGVudGlmaWVyKGlucHV0LmNvbnZlcnNhdGlvbklkKVxuICAgIHx8ICFpc0NoYXRJZGVudGlmaWVyKGlucHV0LnJlc291cmNlSWQpIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnB1dC5yZXZpc2lvbikgfHwgaW5wdXQucmV2aXNpb24gPCAxXG4gICAgfHwgKGlucHV0Lm1lbWJlcnNoaXBFcG9jaCAhPT0gdW5kZWZpbmVkICYmICFpc0NoYXRJZGVudGlmaWVyKGlucHV0Lm1lbWJlcnNoaXBFcG9jaCkpXG4gICAgfHwgIVsnbWVtYmVyc2hpcC5jaGFuZ2VkJywgJ21lc3NhZ2UuY2hhbmdlZCcsICdyZWNlaXB0LmNoYW5nZWQnXS5pbmNsdWRlcyhpbnB1dC5raW5kKSkge1xuICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ2ludmFsaWRfcmVxdWVzdCcpO1xuICB9XG4gIGNvbnN0IHNlcXVlbmNlID0gYXdhaXQgcmVhZDxudW1iZXI+KGBMRVQgY29udmVyc2F0aW9uID0gRE9DVU1FTlQoJ2NvbnZlcnNhdGlvbnMnLCBAaWQpXG4gICAgRklMVEVSIGNvbnZlcnNhdGlvbiAhPSBudWxsIEFORCBjb252ZXJzYXRpb24uY2hhdFNjaGVtYVZlcnNpb24gPT0gMVxuICAgICAgQU5EIChjb252ZXJzYXRpb24ubGFzdEV2ZW50U2VxdWVuY2UgPT0gbnVsbCBPUlxuICAgICAgICAoSVNfTlVNQkVSKGNvbnZlcnNhdGlvbi5sYXN0RXZlbnRTZXF1ZW5jZSkgQU5EIGNvbnZlcnNhdGlvbi5sYXN0RXZlbnRTZXF1ZW5jZSA+PSAwXG4gICAgICAgICAgQU5EIEZMT09SKGNvbnZlcnNhdGlvbi5sYXN0RXZlbnRTZXF1ZW5jZSkgPT0gY29udmVyc2F0aW9uLmxhc3RFdmVudFNlcXVlbmNlXG4gICAgICAgICAgQU5EIGNvbnZlcnNhdGlvbi5sYXN0RXZlbnRTZXF1ZW5jZSA8IDkwMDcxOTkyNTQ3NDA5OTEpKVxuICAgIFVQREFURSBAaWQgV0lUSCB7bGFzdEV2ZW50U2VxdWVuY2U6IChjb252ZXJzYXRpb24ubGFzdEV2ZW50U2VxdWVuY2UgPT0gbnVsbCA/IDAgOiBjb252ZXJzYXRpb24ubGFzdEV2ZW50U2VxdWVuY2UpICsgMX1cbiAgICAgIElOIGNvbnZlcnNhdGlvbnMgUkVUVVJOIE5FVy5sYXN0RXZlbnRTZXF1ZW5jZWAsIHtpZDogaW5wdXQuY29udmVyc2F0aW9uSWR9KTtcbiAgaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNlcXVlbmNlKSB8fCBOdW1iZXIoc2VxdWVuY2UpIDwgMSkge1xuICAgIHRocm93IG5ldyBDaGF0RXJyb3IoJ3VuYXZhaWxhYmxlJyk7XG4gIH1cbiAgY29uc3QgaWQgPSByYW5kb21VVUlEKCk7XG4gIGNvbnN0IHJlY29yZDogU3RvcmVkQ2hhdEV2ZW50ID0ge1xuICAgIF9rZXk6IGlkLCBhY3RvclBlcnNvbmFJZDogaW5wdXQuYWN0b3JQZXJzb25hSWQsIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCwgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgIGV2ZW50SWQ6IGlkLCBldmVudFNlcXVlbmNlOiBzZXF1ZW5jZSEsIGtpbmQ6IGlucHV0LmtpbmQsIGxlYXNlVW50aWw6IDAsXG4gICAgbWVtYmVyc2hpcEVwb2NoOiBpbnB1dC5tZW1iZXJzaGlwRXBvY2gsIG5leHRBdHRlbXB0QXQ6IDAsIHJlc291cmNlSWQ6IGlucHV0LnJlc291cmNlSWQsXG4gICAgcmV2aXNpb246IGlucHV0LnJldmlzaW9uLCBzdGF0dXM6ICdwZW5kaW5nJywgdHlwZTogaW5wdXQua2luZFxuICB9O1xuICBpZihhd2FpdCByZWFkPGJvb2xlYW4+KCdJTlNFUlQgQHJlY29yZCBJTiBjaGF0T3V0Ym94IFJFVFVSTiB0cnVlJywge3JlY29yZH0pICE9PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IENoYXRFcnJvcigndW5hdmFpbGFibGUnKTtcbiAgfVxuICByZXR1cm4gcmVjb3JkO1xufTtcbiJdLCJuYW1lcyI6WyJyYW5kb21VVUlEIiwiQ2hhdEVycm9yIiwiaXNDaGF0SWRlbnRpZmllciIsImFwcGVuZENoYXRFdmVudCIsInJlYWQiLCJpbnB1dCIsImFjdG9yUGVyc29uYUlkIiwiY29udmVyc2F0aW9uSWQiLCJyZXNvdXJjZUlkIiwiTnVtYmVyIiwiaXNTYWZlSW50ZWdlciIsInJldmlzaW9uIiwibWVtYmVyc2hpcEVwb2NoIiwidW5kZWZpbmVkIiwiaW5jbHVkZXMiLCJraW5kIiwic2VxdWVuY2UiLCJpZCIsInJlY29yZCIsIl9rZXkiLCJjcmVhdGVkQXQiLCJEYXRlIiwibm93IiwiZXZlbnRJZCIsImV2ZW50U2VxdWVuY2UiLCJsZWFzZVVudGlsIiwibmV4dEF0dGVtcHRBdCIsInN0YXR1cyIsInR5cGUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLFVBQVUsUUFBTyxjQUFjO0FBRXZDLFNBQVFDLFNBQVMsUUFBTyxjQUFjO0FBQ3RDLFNBQVFDLGdCQUFnQixRQUFPLGtCQUFrQjtBQXlCakQsaUdBQWlHLEdBQ2pHLE9BQU8sTUFBTUMsa0JBQWtCLE9BQU9DLE1BQWlCQztJQUNyRCxJQUFHLENBQUNBLFNBQVMsQ0FBQ0gsaUJBQWlCRyxNQUFNQyxjQUFjLEtBQUssQ0FBQ0osaUJBQWlCRyxNQUFNRSxjQUFjLEtBQ3pGLENBQUNMLGlCQUFpQkcsTUFBTUcsVUFBVSxLQUFLLENBQUNDLE9BQU9DLGFBQWEsQ0FBQ0wsTUFBTU0sUUFBUSxLQUFLTixNQUFNTSxRQUFRLEdBQUcsS0FDaEdOLE1BQU1PLGVBQWUsS0FBS0MsYUFBYSxDQUFDWCxpQkFBaUJHLE1BQU1PLGVBQWUsS0FDL0UsQ0FBQztRQUFDO1FBQXNCO1FBQW1CO0tBQWtCLENBQUNFLFFBQVEsQ0FBQ1QsTUFBTVUsSUFBSSxHQUFHO1FBQ3ZGLE1BQU0sSUFBSWQsVUFBVTtJQUN0QjtJQUNBLE1BQU1lLFdBQVcsTUFBTVosS0FBYSxDQUFDOzs7Ozs7O21EQU9ZLENBQUMsRUFBRTtRQUFDYSxJQUFJWixNQUFNRSxjQUFjO0lBQUE7SUFDN0UsSUFBRyxDQUFDRSxPQUFPQyxhQUFhLENBQUNNLGFBQWFQLE9BQU9PLFlBQVksR0FBRztRQUMxRCxNQUFNLElBQUlmLFVBQVU7SUFDdEI7SUFDQSxNQUFNZ0IsS0FBS2pCO0lBQ1gsTUFBTWtCLFNBQTBCO1FBQzlCQyxNQUFNRjtRQUFJWCxnQkFBZ0JELE1BQU1DLGNBQWM7UUFBRUMsZ0JBQWdCRixNQUFNRSxjQUFjO1FBQUVhLFdBQVdDLEtBQUtDLEdBQUc7UUFDekdDLFNBQVNOO1FBQUlPLGVBQWVSO1FBQVdELE1BQU1WLE1BQU1VLElBQUk7UUFBRVUsWUFBWTtRQUNyRWIsaUJBQWlCUCxNQUFNTyxlQUFlO1FBQUVjLGVBQWU7UUFBR2xCLFlBQVlILE1BQU1HLFVBQVU7UUFDdEZHLFVBQVVOLE1BQU1NLFFBQVE7UUFBRWdCLFFBQVE7UUFBV0MsTUFBTXZCLE1BQU1VLElBQUk7SUFDL0Q7SUFDQSxJQUFHLE1BQU1YLEtBQWMsNENBQTRDO1FBQUNjO0lBQU0sT0FBTyxNQUFNO1FBQ3JGLE1BQU0sSUFBSWpCLFVBQVU7SUFDdEI7SUFDQSxPQUFPaUI7QUFDVCxFQUFFIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './conversations.js';
|
|
2
|
+
export * from './errors.js';
|
|
3
|
+
export * from './events.js';
|
|
4
|
+
export * from './membership.js';
|
|
5
|
+
export * from './transaction.js';
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export * from './messages.js';
|
|
8
|
+
export * from './messageTypes.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './conversations.js';
|
|
2
|
+
export * from './errors.js';
|
|
3
|
+
export * from './events.js';
|
|
4
|
+
export * from './membership.js';
|
|
5
|
+
export * from './transaction.js';
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export * from './messages.js';
|
|
8
|
+
export * from './messageTypes.js';
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb252ZXJzYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVtYmVyc2hpcC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zYWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2VUeXBlcy5qcyc7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxjQUFjO0FBQzVCLGNBQWMsY0FBYztBQUM1QixjQUFjLGtCQUFrQjtBQUNoQyxjQUFjLG1CQUFtQjtBQUNqQyxjQUFjLGFBQWE7QUFDM0IsY0FBYyxnQkFBZ0I7QUFDOUIsY0FBYyxvQkFBb0IifQ==
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ApiContext } from '../types/auth.types.js';
|
|
2
|
+
import type { ConversationKind, ConversationMembership, ConversationState } from './types.js';
|
|
3
|
+
export interface ChatIdentity {
|
|
4
|
+
readonly personaId: string;
|
|
5
|
+
readonly userId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MembershipAccessInput {
|
|
8
|
+
readonly conversationId: string;
|
|
9
|
+
readonly membershipEpoch?: string;
|
|
10
|
+
readonly messageSequence?: number;
|
|
11
|
+
readonly purpose: 'history' | 'invite' | 'participants' | 'report' | 'send' | 'socket';
|
|
12
|
+
}
|
|
13
|
+
export interface AuthorizedMembership extends ConversationMembership {
|
|
14
|
+
readonly activeMemberCount: number;
|
|
15
|
+
readonly conversationState: ConversationState;
|
|
16
|
+
readonly kind: ConversationKind;
|
|
17
|
+
readonly lastSequence: number;
|
|
18
|
+
readonly membershipRevision: number;
|
|
19
|
+
}
|
|
20
|
+
/** Inject the transaction's query adapter when this check guards a write. */
|
|
21
|
+
export type ChatQuery = <T>(query: string, bindVars: Record<string, unknown>) => Promise<T | undefined>;
|
|
22
|
+
export declare const isChatIdentifier: (value: unknown) => value is string;
|
|
23
|
+
export declare const createMembershipAuthorizer: (read: ChatQuery) => (identity: ChatIdentity, input: MembershipAccessInput) => Promise<AuthorizedMembership>;
|
|
24
|
+
export declare const authorizeConversationAccess: (context: ApiContext, identity: ChatIdentity, input: MembershipAccessInput) => Promise<AuthorizedMembership>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ChatError } from './errors.js';
|
|
2
|
+
import { createDurableQuery } from './transaction.js';
|
|
3
|
+
export const isChatIdentifier = (value)=>typeof value === 'string' && /^[a-zA-Z0-9_-]{1,128}$/.test(value);
|
|
4
|
+
const purposes = [
|
|
5
|
+
'history',
|
|
6
|
+
'invite',
|
|
7
|
+
'participants',
|
|
8
|
+
'report',
|
|
9
|
+
'send',
|
|
10
|
+
'socket'
|
|
11
|
+
];
|
|
12
|
+
export const createMembershipAuthorizer = (read)=>async (identity, input)=>{
|
|
13
|
+
if (!identity || !isChatIdentifier(identity.userId) || !isChatIdentifier(identity.personaId)) {
|
|
14
|
+
throw new ChatError('forbidden');
|
|
15
|
+
}
|
|
16
|
+
if (!input || !isChatIdentifier(input.conversationId) || !purposes.includes(input.purpose) || input.membershipEpoch !== undefined && !isChatIdentifier(input.membershipEpoch) || input.messageSequence !== undefined && (!Number.isSafeInteger(input.messageSequence) || input.messageSequence < 1) || input.purpose === 'report' && input.messageSequence === undefined) {
|
|
17
|
+
throw new ChatError('invalid_request');
|
|
18
|
+
}
|
|
19
|
+
const result = await read(`
|
|
20
|
+
LET user = DOCUMENT('users', @userId)
|
|
21
|
+
LET persona = DOCUMENT('personas', @personaId)
|
|
22
|
+
LET conversation = DOCUMENT('conversations', @conversationId)
|
|
23
|
+
FILTER user != null AND user.active != false AND persona != null AND persona.active != false
|
|
24
|
+
AND persona.userId == @userId AND conversation != null AND conversation.chatSchemaVersion == 1
|
|
25
|
+
AND conversation.kind IN ['direct', 'group'] AND conversation.state IN ['active', 'forming', 'closed']
|
|
26
|
+
LET membership = FIRST(FOR member IN hasChatMembership
|
|
27
|
+
FILTER member.conversationId == @conversationId AND member.personaId == @personaId
|
|
28
|
+
AND member.userId == @userId AND member._from == CONCAT('personas/', @personaId)
|
|
29
|
+
AND member._to == CONCAT('conversations/', @conversationId)
|
|
30
|
+
AND (@epoch == null OR member.epoch == @epoch)
|
|
31
|
+
AND (@purpose == 'report' ? member.state IN ['active', 'left', 'removed'] : member.state == 'active')
|
|
32
|
+
AND (@sequence == null OR (IS_NUMBER(member.joinSequence) AND @sequence >= member.joinSequence
|
|
33
|
+
AND @sequence <= conversation.lastSequence
|
|
34
|
+
AND (member.state == 'active' OR (IS_NUMBER(member.leftSequence) AND @sequence <= member.leftSequence))))
|
|
35
|
+
SORT member.acceptedAt DESC, member._key DESC LIMIT 1 RETURN member)
|
|
36
|
+
FILTER membership != null
|
|
37
|
+
LET peers = (FOR member IN hasChatMembership
|
|
38
|
+
FILTER member.conversationId == @conversationId AND member.state == 'active'
|
|
39
|
+
AND member.personaId != @personaId RETURN member)
|
|
40
|
+
LET peer = FIRST(peers)
|
|
41
|
+
LET peerPersona = peer == null ? null : DOCUMENT('personas', peer.personaId)
|
|
42
|
+
LET peerUser = peer == null ? null : DOCUMENT('users', peer.userId)
|
|
43
|
+
LET blocked = peer == null ? false : FIRST(FOR edge IN hasConnection FILTER edge.type == 'block'
|
|
44
|
+
AND ((edge._from IN [CONCAT('personas/', @personaId), CONCAT('users/', @userId)]
|
|
45
|
+
AND edge._to IN [CONCAT('personas/', peer.personaId), CONCAT('users/', peer.userId)])
|
|
46
|
+
OR (edge._to IN [CONCAT('personas/', @personaId), CONCAT('users/', @userId)]
|
|
47
|
+
AND edge._from IN [CONCAT('personas/', peer.personaId), CONCAT('users/', peer.userId)])) LIMIT 1 RETURN true)
|
|
48
|
+
LET following = peer == null ? false : FIRST(FOR edge IN hasConnection
|
|
49
|
+
FILTER edge.type == 'follow' AND edge.active != false AND edge._from == CONCAT('personas/', @personaId)
|
|
50
|
+
AND edge._to == CONCAT('personas/', peer.personaId) LIMIT 1 RETURN true)
|
|
51
|
+
LET followed = peer == null ? false : FIRST(FOR edge IN hasConnection
|
|
52
|
+
FILTER edge.type == 'follow' AND edge.active != false AND edge._to == CONCAT('personas/', @personaId)
|
|
53
|
+
AND edge._from == CONCAT('personas/', peer.personaId) LIMIT 1 RETURN true)
|
|
54
|
+
FILTER @purpose NOT IN ['send', 'socket'] OR (conversation.state == 'active'
|
|
55
|
+
AND (conversation.kind != 'direct' OR (LENGTH(peers) == 1 AND peerPersona != null AND peerUser != null
|
|
56
|
+
AND peerPersona.active != false AND peerUser.active != false AND peerPersona.userId == peer.userId
|
|
57
|
+
AND blocked != true AND following == true AND followed == true)))
|
|
58
|
+
FILTER @purpose != 'invite' OR (conversation.kind == 'group' AND conversation.state != 'closed'
|
|
59
|
+
AND membership.role IN ['owner', 'admin'])
|
|
60
|
+
FILTER @purpose == 'report' OR conversation.state != 'closed'
|
|
61
|
+
RETURN {activeMemberCount: conversation.activeMemberCount, conversationId: @conversationId,
|
|
62
|
+
conversationState: conversation.state, epoch: membership.epoch, joinSequence: membership.joinSequence,
|
|
63
|
+
kind: conversation.kind, lastSequence: conversation.lastSequence, leftSequence: membership.leftSequence,
|
|
64
|
+
membershipRevision: conversation.membershipRevision, personaId: @personaId, revision: membership.revision,
|
|
65
|
+
role: membership.role, state: membership.state}
|
|
66
|
+
`, {
|
|
67
|
+
conversationId: input.conversationId,
|
|
68
|
+
epoch: input.membershipEpoch ?? null,
|
|
69
|
+
personaId: identity.personaId,
|
|
70
|
+
purpose: input.purpose,
|
|
71
|
+
sequence: input.messageSequence ?? null,
|
|
72
|
+
userId: identity.userId
|
|
73
|
+
});
|
|
74
|
+
if (!result || !isChatIdentifier(result.epoch) || !Number.isSafeInteger(result.joinSequence) || result.joinSequence < 0 || !Number.isSafeInteger(result.lastSequence) || result.lastSequence < 0 || !Number.isSafeInteger(result.revision) || result.revision < 1 || !Number.isSafeInteger(result.membershipRevision) || result.membershipRevision < 1 || !Number.isSafeInteger(result.activeMemberCount) || result.activeMemberCount < 0 || result.activeMemberCount > 25 || ![
|
|
75
|
+
'owner',
|
|
76
|
+
'admin',
|
|
77
|
+
'member'
|
|
78
|
+
].includes(result.role)) {
|
|
79
|
+
throw new ChatError('forbidden');
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
export const authorizeConversationAccess = (context, identity, input)=>createMembershipAuthorizer(createDurableQuery(context))(identity, input);
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvbWVtYmVyc2hpcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYXRFcnJvcn0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHtjcmVhdGVEdXJhYmxlUXVlcnl9IGZyb20gJy4vdHJhbnNhY3Rpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q29udmVyc2F0aW9uS2luZCwgQ29udmVyc2F0aW9uTWVtYmVyc2hpcCwgQ29udmVyc2F0aW9uU3RhdGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRJZGVudGl0eSB7XG4gIHJlYWRvbmx5IHBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSB1c2VySWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1iZXJzaGlwQWNjZXNzSW5wdXQge1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBtZW1iZXJzaGlwRXBvY2g/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2VTZXF1ZW5jZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgcHVycG9zZTogJ2hpc3RvcnknIHwgJ2ludml0ZScgfCAncGFydGljaXBhbnRzJyB8ICdyZXBvcnQnIHwgJ3NlbmQnIHwgJ3NvY2tldCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXplZE1lbWJlcnNoaXAgZXh0ZW5kcyBDb252ZXJzYXRpb25NZW1iZXJzaGlwIHtcbiAgcmVhZG9ubHkgYWN0aXZlTWVtYmVyQ291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uU3RhdGU6IENvbnZlcnNhdGlvblN0YXRlO1xuICByZWFkb25seSBraW5kOiBDb252ZXJzYXRpb25LaW5kO1xuICByZWFkb25seSBsYXN0U2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcFJldmlzaW9uOiBudW1iZXI7XG59XG5cbi8qKiBJbmplY3QgdGhlIHRyYW5zYWN0aW9uJ3MgcXVlcnkgYWRhcHRlciB3aGVuIHRoaXMgY2hlY2sgZ3VhcmRzIGEgd3JpdGUuICovXG5leHBvcnQgdHlwZSBDaGF0UXVlcnkgPSA8VD4ocXVlcnk6IHN0cmluZywgYmluZFZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuXG5leHBvcnQgY29uc3QgaXNDaGF0SWRlbnRpZmllciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eW2EtekEtWjAtOV8tXXsxLDEyOH0kLy50ZXN0KHZhbHVlKTtcblxuY29uc3QgcHVycG9zZXM6IHJlYWRvbmx5IE1lbWJlcnNoaXBBY2Nlc3NJbnB1dFsncHVycG9zZSddW10gPSBbJ2hpc3RvcnknLCAnaW52aXRlJywgJ3BhcnRpY2lwYW50cycsICdyZXBvcnQnLCAnc2VuZCcsICdzb2NrZXQnXTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1lbWJlcnNoaXBBdXRob3JpemVyID0gKHJlYWQ6IENoYXRRdWVyeSkgPT4gYXN5bmMgKFxuICBpZGVudGl0eTogQ2hhdElkZW50aXR5LCBpbnB1dDogTWVtYmVyc2hpcEFjY2Vzc0lucHV0XG4pOiBQcm9taXNlPEF1dGhvcml6ZWRNZW1iZXJzaGlwPiA9PiB7XG4gIGlmKCFpZGVudGl0eSB8fCAhaXNDaGF0SWRlbnRpZmllcihpZGVudGl0eS51c2VySWQpIHx8ICFpc0NoYXRJZGVudGlmaWVyKGlkZW50aXR5LnBlcnNvbmFJZCkpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgfVxuICBpZighaW5wdXQgfHwgIWlzQ2hhdElkZW50aWZpZXIoaW5wdXQuY29udmVyc2F0aW9uSWQpIHx8ICFwdXJwb3Nlcy5pbmNsdWRlcyhpbnB1dC5wdXJwb3NlKVxuICAgIHx8IChpbnB1dC5tZW1iZXJzaGlwRXBvY2ggIT09IHVuZGVmaW5lZCAmJiAhaXNDaGF0SWRlbnRpZmllcihpbnB1dC5tZW1iZXJzaGlwRXBvY2gpKVxuICAgIHx8IChpbnB1dC5tZXNzYWdlU2VxdWVuY2UgIT09IHVuZGVmaW5lZFxuICAgICAgJiYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnB1dC5tZXNzYWdlU2VxdWVuY2UpIHx8IGlucHV0Lm1lc3NhZ2VTZXF1ZW5jZSA8IDEpKVxuICAgIHx8IChpbnB1dC5wdXJwb3NlID09PSAncmVwb3J0JyAmJiBpbnB1dC5tZXNzYWdlU2VxdWVuY2UgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdpbnZhbGlkX3JlcXVlc3QnKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkPEF1dGhvcml6ZWRNZW1iZXJzaGlwPihgXG4gICAgTEVUIHVzZXIgPSBET0NVTUVOVCgndXNlcnMnLCBAdXNlcklkKVxuICAgIExFVCBwZXJzb25hID0gRE9DVU1FTlQoJ3BlcnNvbmFzJywgQHBlcnNvbmFJZClcbiAgICBMRVQgY29udmVyc2F0aW9uID0gRE9DVU1FTlQoJ2NvbnZlcnNhdGlvbnMnLCBAY29udmVyc2F0aW9uSWQpXG4gICAgRklMVEVSIHVzZXIgIT0gbnVsbCBBTkQgdXNlci5hY3RpdmUgIT0gZmFsc2UgQU5EIHBlcnNvbmEgIT0gbnVsbCBBTkQgcGVyc29uYS5hY3RpdmUgIT0gZmFsc2VcbiAgICAgIEFORCBwZXJzb25hLnVzZXJJZCA9PSBAdXNlcklkIEFORCBjb252ZXJzYXRpb24gIT0gbnVsbCBBTkQgY29udmVyc2F0aW9uLmNoYXRTY2hlbWFWZXJzaW9uID09IDFcbiAgICAgIEFORCBjb252ZXJzYXRpb24ua2luZCBJTiBbJ2RpcmVjdCcsICdncm91cCddIEFORCBjb252ZXJzYXRpb24uc3RhdGUgSU4gWydhY3RpdmUnLCAnZm9ybWluZycsICdjbG9zZWQnXVxuICAgIExFVCBtZW1iZXJzaGlwID0gRklSU1QoRk9SIG1lbWJlciBJTiBoYXNDaGF0TWVtYmVyc2hpcFxuICAgICAgRklMVEVSIG1lbWJlci5jb252ZXJzYXRpb25JZCA9PSBAY29udmVyc2F0aW9uSWQgQU5EIG1lbWJlci5wZXJzb25hSWQgPT0gQHBlcnNvbmFJZFxuICAgICAgICBBTkQgbWVtYmVyLnVzZXJJZCA9PSBAdXNlcklkIEFORCBtZW1iZXIuX2Zyb20gPT0gQ09OQ0FUKCdwZXJzb25hcy8nLCBAcGVyc29uYUlkKVxuICAgICAgICBBTkQgbWVtYmVyLl90byA9PSBDT05DQVQoJ2NvbnZlcnNhdGlvbnMvJywgQGNvbnZlcnNhdGlvbklkKVxuICAgICAgICBBTkQgKEBlcG9jaCA9PSBudWxsIE9SIG1lbWJlci5lcG9jaCA9PSBAZXBvY2gpXG4gICAgICAgIEFORCAoQHB1cnBvc2UgPT0gJ3JlcG9ydCcgPyBtZW1iZXIuc3RhdGUgSU4gWydhY3RpdmUnLCAnbGVmdCcsICdyZW1vdmVkJ10gOiBtZW1iZXIuc3RhdGUgPT0gJ2FjdGl2ZScpXG4gICAgICAgIEFORCAoQHNlcXVlbmNlID09IG51bGwgT1IgKElTX05VTUJFUihtZW1iZXIuam9pblNlcXVlbmNlKSBBTkQgQHNlcXVlbmNlID49IG1lbWJlci5qb2luU2VxdWVuY2VcbiAgICAgICAgICBBTkQgQHNlcXVlbmNlIDw9IGNvbnZlcnNhdGlvbi5sYXN0U2VxdWVuY2VcbiAgICAgICAgICBBTkQgKG1lbWJlci5zdGF0ZSA9PSAnYWN0aXZlJyBPUiAoSVNfTlVNQkVSKG1lbWJlci5sZWZ0U2VxdWVuY2UpIEFORCBAc2VxdWVuY2UgPD0gbWVtYmVyLmxlZnRTZXF1ZW5jZSkpKSlcbiAgICAgIFNPUlQgbWVtYmVyLmFjY2VwdGVkQXQgREVTQywgbWVtYmVyLl9rZXkgREVTQyBMSU1JVCAxIFJFVFVSTiBtZW1iZXIpXG4gICAgRklMVEVSIG1lbWJlcnNoaXAgIT0gbnVsbFxuICAgIExFVCBwZWVycyA9IChGT1IgbWVtYmVyIElOIGhhc0NoYXRNZW1iZXJzaGlwXG4gICAgICBGSUxURVIgbWVtYmVyLmNvbnZlcnNhdGlvbklkID09IEBjb252ZXJzYXRpb25JZCBBTkQgbWVtYmVyLnN0YXRlID09ICdhY3RpdmUnXG4gICAgICAgIEFORCBtZW1iZXIucGVyc29uYUlkICE9IEBwZXJzb25hSWQgUkVUVVJOIG1lbWJlcilcbiAgICBMRVQgcGVlciA9IEZJUlNUKHBlZXJzKVxuICAgIExFVCBwZWVyUGVyc29uYSA9IHBlZXIgPT0gbnVsbCA/IG51bGwgOiBET0NVTUVOVCgncGVyc29uYXMnLCBwZWVyLnBlcnNvbmFJZClcbiAgICBMRVQgcGVlclVzZXIgPSBwZWVyID09IG51bGwgPyBudWxsIDogRE9DVU1FTlQoJ3VzZXJzJywgcGVlci51c2VySWQpXG4gICAgTEVUIGJsb2NrZWQgPSBwZWVyID09IG51bGwgPyBmYWxzZSA6IEZJUlNUKEZPUiBlZGdlIElOIGhhc0Nvbm5lY3Rpb24gRklMVEVSIGVkZ2UudHlwZSA9PSAnYmxvY2snXG4gICAgICBBTkQgKChlZGdlLl9mcm9tIElOIFtDT05DQVQoJ3BlcnNvbmFzLycsIEBwZXJzb25hSWQpLCBDT05DQVQoJ3VzZXJzLycsIEB1c2VySWQpXVxuICAgICAgICBBTkQgZWRnZS5fdG8gSU4gW0NPTkNBVCgncGVyc29uYXMvJywgcGVlci5wZXJzb25hSWQpLCBDT05DQVQoJ3VzZXJzLycsIHBlZXIudXNlcklkKV0pXG4gICAgICAgIE9SIChlZGdlLl90byBJTiBbQ09OQ0FUKCdwZXJzb25hcy8nLCBAcGVyc29uYUlkKSwgQ09OQ0FUKCd1c2Vycy8nLCBAdXNlcklkKV1cbiAgICAgICAgQU5EIGVkZ2UuX2Zyb20gSU4gW0NPTkNBVCgncGVyc29uYXMvJywgcGVlci5wZXJzb25hSWQpLCBDT05DQVQoJ3VzZXJzLycsIHBlZXIudXNlcklkKV0pKSBMSU1JVCAxIFJFVFVSTiB0cnVlKVxuICAgIExFVCBmb2xsb3dpbmcgPSBwZWVyID09IG51bGwgPyBmYWxzZSA6IEZJUlNUKEZPUiBlZGdlIElOIGhhc0Nvbm5lY3Rpb25cbiAgICAgIEZJTFRFUiBlZGdlLnR5cGUgPT0gJ2ZvbGxvdycgQU5EIGVkZ2UuYWN0aXZlICE9IGZhbHNlIEFORCBlZGdlLl9mcm9tID09IENPTkNBVCgncGVyc29uYXMvJywgQHBlcnNvbmFJZClcbiAgICAgICAgQU5EIGVkZ2UuX3RvID09IENPTkNBVCgncGVyc29uYXMvJywgcGVlci5wZXJzb25hSWQpIExJTUlUIDEgUkVUVVJOIHRydWUpXG4gICAgTEVUIGZvbGxvd2VkID0gcGVlciA9PSBudWxsID8gZmFsc2UgOiBGSVJTVChGT1IgZWRnZSBJTiBoYXNDb25uZWN0aW9uXG4gICAgICBGSUxURVIgZWRnZS50eXBlID09ICdmb2xsb3cnIEFORCBlZGdlLmFjdGl2ZSAhPSBmYWxzZSBBTkQgZWRnZS5fdG8gPT0gQ09OQ0FUKCdwZXJzb25hcy8nLCBAcGVyc29uYUlkKVxuICAgICAgICBBTkQgZWRnZS5fZnJvbSA9PSBDT05DQVQoJ3BlcnNvbmFzLycsIHBlZXIucGVyc29uYUlkKSBMSU1JVCAxIFJFVFVSTiB0cnVlKVxuICAgIEZJTFRFUiBAcHVycG9zZSBOT1QgSU4gWydzZW5kJywgJ3NvY2tldCddIE9SIChjb252ZXJzYXRpb24uc3RhdGUgPT0gJ2FjdGl2ZSdcbiAgICAgIEFORCAoY29udmVyc2F0aW9uLmtpbmQgIT0gJ2RpcmVjdCcgT1IgKExFTkdUSChwZWVycykgPT0gMSBBTkQgcGVlclBlcnNvbmEgIT0gbnVsbCBBTkQgcGVlclVzZXIgIT0gbnVsbFxuICAgICAgICBBTkQgcGVlclBlcnNvbmEuYWN0aXZlICE9IGZhbHNlIEFORCBwZWVyVXNlci5hY3RpdmUgIT0gZmFsc2UgQU5EIHBlZXJQZXJzb25hLnVzZXJJZCA9PSBwZWVyLnVzZXJJZFxuICAgICAgICBBTkQgYmxvY2tlZCAhPSB0cnVlIEFORCBmb2xsb3dpbmcgPT0gdHJ1ZSBBTkQgZm9sbG93ZWQgPT0gdHJ1ZSkpKVxuICAgIEZJTFRFUiBAcHVycG9zZSAhPSAnaW52aXRlJyBPUiAoY29udmVyc2F0aW9uLmtpbmQgPT0gJ2dyb3VwJyBBTkQgY29udmVyc2F0aW9uLnN0YXRlICE9ICdjbG9zZWQnXG4gICAgICBBTkQgbWVtYmVyc2hpcC5yb2xlIElOIFsnb3duZXInLCAnYWRtaW4nXSlcbiAgICBGSUxURVIgQHB1cnBvc2UgPT0gJ3JlcG9ydCcgT1IgY29udmVyc2F0aW9uLnN0YXRlICE9ICdjbG9zZWQnXG4gICAgUkVUVVJOIHthY3RpdmVNZW1iZXJDb3VudDogY29udmVyc2F0aW9uLmFjdGl2ZU1lbWJlckNvdW50LCBjb252ZXJzYXRpb25JZDogQGNvbnZlcnNhdGlvbklkLFxuICAgICAgY29udmVyc2F0aW9uU3RhdGU6IGNvbnZlcnNhdGlvbi5zdGF0ZSwgZXBvY2g6IG1lbWJlcnNoaXAuZXBvY2gsIGpvaW5TZXF1ZW5jZTogbWVtYmVyc2hpcC5qb2luU2VxdWVuY2UsXG4gICAgICBraW5kOiBjb252ZXJzYXRpb24ua2luZCwgbGFzdFNlcXVlbmNlOiBjb252ZXJzYXRpb24ubGFzdFNlcXVlbmNlLCBsZWZ0U2VxdWVuY2U6IG1lbWJlcnNoaXAubGVmdFNlcXVlbmNlLFxuICAgICAgbWVtYmVyc2hpcFJldmlzaW9uOiBjb252ZXJzYXRpb24ubWVtYmVyc2hpcFJldmlzaW9uLCBwZXJzb25hSWQ6IEBwZXJzb25hSWQsIHJldmlzaW9uOiBtZW1iZXJzaGlwLnJldmlzaW9uLFxuICAgICAgcm9sZTogbWVtYmVyc2hpcC5yb2xlLCBzdGF0ZTogbWVtYmVyc2hpcC5zdGF0ZX1cbiAgYCwge1xuICAgIGNvbnZlcnNhdGlvbklkOiBpbnB1dC5jb252ZXJzYXRpb25JZCwgZXBvY2g6IGlucHV0Lm1lbWJlcnNoaXBFcG9jaCA/PyBudWxsLCBwZXJzb25hSWQ6IGlkZW50aXR5LnBlcnNvbmFJZCxcbiAgICBwdXJwb3NlOiBpbnB1dC5wdXJwb3NlLCBzZXF1ZW5jZTogaW5wdXQubWVzc2FnZVNlcXVlbmNlID8/IG51bGwsIHVzZXJJZDogaWRlbnRpdHkudXNlcklkXG4gIH0pO1xuICBpZighcmVzdWx0IHx8ICFpc0NoYXRJZGVudGlmaWVyKHJlc3VsdC5lcG9jaCkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlc3VsdC5qb2luU2VxdWVuY2UpXG4gICAgfHwgcmVzdWx0LmpvaW5TZXF1ZW5jZSA8IDAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlc3VsdC5sYXN0U2VxdWVuY2UpIHx8IHJlc3VsdC5sYXN0U2VxdWVuY2UgPCAwXG4gICAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlc3VsdC5yZXZpc2lvbikgfHwgcmVzdWx0LnJldmlzaW9uIDwgMVxuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZXN1bHQubWVtYmVyc2hpcFJldmlzaW9uKSB8fCByZXN1bHQubWVtYmVyc2hpcFJldmlzaW9uIDwgMVxuICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZXN1bHQuYWN0aXZlTWVtYmVyQ291bnQpIHx8IHJlc3VsdC5hY3RpdmVNZW1iZXJDb3VudCA8IDBcbiAgICB8fCByZXN1bHQuYWN0aXZlTWVtYmVyQ291bnQgPiAyNSB8fCAhWydvd25lcicsICdhZG1pbicsICdtZW1iZXInXS5pbmNsdWRlcyhyZXN1bHQucm9sZSkpIHtcbiAgICB0aHJvdyBuZXcgQ2hhdEVycm9yKCdmb3JiaWRkZW4nKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGF1dGhvcml6ZUNvbnZlcnNhdGlvbkFjY2VzcyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCwgaWRlbnRpdHk6IENoYXRJZGVudGl0eSwgaW5wdXQ6IE1lbWJlcnNoaXBBY2Nlc3NJbnB1dFxuKTogUHJvbWlzZTxBdXRob3JpemVkTWVtYmVyc2hpcD4gPT4gY3JlYXRlTWVtYmVyc2hpcEF1dGhvcml6ZXIoXG4gIGNyZWF0ZUR1cmFibGVRdWVyeShjb250ZXh0KVxuKShpZGVudGl0eSwgaW5wdXQpO1xuIl0sIm5hbWVzIjpbIkNoYXRFcnJvciIsImNyZWF0ZUR1cmFibGVRdWVyeSIsImlzQ2hhdElkZW50aWZpZXIiLCJ2YWx1ZSIsInRlc3QiLCJwdXJwb3NlcyIsImNyZWF0ZU1lbWJlcnNoaXBBdXRob3JpemVyIiwicmVhZCIsImlkZW50aXR5IiwiaW5wdXQiLCJ1c2VySWQiLCJwZXJzb25hSWQiLCJjb252ZXJzYXRpb25JZCIsImluY2x1ZGVzIiwicHVycG9zZSIsIm1lbWJlcnNoaXBFcG9jaCIsInVuZGVmaW5lZCIsIm1lc3NhZ2VTZXF1ZW5jZSIsIk51bWJlciIsImlzU2FmZUludGVnZXIiLCJyZXN1bHQiLCJlcG9jaCIsInNlcXVlbmNlIiwiam9pblNlcXVlbmNlIiwibGFzdFNlcXVlbmNlIiwicmV2aXNpb24iLCJtZW1iZXJzaGlwUmV2aXNpb24iLCJhY3RpdmVNZW1iZXJDb3VudCIsInJvbGUiLCJhdXRob3JpemVDb252ZXJzYXRpb25BY2Nlc3MiLCJjb250ZXh0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFRQSxTQUFTLFFBQU8sY0FBYztBQUN0QyxTQUFRQyxrQkFBa0IsUUFBTyxtQkFBbUI7QUE0QnBELE9BQU8sTUFBTUMsbUJBQW1CLENBQUNDLFFBQy9CLE9BQU9BLFVBQVUsWUFBWSx5QkFBeUJDLElBQUksQ0FBQ0QsT0FBTztBQUVwRSxNQUFNRSxXQUF3RDtJQUFDO0lBQVc7SUFBVTtJQUFnQjtJQUFVO0lBQVE7Q0FBUztBQUUvSCxPQUFPLE1BQU1DLDZCQUE2QixDQUFDQyxPQUFvQixPQUM3REMsVUFBd0JDO1FBRXhCLElBQUcsQ0FBQ0QsWUFBWSxDQUFDTixpQkFBaUJNLFNBQVNFLE1BQU0sS0FBSyxDQUFDUixpQkFBaUJNLFNBQVNHLFNBQVMsR0FBRztZQUMzRixNQUFNLElBQUlYLFVBQVU7UUFDdEI7UUFDQSxJQUFHLENBQUNTLFNBQVMsQ0FBQ1AsaUJBQWlCTyxNQUFNRyxjQUFjLEtBQUssQ0FBQ1AsU0FBU1EsUUFBUSxDQUFDSixNQUFNSyxPQUFPLEtBQ2xGTCxNQUFNTSxlQUFlLEtBQUtDLGFBQWEsQ0FBQ2QsaUJBQWlCTyxNQUFNTSxlQUFlLEtBQzlFTixNQUFNUSxlQUFlLEtBQUtELGFBQ3hCLENBQUEsQ0FBQ0UsT0FBT0MsYUFBYSxDQUFDVixNQUFNUSxlQUFlLEtBQUtSLE1BQU1RLGVBQWUsR0FBRyxDQUFBLEtBQzFFUixNQUFNSyxPQUFPLEtBQUssWUFBWUwsTUFBTVEsZUFBZSxLQUFLRCxXQUFZO1lBQ3hFLE1BQU0sSUFBSWhCLFVBQVU7UUFDdEI7UUFDQSxNQUFNb0IsU0FBUyxNQUFNYixLQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQStDakQsQ0FBQyxFQUFFO1lBQ0RLLGdCQUFnQkgsTUFBTUcsY0FBYztZQUFFUyxPQUFPWixNQUFNTSxlQUFlLElBQUk7WUFBTUosV0FBV0gsU0FBU0csU0FBUztZQUN6R0csU0FBU0wsTUFBTUssT0FBTztZQUFFUSxVQUFVYixNQUFNUSxlQUFlLElBQUk7WUFBTVAsUUFBUUYsU0FBU0UsTUFBTTtRQUMxRjtRQUNBLElBQUcsQ0FBQ1UsVUFBVSxDQUFDbEIsaUJBQWlCa0IsT0FBT0MsS0FBSyxLQUFLLENBQUNILE9BQU9DLGFBQWEsQ0FBQ0MsT0FBT0csWUFBWSxLQUNyRkgsT0FBT0csWUFBWSxHQUFHLEtBQUssQ0FBQ0wsT0FBT0MsYUFBYSxDQUFDQyxPQUFPSSxZQUFZLEtBQUtKLE9BQU9JLFlBQVksR0FBRyxLQUMvRixDQUFDTixPQUFPQyxhQUFhLENBQUNDLE9BQU9LLFFBQVEsS0FBS0wsT0FBT0ssUUFBUSxHQUFHLEtBQzVELENBQUNQLE9BQU9DLGFBQWEsQ0FBQ0MsT0FBT00sa0JBQWtCLEtBQUtOLE9BQU9NLGtCQUFrQixHQUFHLEtBQ2hGLENBQUNSLE9BQU9DLGFBQWEsQ0FBQ0MsT0FBT08saUJBQWlCLEtBQUtQLE9BQU9PLGlCQUFpQixHQUFHLEtBQzlFUCxPQUFPTyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7WUFBQztZQUFTO1lBQVM7U0FBUyxDQUFDZCxRQUFRLENBQUNPLE9BQU9RLElBQUksR0FBRztZQUN6RixNQUFNLElBQUk1QixVQUFVO1FBQ3RCO1FBQ0EsT0FBT29CO0lBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTVMsOEJBQThCLENBQ3pDQyxTQUFxQnRCLFVBQXdCQyxRQUNYSCwyQkFDbENMLG1CQUFtQjZCLFVBQ25CdEIsVUFBVUMsT0FBTyJ9
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { AppendChatEventInput } from './events.js';
|
|
2
|
+
import type { AuthorizedMembership, ChatIdentity, ChatQuery } from './membership.js';
|
|
3
|
+
export interface DurableChatAttachment {
|
|
4
|
+
readonly contentVersion: string;
|
|
5
|
+
readonly imageId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DurableChatMessage<TDecision = unknown> {
|
|
8
|
+
readonly _key: string;
|
|
9
|
+
readonly added: number;
|
|
10
|
+
readonly attachmentIds: readonly string[];
|
|
11
|
+
readonly attachments: readonly DurableChatAttachment[];
|
|
12
|
+
readonly chatSchemaVersion: 1;
|
|
13
|
+
readonly clientMessageId: string;
|
|
14
|
+
readonly content: string;
|
|
15
|
+
readonly contentRevision: number;
|
|
16
|
+
readonly conversationId: string;
|
|
17
|
+
readonly deleted: boolean;
|
|
18
|
+
readonly deletedAuthorProofId?: string;
|
|
19
|
+
readonly mobileContentVersion: string;
|
|
20
|
+
readonly mobileDecision: TDecision;
|
|
21
|
+
readonly mobilePlatformDisposition: string;
|
|
22
|
+
readonly modified: number;
|
|
23
|
+
readonly replyToMessageId?: string;
|
|
24
|
+
readonly revision: number;
|
|
25
|
+
readonly senderPersonaId: string;
|
|
26
|
+
readonly sequence: number;
|
|
27
|
+
readonly userId: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DurableSendMessageInput {
|
|
30
|
+
readonly attachmentIds: readonly string[];
|
|
31
|
+
readonly clientMessageId: string;
|
|
32
|
+
readonly content: string;
|
|
33
|
+
readonly conversationId: string;
|
|
34
|
+
readonly replyToMessageId?: string;
|
|
35
|
+
readonly senderPersonaId: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DurableEditMessageInput {
|
|
38
|
+
readonly content: string;
|
|
39
|
+
readonly conversationId: string;
|
|
40
|
+
readonly expectedRevision: number;
|
|
41
|
+
readonly idempotencyKey: string;
|
|
42
|
+
readonly messageId: string;
|
|
43
|
+
}
|
|
44
|
+
export type DurableDeleteMessageInput = Omit<DurableEditMessageInput, 'content'>;
|
|
45
|
+
export interface DurableMessageAcknowledgement {
|
|
46
|
+
readonly clientMessageId: string;
|
|
47
|
+
readonly messageId: string;
|
|
48
|
+
readonly revision: number;
|
|
49
|
+
readonly sequence: number;
|
|
50
|
+
}
|
|
51
|
+
export interface DurableMessageMutationResult {
|
|
52
|
+
readonly messageId: string;
|
|
53
|
+
readonly revision: number;
|
|
54
|
+
readonly sequence: number;
|
|
55
|
+
}
|
|
56
|
+
export interface DurableContentProjection<TDecision> {
|
|
57
|
+
readonly decision: TDecision;
|
|
58
|
+
readonly platformDisposition?: string;
|
|
59
|
+
}
|
|
60
|
+
export type DurableMessageRun = <T>(operation: (read: ChatQuery) => Promise<T>, write?: boolean) => Promise<T>;
|
|
61
|
+
export interface DurableMessageHooks<TDecision> {
|
|
62
|
+
readonly appendEvent: (read: ChatQuery, input: AppendChatEventInput) => Promise<unknown>;
|
|
63
|
+
readonly authorizeAttachment: (read: ChatQuery, imageId: string) => Promise<DurableChatAttachment>;
|
|
64
|
+
readonly authorizeIdentity: (read: ChatQuery, identity: ChatIdentity) => Promise<void>;
|
|
65
|
+
readonly authorizeMembership: (read: ChatQuery, identity: ChatIdentity, conversationId: string, purpose: 'history' | 'send') => Promise<AuthorizedMembership>;
|
|
66
|
+
readonly authorizeMessageVisible: (read: ChatQuery, identity: ChatIdentity, message: DurableChatMessage<TDecision>, membership: AuthorizedMembership) => Promise<void>;
|
|
67
|
+
readonly classifyContent: (input: {
|
|
68
|
+
readonly content: string;
|
|
69
|
+
readonly contentVersion: string;
|
|
70
|
+
}) => DurableContentProjection<TDecision> | Promise<DurableContentProjection<TDecision>>;
|
|
71
|
+
readonly hash?: (value: unknown) => string;
|
|
72
|
+
readonly identity: ChatIdentity;
|
|
73
|
+
readonly now?: () => number;
|
|
74
|
+
readonly run: DurableMessageRun;
|
|
75
|
+
readonly uuid?: () => string;
|
|
76
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { };
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvZHVyYWJsZUNoYXQvbWVzc2FnZVR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtBcHBlbmRDaGF0RXZlbnRJbnB1dH0gZnJvbSAnLi9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUge0F1dGhvcml6ZWRNZW1iZXJzaGlwLCBDaGF0SWRlbnRpdHksIENoYXRRdWVyeX0gZnJvbSAnLi9tZW1iZXJzaGlwLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlQ2hhdEF0dGFjaG1lbnQge1xuICByZWFkb25seSBjb250ZW50VmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZUNoYXRNZXNzYWdlPFREZWNpc2lvbiA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgX2tleTogc3RyaW5nO1xuICByZWFkb25seSBhZGRlZDogbnVtYmVyO1xuICByZWFkb25seSBhdHRhY2htZW50SWRzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYXR0YWNobWVudHM6IHJlYWRvbmx5IER1cmFibGVDaGF0QXR0YWNobWVudFtdO1xuICByZWFkb25seSBjaGF0U2NoZW1hVmVyc2lvbjogMTtcbiAgcmVhZG9ubHkgY2xpZW50TWVzc2FnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudFJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlbGV0ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRlbGV0ZWRBdXRob3JQcm9vZklkPzogc3RyaW5nO1xuICByZWFkb25seSBtb2JpbGVDb250ZW50VmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBtb2JpbGVEZWNpc2lvbjogVERlY2lzaW9uO1xuICByZWFkb25seSBtb2JpbGVQbGF0Zm9ybURpc3Bvc2l0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGlmaWVkOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJlcGx5VG9NZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlbmRlclBlcnNvbmFJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXF1ZW5jZTogbnVtYmVyO1xuICByZWFkb25seSB1c2VySWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlU2VuZE1lc3NhZ2VJbnB1dCB7XG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRJZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBjbGllbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICByZWFkb25seSBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSByZXBseVRvTWVzc2FnZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBzZW5kZXJQZXJzb25hSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlRWRpdE1lc3NhZ2VJbnB1dCB7XG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRHVyYWJsZURlbGV0ZU1lc3NhZ2VJbnB1dCA9IE9taXQ8RHVyYWJsZUVkaXRNZXNzYWdlSW5wdXQsICdjb250ZW50Jz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZU1lc3NhZ2VBY2tub3dsZWRnZW1lbnQge1xuICByZWFkb25seSBjbGllbnRNZXNzYWdlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZU1lc3NhZ2VNdXRhdGlvblJlc3VsdCB7XG4gIHJlYWRvbmx5IG1lc3NhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSByZXZpc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBzZXF1ZW5jZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER1cmFibGVDb250ZW50UHJvamVjdGlvbjxURGVjaXNpb24+IHtcbiAgcmVhZG9ubHkgZGVjaXNpb246IFREZWNpc2lvbjtcbiAgcmVhZG9ubHkgcGxhdGZvcm1EaXNwb3NpdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRHVyYWJsZU1lc3NhZ2VSdW4gPSA8VD4ob3BlcmF0aW9uOiAocmVhZDogQ2hhdFF1ZXJ5KSA9PiBQcm9taXNlPFQ+LCB3cml0ZT86IGJvb2xlYW4pID0+IFByb21pc2U8VD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHVyYWJsZU1lc3NhZ2VIb29rczxURGVjaXNpb24+IHtcbiAgcmVhZG9ubHkgYXBwZW5kRXZlbnQ6IChyZWFkOiBDaGF0UXVlcnksIGlucHV0OiBBcHBlbmRDaGF0RXZlbnRJbnB1dCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZG9ubHkgYXV0aG9yaXplQXR0YWNobWVudDogKHJlYWQ6IENoYXRRdWVyeSwgaW1hZ2VJZDogc3RyaW5nKSA9PiBQcm9taXNlPER1cmFibGVDaGF0QXR0YWNobWVudD47XG4gIHJlYWRvbmx5IGF1dGhvcml6ZUlkZW50aXR5OiAocmVhZDogQ2hhdFF1ZXJ5LCBpZGVudGl0eTogQ2hhdElkZW50aXR5KSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBhdXRob3JpemVNZW1iZXJzaGlwOiAoXG4gICAgcmVhZDogQ2hhdFF1ZXJ5LCBpZGVudGl0eTogQ2hhdElkZW50aXR5LCBjb252ZXJzYXRpb25JZDogc3RyaW5nLCBwdXJwb3NlOiAnaGlzdG9yeScgfCAnc2VuZCdcbiAgKSA9PiBQcm9taXNlPEF1dGhvcml6ZWRNZW1iZXJzaGlwPjtcbiAgcmVhZG9ubHkgYXV0aG9yaXplTWVzc2FnZVZpc2libGU6IChcbiAgICByZWFkOiBDaGF0UXVlcnksIGlkZW50aXR5OiBDaGF0SWRlbnRpdHksIG1lc3NhZ2U6IER1cmFibGVDaGF0TWVzc2FnZTxURGVjaXNpb24+LCBtZW1iZXJzaGlwOiBBdXRob3JpemVkTWVtYmVyc2hpcFxuICApID0+IFByb21pc2U8dm9pZD47XG4gIHJlYWRvbmx5IGNsYXNzaWZ5Q29udGVudDogKGlucHV0OiB7XG4gICAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNvbnRlbnRWZXJzaW9uOiBzdHJpbmc7XG4gIH0pID0+IER1cmFibGVDb250ZW50UHJvamVjdGlvbjxURGVjaXNpb24+IHwgUHJvbWlzZTxEdXJhYmxlQ29udGVudFByb2plY3Rpb248VERlY2lzaW9uPj47XG4gIHJlYWRvbmx5IGhhc2g/OiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbnRpdHk6IENoYXRJZGVudGl0eTtcbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICByZWFkb25seSBydW46IER1cmFibGVNZXNzYWdlUnVuO1xuICByZWFkb25seSB1dWlkPzogKCkgPT4gc3RyaW5nO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXNFQSxXQW1CQyJ9
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChatQuery } from './membership.js';
|
|
2
|
+
import type { DurableChatMessage, DurableDeleteMessageInput, DurableEditMessageInput, DurableMessageAcknowledgement, DurableMessageHooks, DurableMessageMutationResult, DurableSendMessageInput } from './messageTypes.js';
|
|
3
|
+
export declare const readDurableMessage: <TDecision>(read: ChatQuery, conversationId: string, messageId: string) => Promise<DurableChatMessage<TDecision>>;
|
|
4
|
+
export declare const createDurableMessagePersistence: <TDecision>(hooks: DurableMessageHooks<TDecision>) => {
|
|
5
|
+
authorize: (read: ChatQuery, conversationId: string, purpose?: 'history' | 'send') => Promise<import("./membership.js").AuthorizedMembership>;
|
|
6
|
+
deleteMessage: (input: DurableDeleteMessageInput) => Promise<DurableMessageMutationResult>;
|
|
7
|
+
editMessage: (input: DurableEditMessageInput) => Promise<DurableMessageMutationResult>;
|
|
8
|
+
rateLimit: (read: ChatQuery, action: string, limit: number, interval?: number) => Promise<void>;
|
|
9
|
+
receipt: <T>(read: ChatQuery, action: string, conversationId: string, key: string, payload: unknown) => Promise<{
|
|
10
|
+
prior: T;
|
|
11
|
+
save: (result: T) => Promise<boolean>;
|
|
12
|
+
}>;
|
|
13
|
+
run: <T>(operation: (read: ChatQuery) => Promise<T>, write?: boolean) => Promise<T>;
|
|
14
|
+
sendMessage: (input: DurableSendMessageInput) => Promise<DurableMessageAcknowledgement>;
|
|
15
|
+
};
|
|
16
|
+
export type DurableMessagePersistence<TDecision = unknown> = ReturnType<typeof createDurableMessagePersistence<TDecision>>;
|