@devvit/public-api 0.11.0-next-2024-07-30-2398bf2d4.0 → 0.11.0-next-2024-07-30-31a79f431.0
Sign up to get free protection for your applications and to get access to all the features.
- package/apis/redis/RedisClient.js +2 -2
- package/devvit/internals/blocks/handler/BlocksHandler.d.ts.map +1 -1
- package/devvit/internals/blocks/handler/BlocksHandler.js +7 -0
- package/devvit/internals/blocks/handler/useAsync.d.ts +11 -0
- package/devvit/internals/blocks/handler/useAsync.d.ts.map +1 -1
- package/devvit/internals/blocks/handler/useAsync.js +21 -9
- package/devvit/internals/blocks/handler/useState.d.ts.map +1 -1
- package/devvit/internals/blocks/handler/useState.js +6 -2
- package/devvit/internals/context.js +1 -1
- package/meta.json +162 -140
- package/meta.min.json +106 -84
- package/package.json +9 -9
- package/public-api.d.ts +750 -0
- package/public-api.iife.js +964 -1339
- package/public-api.min.js +5 -5
- package/public-api.min.js.map +4 -4
- package/types/redis.d.ts +750 -0
- package/types/redis.d.ts.map +1 -1
- package/version.json +2 -2
@@ -292,7 +292,7 @@ export class RedisClient {
|
|
292
292
|
}
|
293
293
|
async get(key) {
|
294
294
|
const response = await this.storage.Get({ key, scope: this.scope }, __classPrivateFieldGet(this, _RedisClient_metadata, "f"));
|
295
|
-
return response !== null ? response.value ?? undefined : response;
|
295
|
+
return response !== null ? (response.value ?? undefined) : response;
|
296
296
|
}
|
297
297
|
async set(key, value, options) {
|
298
298
|
let expiration;
|
@@ -422,7 +422,7 @@ export class RedisClient {
|
|
422
422
|
}
|
423
423
|
async hGet(key, field) {
|
424
424
|
const response = await this.storage.HGet({ key, field, scope: this.scope }, __classPrivateFieldGet(this, _RedisClient_metadata, "f"));
|
425
|
-
return response !== null ? response.value ?? undefined : response;
|
425
|
+
return response !== null ? (response.value ?? undefined) : response;
|
426
426
|
}
|
427
427
|
async hset(key, fieldValues) {
|
428
428
|
return this.hSet(key, fieldValues);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BlocksHandler.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/BlocksHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAK7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAgB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAe,IAAI,EAAE,UAAU,EAAE,WAAW,EAAS,MAAM,YAAY,CAAC;
|
1
|
+
{"version":3,"file":"BlocksHandler.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/BlocksHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAK7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAgB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAe,IAAI,EAAE,UAAU,EAAE,WAAW,EAAS,MAAM,YAAY,CAAC;AAIpF;;;;;;GAMG;AACH,eAAO,IAAI,oBAAoB,EAAE,aAAa,GAAG,IAAW,CAAC;AAE7D,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CASxD;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,IAAI,EACzC,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,CAAC,GAChC,CAAC,CAkCH;AAED,eAAO,IAAI,oBAAoB,EAAE,aAAa,GAAG,IAAW,CAAC;AAE7D;;;;GAIG;AACH,qBAAa,aAAa;;IAMxB,oBAAoB,EAAE,aAAa,GAAG,IAAI,CAAQ;gBAEtC,IAAI,EAAE,GAAG,CAAC,iBAAiB;IAMjC,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;CAgX1E"}
|
@@ -14,6 +14,7 @@ import { BlocksTransformer } from '../BlocksTransformer.js';
|
|
14
14
|
import { ContextBuilder } from './ContextBuilder.js';
|
15
15
|
import { _isTombstone, RenderContext } from './RenderContext.js';
|
16
16
|
import { RenderInterruptError } from './types.js';
|
17
|
+
import { isCircuitBreaker } from '@devvit/shared-types/CircuitBreaker.js';
|
17
18
|
/**
|
18
19
|
* This can be a global/singleton because render is synchronous.
|
19
20
|
*
|
@@ -168,6 +169,12 @@ export class BlocksHandler {
|
|
168
169
|
}
|
169
170
|
}
|
170
171
|
catch (e) {
|
172
|
+
/**
|
173
|
+
* Guard clause, retries are only applicable for circuit breakers. If we're not a circuit breaker, we need to throw the error.
|
174
|
+
*/
|
175
|
+
if (!isCircuitBreaker(e)) {
|
176
|
+
throw e;
|
177
|
+
}
|
171
178
|
if (__classPrivateFieldGet(this, _BlocksHandler_instances, "a", _BlocksHandler_debug_get))
|
172
179
|
console.debug('[blocks] caught in handler', e);
|
173
180
|
context._latestRenderContent = undefined;
|
@@ -7,6 +7,17 @@ export type AsyncOptions = {
|
|
7
7
|
depends?: JSONValue;
|
8
8
|
};
|
9
9
|
export type LoadState = 'initial' | 'loading' | 'loaded' | 'error' | 'disabled';
|
10
|
+
/**
|
11
|
+
* This tries to save an error into the state. If the error is a circuit breaker, it will throw the error instead,
|
12
|
+
* as those errors are not meant to be saved in state.
|
13
|
+
*
|
14
|
+
* @param e -- an original error type
|
15
|
+
* @returns A JSONValue that can be saved in states
|
16
|
+
*/
|
17
|
+
export declare function toSerializableErrorOrCircuitBreak(e: unknown): {
|
18
|
+
message: string;
|
19
|
+
details: string;
|
20
|
+
};
|
10
21
|
/**
|
11
22
|
* This is the preferred way to handle async state in Devvit.
|
12
23
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useAsync.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/useAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
1
|
+
{"version":3,"file":"useAsync.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/useAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAS3F,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhF;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,CAAC,EAAE,OAAO,GAAG;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAUA;AAkGD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAC1C,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE,YAAiB,GACzB,cAAc,CAAC,CAAC,CAAC,CAUnB"}
|
@@ -13,6 +13,26 @@ var _AsyncHook_debug, _AsyncHook_hookId, _AsyncHook_initializer, _AsyncHook_inva
|
|
13
13
|
import { CIRCUIT_BREAKER_MSG } from '@devvit/shared-types/CircuitBreaker.js';
|
14
14
|
import isEqual from 'lodash.isequal';
|
15
15
|
import { registerHook } from './BlocksHandler.js';
|
16
|
+
import { StringUtil } from '@devvit/shared-types/StringUtil.js';
|
17
|
+
/**
|
18
|
+
* This tries to save an error into the state. If the error is a circuit breaker, it will throw the error instead,
|
19
|
+
* as those errors are not meant to be saved in state.
|
20
|
+
*
|
21
|
+
* @param e -- an original error type
|
22
|
+
* @returns A JSONValue that can be saved in states
|
23
|
+
*/
|
24
|
+
export function toSerializableErrorOrCircuitBreak(e) {
|
25
|
+
// This is a little side-effecty, so open to suggestions on how to improve.
|
26
|
+
if (e instanceof Error) {
|
27
|
+
if (e.message === CIRCUIT_BREAKER_MSG) {
|
28
|
+
throw e;
|
29
|
+
}
|
30
|
+
return { message: e.message, details: e.stack ?? '' };
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
return { message: 'Unknown error', details: StringUtil.caughtToString(e) };
|
34
|
+
}
|
35
|
+
}
|
16
36
|
class AsyncHook {
|
17
37
|
constructor(initializer, options, params) {
|
18
38
|
_AsyncHook_debug.set(this, void 0);
|
@@ -73,15 +93,7 @@ class AsyncHook {
|
|
73
93
|
};
|
74
94
|
}
|
75
95
|
catch (e) {
|
76
|
-
|
77
|
-
if (e.message === CIRCUIT_BREAKER_MSG) {
|
78
|
-
throw e;
|
79
|
-
}
|
80
|
-
asyncResponse.error = { message: e.message, details: e.stack ?? '' };
|
81
|
-
}
|
82
|
-
else {
|
83
|
-
asyncResponse.error = { message: 'Unknown error', details: String(e) };
|
84
|
-
}
|
96
|
+
asyncResponse.error = toSerializableErrorOrCircuitBreak(e);
|
85
97
|
}
|
86
98
|
const requeueEvent = {
|
87
99
|
asyncResponse: asyncResponse,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useState.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/useState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAEV,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;
|
1
|
+
{"version":3,"file":"useState.d.ts","sourceRoot":"","sources":["../../../../../src/devvit/internals/blocks/handler/useState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAEV,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAC;AA2GpC,wBAAgB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AAC9F,wBAAgB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAC5F,wBAAgB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAC5F,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAC1C,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACnC,cAAc,CAAC,CAAC,CAAC,CAAC"}
|
@@ -12,12 +12,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
12
12
|
var _UseStateHook_changed, _UseStateHook_ctx, _UseStateHook_initializer, _UseStateHook_hookId, _UseStateHook_promise;
|
13
13
|
import { registerHook } from './BlocksHandler.js';
|
14
14
|
import { RenderInterruptError } from './types.js';
|
15
|
+
import { toSerializableErrorOrCircuitBreak } from './useAsync.js';
|
15
16
|
/**
|
16
17
|
* Implementation of the useState hook.
|
17
18
|
*/
|
18
19
|
class UseStateHook {
|
19
20
|
constructor(initializer, params) {
|
20
|
-
this.state = { value: null, load_state: 'initial' };
|
21
|
+
this.state = { value: null, load_state: 'initial', error: null };
|
21
22
|
_UseStateHook_changed.set(this, void 0);
|
22
23
|
_UseStateHook_ctx.set(this, void 0);
|
23
24
|
_UseStateHook_initializer.set(this, void 0);
|
@@ -46,7 +47,7 @@ class UseStateHook {
|
|
46
47
|
}
|
47
48
|
catch (e) {
|
48
49
|
this.state.load_state = 'error';
|
49
|
-
|
50
|
+
this.state.error = toSerializableErrorOrCircuitBreak(e);
|
50
51
|
}
|
51
52
|
__classPrivateFieldGet(this, _UseStateHook_changed, "f").call(this);
|
52
53
|
}
|
@@ -73,6 +74,9 @@ class UseStateHook {
|
|
73
74
|
if (this.state.load_state === 'loading') {
|
74
75
|
throw new RenderInterruptError();
|
75
76
|
}
|
77
|
+
if (this.state.load_state === 'error') {
|
78
|
+
throw new Error(this.state.error?.message ?? 'Unknown error');
|
79
|
+
}
|
76
80
|
if (this.state.load_state === 'initial') {
|
77
81
|
let initialValue;
|
78
82
|
try {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Header } from '@devvit/shared-types/Header.js';
|
2
2
|
import { assertNonNull } from '@devvit/shared-types/NonNull.js';
|
3
|
-
import pkg from '../../version.json'
|
3
|
+
import pkg from '../../version.json' with { type: 'json' };
|
4
4
|
export function getContextFromMetadata(metadata, postId, commentId) {
|
5
5
|
const subredditId = metadata[Header.Subreddit]?.values[0];
|
6
6
|
assertNonNull(subredditId, 'subreddit is missing from Context');
|