@mpgd/adapter-devvit 0.4.0 → 0.6.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.
@@ -0,0 +1,3 @@
1
+ export * from './post-operation.js';
2
+ export * from './redis-post-operation-store.js';
3
+ export * from './redis-verified-leaderboard.js';
@@ -0,0 +1,3 @@
1
+ export * from './post-operation.js';
2
+ export * from './redis-post-operation-store.js';
3
+ export * from './redis-verified-leaderboard.js';
@@ -0,0 +1,135 @@
1
+ declare const operationSchemaVersion: 1;
2
+ export type DevvitJsonValue = null | boolean | number | string | readonly DevvitJsonValue[] | DevvitJsonObject;
3
+ export interface DevvitJsonObject {
4
+ readonly [key: string]: DevvitJsonValue;
5
+ }
6
+ export interface DevvitDurableOperationStore {
7
+ /** Reads one durable value. Missing values return undefined. */
8
+ read(key: string): Promise<string | undefined>;
9
+ /** Atomically creates a value only when the key is absent. */
10
+ create(key: string, value: string): Promise<boolean>;
11
+ /** Atomically replaces a value only when its raw current value matches. */
12
+ compareAndSet(key: string, expectedValue: string, nextValue: string): Promise<boolean>;
13
+ /** Atomically creates an expiring reconciliation lease. */
14
+ createLease(key: string, token: string, expiresAt: Date): Promise<boolean>;
15
+ /** Deletes a lease only when the current token matches. */
16
+ releaseLease(key: string, token: string): Promise<void>;
17
+ }
18
+ export interface DevvitPostOperationScope {
19
+ readonly appScope: string;
20
+ /** Use the canonical subreddit identifier, not a display name. */
21
+ readonly subredditId: string;
22
+ }
23
+ export interface DevvitPostLaunch<TParams extends DevvitJsonObject> {
24
+ readonly entry: string;
25
+ readonly params: TParams;
26
+ }
27
+ export interface DevvitCanonicalPostData<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> extends DevvitJsonObject {
28
+ readonly mpgd: {
29
+ readonly schemaVersion: typeof operationSchemaVersion;
30
+ readonly appScope: string;
31
+ readonly subredditId: string;
32
+ readonly operationType: string;
33
+ readonly operationId: string;
34
+ };
35
+ readonly launch: {
36
+ readonly schemaVersion: typeof operationSchemaVersion;
37
+ readonly entry: string;
38
+ readonly params: TLaunchParams;
39
+ };
40
+ readonly payload: TPayload;
41
+ }
42
+ export interface DevvitPostOperationDefinition<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> {
43
+ readonly operationType: string;
44
+ readonly parsePayload: (input: unknown) => TPayload;
45
+ readonly parseLaunchParams: (input: unknown) => TLaunchParams;
46
+ readonly maxPostDataBytes?: number;
47
+ }
48
+ export interface DevvitPostOperationDescriptorInput<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> {
49
+ readonly scope: DevvitPostOperationScope;
50
+ /** Must be stable across process restarts and retries. */
51
+ readonly operationId: string;
52
+ readonly payload: TPayload;
53
+ readonly launch: DevvitPostLaunch<TLaunchParams>;
54
+ }
55
+ export interface DevvitPostPublishInput<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> {
56
+ readonly scope: DevvitPostOperationScope;
57
+ readonly operationId: string;
58
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
59
+ }
60
+ export interface DevvitPostPublishReceipt {
61
+ readonly postId: string;
62
+ }
63
+ export interface DevvitPostReconciliationCandidate {
64
+ readonly postId: string;
65
+ readonly postData: unknown;
66
+ }
67
+ export type DevvitPostReconciliationReason = 'submission-attempted' | 'submit-outcome-unknown' | 'invalid-publish-receipt' | 'receipt-write-failed' | 'match-not-found' | 'invalid-reconciliation-candidate' | 'reconciliation-failed';
68
+ export type DevvitPostOperationResult<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> = {
69
+ readonly status: 'missing';
70
+ readonly operationId: string;
71
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
72
+ } | {
73
+ readonly status: 'prepared';
74
+ readonly operationId: string;
75
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
76
+ } | {
77
+ readonly status: 'created' | 'existing' | 'recovered';
78
+ readonly operationId: string;
79
+ readonly postId: string;
80
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
81
+ } | {
82
+ readonly status: 'reconciliation-required';
83
+ readonly operationId: string;
84
+ readonly reason: DevvitPostReconciliationReason;
85
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
86
+ } | {
87
+ readonly status: 'busy';
88
+ readonly operationId: string;
89
+ readonly reason: 'store-contention' | 'reconciliation-lease-held';
90
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
91
+ } | {
92
+ readonly status: 'conflict';
93
+ readonly operationId: string;
94
+ readonly reason: 'descriptor-mismatch';
95
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
96
+ } | {
97
+ readonly status: 'terminal-unresolved';
98
+ readonly operationId: string;
99
+ readonly reason: 'multiple-exact-matches' | 'published-receipt-conflict';
100
+ readonly postIds: readonly string[];
101
+ readonly postData: DevvitCanonicalPostData<TPayload, TLaunchParams>;
102
+ };
103
+ export interface ExecuteDevvitPostOperationInput<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> extends DevvitPostOperationDescriptorInput<TPayload, TLaunchParams> {
104
+ readonly publish: (input: DevvitPostPublishInput<TPayload, TLaunchParams>) => Promise<DevvitPostPublishReceipt>;
105
+ }
106
+ export interface ReconcileDevvitPostOperationInput<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> extends DevvitPostOperationDescriptorInput<TPayload, TLaunchParams> {
107
+ readonly findCandidates: (input: DevvitPostPublishInput<TPayload, TLaunchParams>) => Promise<readonly DevvitPostReconciliationCandidate[]>;
108
+ }
109
+ export interface DevvitPostOperationCoordinator<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> {
110
+ execute(input: ExecuteDevvitPostOperationInput<TPayload, TLaunchParams>): Promise<DevvitPostOperationResult<TPayload, TLaunchParams>>;
111
+ read(input: DevvitPostOperationDescriptorInput<TPayload, TLaunchParams>): Promise<DevvitPostOperationResult<TPayload, TLaunchParams>>;
112
+ reconcile(input: ReconcileDevvitPostOperationInput<TPayload, TLaunchParams>): Promise<DevvitPostOperationResult<TPayload, TLaunchParams>>;
113
+ }
114
+ export interface CreateDevvitPostOperationCoordinatorOptions<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject> {
115
+ readonly definition: DevvitPostOperationDefinition<TPayload, TLaunchParams>;
116
+ readonly store: DevvitDurableOperationStore;
117
+ readonly now?: () => number;
118
+ readonly createToken?: () => string;
119
+ readonly leaseTtlMs?: number;
120
+ readonly storeAttempts?: number;
121
+ }
122
+ export declare class DevvitPostOperationValidationError extends TypeError {
123
+ constructor(message: string, options?: ErrorOptions);
124
+ }
125
+ export declare class DevvitPostOperationStateError extends Error {
126
+ constructor(message: string, options?: ErrorOptions);
127
+ }
128
+ export declare function defineDevvitPostOperation<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject>(definition: DevvitPostOperationDefinition<TPayload, TLaunchParams>): DevvitPostOperationDefinition<TPayload, TLaunchParams>;
129
+ export declare function createDevvitPostOperationCoordinator<TPayload extends DevvitJsonObject, TLaunchParams extends DevvitJsonObject>(input: CreateDevvitPostOperationCoordinatorOptions<TPayload, TLaunchParams>): DevvitPostOperationCoordinator<TPayload, TLaunchParams>;
130
+ export declare function createDevvitPostOperationKey(input: {
131
+ readonly scope: DevvitPostOperationScope;
132
+ readonly operationType: string;
133
+ readonly operationId: string;
134
+ }): string;
135
+ export {};