@devvit/public-api 0.11.0-next-2024-07-30-8f65a4fa6.0 → 0.11.0-next-2024-07-30-0415fdb14.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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;AAGpF;;;;;;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;CAyW1E"}
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;AAQ3F,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;AAyGhF;;;;;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"}
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
- if (e instanceof Error) {
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;AAoGpC,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"}
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
- console.error('Error loading async state: ', e);
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' assert { type: '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');