@notionhq/custom-blocks-host 0.1.30 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"initializationController.d.ts","sourceRoot":"","sources":["../../src/lifecycle/initializationController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"initializationController.d.ts","sourceRoot":"","sources":["../../src/lifecycle/initializationController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EACX,wBAAwB,EACxB,WAAW,EACX,MAAM,mDAAmD,CAAA;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAIlE,OAAO,KAAK,EACX,qBAAqB,EACrB,iCAAiC,EACjC,UAAU,EACV,MAAM,YAAY,CAAA;AAMnB,MAAM,MAAM,+BAA+B,GAAG;IAC7C,WAAW,EAAE,CACZ,OAAO,EAAE,qBAAqB,KAC1B,OAAO,CAAC,iCAAiC,CAAC,CAAA;IAC/C,eAAe,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IAC/C,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAChC,4BAA4B,EAAE,MAAM,IAAI,CAAA;IACxC,wBAAwB,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAA;IAC5D,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACnD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAChD,gBAAgB,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACtD,oBAAoB,EAAE,CAAC,IAAI,EAAE;QAC5B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;QACpC,KAAK,EAAE,wBAAwB,CAAA;QAC/B,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAA;KACzC,KAAK,SAAS,GAAG,MAAM,CAAA;IACxB,uBAAuB,EAAE,CAAC,IAAI,EAAE;QAC/B,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;QACpC,KAAK,EAAE,wBAAwB,CAAA;KAC/B,KAAK,IAAI,CAAA;IACV,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,IAAI,CAAA;CAChB,CAAA;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,+BAA+B,GACtC,wBAAwB,CAiU1B"}
@@ -1,11 +1,15 @@
1
+ import { DEFAULT_CONTRAST_MODE } from "../protocol/contrast.js";
2
+ import { unreachable } from "../utils.js";
1
3
  import { initErrorForFailureReason } from "./initErrors.js";
2
4
  import { isValidBridgeProtocolVersion } from "./protocolVersion.js";
3
5
  const DEFAULT_NO_CONNECT_TIMEOUT_MS = 5_000;
6
+ const DEFAULT_INITIAL_STATE_TIMEOUT_MS = 5_000;
4
7
  const DEFAULT_NO_INIT_RESULT_TIMEOUT_MS = 5_000;
5
8
  export function createInitializationController(options) {
6
- const { blockId, getState, prepareInit, post, warn, flushPendingHostStateChanges, minBridgeProtocolVersion, noConnectTimeoutMs = DEFAULT_NO_CONNECT_TIMEOUT_MS, noInitResultTimeoutMs = DEFAULT_NO_INIT_RESULT_TIMEOUT_MS, stopHostWithFailure, onInitResult, onFailure, } = options;
9
+ const { prepareInit, sendInitMessage, warn, flushPendingHostStateChanges, minBridgeProtocolVersion, noConnectTimeoutMs = DEFAULT_NO_CONNECT_TIMEOUT_MS, initialStateTimeoutMs = DEFAULT_INITIAL_STATE_TIMEOUT_MS, noInitResultTimeoutMs = DEFAULT_NO_INIT_RESULT_TIMEOUT_MS, stopHostWithFailure, onInitResult, onFailure, } = options;
7
10
  let initStatus = "waitingForConnect";
8
11
  let noConnectTimeoutId;
12
+ let initialStateTimeoutId;
9
13
  let noInitResultTimeoutId;
10
14
  let activeInitializationId;
11
15
  let hasObservedIframeLoad = false;
@@ -16,6 +20,12 @@ export function createInitializationController(options) {
16
20
  noConnectTimeoutId = undefined;
17
21
  }
18
22
  }
23
+ function clearInitialStateTimeout() {
24
+ if (initialStateTimeoutId !== undefined) {
25
+ window.clearTimeout(initialStateTimeoutId);
26
+ initialStateTimeoutId = undefined;
27
+ }
28
+ }
19
29
  function clearNoInitResultTimeout() {
20
30
  if (noInitResultTimeoutId !== undefined) {
21
31
  window.clearTimeout(noInitResultTimeoutId);
@@ -24,13 +34,23 @@ export function createInitializationController(options) {
24
34
  }
25
35
  function sendInitError(args) {
26
36
  const { initializationId, error } = args;
27
- if (initStatus !== "waitingForConnect") {
28
- return;
37
+ switch (initStatus) {
38
+ case "waitingForConnect":
39
+ case "preparingInit":
40
+ break;
41
+ case "waitingForInitResult":
42
+ case "initialized":
43
+ case "error":
44
+ case "stopped":
45
+ return;
46
+ default:
47
+ return unreachable(initStatus);
29
48
  }
30
49
  initStatus = "error";
31
50
  activeInitializationId = initializationId;
32
51
  clearNoConnectTimeout();
33
- post({
52
+ clearInitialStateTimeout();
53
+ sendInitMessage({
34
54
  type: "init",
35
55
  initializationId,
36
56
  status: "error",
@@ -38,49 +58,78 @@ export function createInitializationController(options) {
38
58
  });
39
59
  onFailure?.(error);
40
60
  }
41
- function sendInit(connect) {
61
+ async function prepareAndSendInit(connect) {
42
62
  if (initStatus !== "waitingForConnect") {
43
- return false;
63
+ return;
44
64
  }
45
- const preparation = prepareInit(connect);
46
- if (preparation.status === "error") {
47
- sendInitError({
65
+ initStatus = "preparingInit";
66
+ activeInitializationId = connect.initializationId;
67
+ clearNoConnectTimeout();
68
+ initialStateTimeoutId = window.setTimeout(() => {
69
+ if (initStatus !== "preparingInit") {
70
+ return;
71
+ }
72
+ const error = initErrorForFailureReason("initial_state_timeout");
73
+ warn({
74
+ ...error,
48
75
  initializationId: connect.initializationId,
49
- error: preparation.error,
50
76
  });
51
- return false;
77
+ sendInitError({ initializationId: connect.initializationId, error });
78
+ }, initialStateTimeoutMs);
79
+ try {
80
+ const preparation = await prepareInit(connect);
81
+ if (initStatus !== "preparingInit") {
82
+ return;
83
+ }
84
+ clearInitialStateTimeout();
85
+ if (preparation.status === "error") {
86
+ sendInitError({
87
+ initializationId: connect.initializationId,
88
+ error: preparation.error,
89
+ });
90
+ return;
91
+ }
92
+ initStatus = "waitingForInitResult";
93
+ const message = {
94
+ type: "init",
95
+ initializationId: connect.initializationId,
96
+ status: "success",
97
+ theme: preparation.initialState.theme,
98
+ contrastMode: preparation.initialState.contrastMode ?? DEFAULT_CONTRAST_MODE,
99
+ blockId: preparation.initialState.blockId,
100
+ parent: preparation.initialState.parent,
101
+ page: preparation.initialState.page,
102
+ currentUser: preparation.initialState.currentUser,
103
+ manifest: preparation.initialState.manifest,
104
+ dataSources: preparation.initialState.dataSources,
105
+ };
106
+ sendInitMessage(message);
107
+ noInitResultTimeoutId = window.setTimeout(() => {
108
+ if (initStatus !== "waitingForInitResult") {
109
+ return;
110
+ }
111
+ initStatus = "error";
112
+ const error = initErrorForFailureReason("no_init_result");
113
+ onFailure?.(error);
114
+ warn({
115
+ ...error,
116
+ initializationId: connect.initializationId,
117
+ });
118
+ }, noInitResultTimeoutMs);
52
119
  }
53
- initStatus = "waitingForInitResult";
54
- activeInitializationId = connect.initializationId;
55
- clearNoConnectTimeout();
56
- const state = getState();
57
- const message = {
58
- type: "init",
59
- initializationId: connect.initializationId,
60
- status: "success",
61
- theme: state.theme,
62
- contrastMode: state.contrastMode,
63
- blockId,
64
- parent: state.parent,
65
- page: state.page,
66
- manifest: preparation.manifest,
67
- dataSources: preparation.dataSources,
68
- currentUser: state.currentUser,
69
- };
70
- post(message);
71
- noInitResultTimeoutId = window.setTimeout(() => {
72
- if (initStatus !== "waitingForInitResult") {
120
+ catch (error) {
121
+ if (initStatus !== "preparingInit") {
73
122
  return;
74
123
  }
75
- initStatus = "error";
76
- const error = initErrorForFailureReason("no_init_result");
77
124
  warn({
78
- message: "Sandbox did not send initResult",
125
+ message: "Failed to prepare custom block initialization",
126
+ error,
127
+ });
128
+ sendInitError({
79
129
  initializationId: connect.initializationId,
130
+ error: initErrorForFailureReason("unknown_error"),
80
131
  });
81
- onFailure?.(error);
82
- }, noInitResultTimeoutMs);
83
- return true;
132
+ }
84
133
  }
85
134
  function handleConnect(message) {
86
135
  if (initStatus === "stopped") {
@@ -119,9 +168,8 @@ export function createInitializationController(options) {
119
168
  });
120
169
  return;
121
170
  }
122
- if (sendInit(message)) {
123
- hasConnectedSandbox = true;
124
- }
171
+ hasConnectedSandbox = true;
172
+ void prepareAndSendInit(message);
125
173
  }
126
174
  function handleInvalidConnect(args) {
127
175
  if (initStatus === "stopped") {
@@ -203,12 +251,11 @@ export function createInitializationController(options) {
203
251
  return;
204
252
  }
205
253
  clearNoInitResultTimeout();
254
+ initStatus = message.status === "success" ? "initialized" : "error";
206
255
  if (message.status === "success") {
207
- initStatus = "success";
208
256
  flushPendingHostStateChanges();
209
257
  }
210
258
  else {
211
- initStatus = "error";
212
259
  onFailure?.(message.error);
213
260
  }
214
261
  onInitResult?.(message);
@@ -216,6 +263,7 @@ export function createInitializationController(options) {
216
263
  function stop() {
217
264
  initStatus = "stopped";
218
265
  clearNoConnectTimeout();
266
+ clearInitialStateTimeout();
219
267
  clearNoInitResultTimeout();
220
268
  }
221
269
  return {
@@ -3,6 +3,7 @@ import type { NotionDataSourceBindings } from "../protocol/dataSources/dataSourc
3
3
  import type { NotionBlockId } from "../protocol/ids.js";
4
4
  import type { CustomBlockManifest } from "../protocol/manifest.js";
5
5
  import type { ConnectMessage } from "../protocol/messages/connect.js";
6
+ import type { CustomBlockInitErrorInfo } from "../protocol/messages/init.js";
6
7
  import type { CustomBlockPage } from "../protocol/pages/page.js";
7
8
  import type { NotionParent } from "../protocol/parent.js";
8
9
  import type { NotionTheme } from "../protocol/theme.js";
@@ -14,10 +15,12 @@ export type ConnectSuccessMessage = Extract<ConnectMessage, {
14
15
  export type InitStatus =
15
16
  /** The host is waiting for the sandbox's first `connect` message. */
16
17
  "waitingForConnect"
18
+ /** The host is waiting for `getInitialState` to prepare `init`. */
19
+ | "preparingInit"
17
20
  /** The host is waiting for a matching `initResult` after it sends `init`. */
18
21
  | "waitingForInitResult"
19
22
  /** The host is initialized and can send live updates. */
20
- | "success"
23
+ | "initialized"
21
24
  /** The host is in an error state after an initialization failure or timeout. */
22
25
  | "error"
23
26
  /** The host is stopped and no longer sends or accepts sandbox messages. */
@@ -25,7 +28,6 @@ export type InitStatus =
25
28
  export type CustomBlockHostDataSourcesPayload = {
26
29
  bindings: NotionDataSourceBindings;
27
30
  };
28
- export type CustomBlockHostInitialDataSources = CustomBlockHostDataSourcesPayload | ((connect: ConnectSuccessMessage) => CustomBlockHostDataSourcesPayload);
29
31
  export type CustomBlockHostInitialState = {
30
32
  theme: NotionTheme;
31
33
  /**
@@ -36,12 +38,16 @@ export type CustomBlockHostInitialState = {
36
38
  blockId: NotionBlockId;
37
39
  parent: NotionParent;
38
40
  page: CustomBlockPage;
39
- /**
40
- * The host's persisted manifest, when one exists. If omitted, the host
41
- * requires the sandbox to provide a manifest in `connect`.
42
- */
43
- manifest?: CustomBlockManifest;
44
- dataSources: CustomBlockHostInitialDataSources;
41
+ manifest: CustomBlockManifest;
42
+ dataSources: CustomBlockHostDataSourcesPayload;
45
43
  currentUser: NotionUser;
46
44
  };
45
+ export type CustomBlockHostInitialStateResult = {
46
+ status: "success";
47
+ initialState: CustomBlockHostInitialState;
48
+ } | {
49
+ status: "error";
50
+ error: CustomBlockInitErrorInfo;
51
+ };
52
+ export type CustomBlockHostGetInitialState = (connect: ConnectSuccessMessage) => Promise<CustomBlockHostInitialStateResult>;
47
53
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lifecycle/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAA;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4DAA4D,CAAA;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AACvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gDAAgD,CAAA;AAEhF,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAC1C,cAAc,EACd;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CACrB,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,UAAU;AACrB,qEAAqE;AACnE,mBAAmB;AACrB,6EAA6E;GAC3E,sBAAsB;AACxB,yDAAyD;GACvD,SAAS;AACX,gFAAgF;GAC9E,OAAO;AACT,2EAA2E;GACzE,SAAS,CAAA;AAEZ,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,EAAE,wBAAwB,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,iCAAiC,GAC1C,iCAAiC,GACjC,CAAC,CAAC,OAAO,EAAE,qBAAqB,KAAK,iCAAiC,CAAC,CAAA;AAE1E,MAAM,MAAM,2BAA2B,GAAG;IACzC,KAAK,EAAE,WAAW,CAAA;IAClB;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,YAAY,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B,WAAW,EAAE,iCAAiC,CAAA;IAC9C,WAAW,EAAE,UAAU,CAAA;CACvB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lifecycle/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAA;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4DAA4D,CAAA;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAA;AACvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mDAAmD,CAAA;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAA;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAA;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gDAAgD,CAAA;AAEhF,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAC1C,cAAc,EACd;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CACrB,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,UAAU;AACrB,qEAAqE;AACnE,mBAAmB;AACrB,mEAAmE;GACjE,eAAe;AACjB,6EAA6E;GAC3E,sBAAsB;AACxB,yDAAyD;GACvD,aAAa;AACf,gFAAgF;GAC9E,OAAO;AACT,2EAA2E;GACzE,SAAS,CAAA;AAEZ,MAAM,MAAM,iCAAiC,GAAG;IAC/C,QAAQ,EAAE,wBAAwB,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACzC,KAAK,EAAE,WAAW,CAAA;IAClB;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,YAAY,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;IACrB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,WAAW,EAAE,iCAAiC,CAAA;IAC9C,WAAW,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,iCAAiC,GAC1C;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,YAAY,EAAE,2BAA2B,CAAA;CACxC,GACD;IACA,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,wBAAwB,CAAA;CAC9B,CAAA;AAEJ,MAAM,MAAM,8BAA8B,GAAG,CAC5C,OAAO,EAAE,qBAAqB,KAC1B,OAAO,CAAC,iCAAiC,CAAC,CAAA"}
@@ -2,8 +2,8 @@ import type { ConnectMessage } from "../protocol/messages/connect.js";
2
2
  import type { CreatePageMessage } from "../protocol/messages/createPage.js";
3
3
  import type { GetPageMessage } from "../protocol/messages/getPage.js";
4
4
  import type { GetUserMessage } from "../protocol/messages/getUser.js";
5
- import type { HostToSandboxMessage } from "../protocol/messages/hostToSandbox.js";
6
5
  import type { InitResultMessage } from "../protocol/messages/initResult.js";
6
+ import type { InvalidSandboxMessage } from "../protocol/messages/invalidSandboxMessage.js";
7
7
  import type { ListUsersMessage } from "../protocol/messages/listUsers.js";
8
8
  import type { OpenPageMessage } from "../protocol/messages/openPage.js";
9
9
  import type { QueryDataSourceMessage } from "../protocol/messages/queryDataSource.js";
@@ -18,7 +18,7 @@ export type SandboxMessageRouterOptions = {
18
18
  sandboxOrigin: string;
19
19
  getInitStatus: () => InitStatus;
20
20
  emit: (direction: CustomBlockHostLogDirection, payload: unknown) => void;
21
- post: (message: HostToSandboxMessage) => void;
21
+ sendNack: (message: InvalidSandboxMessage) => void;
22
22
  onInvalidConnect: InitializationController["handleInvalidConnect"];
23
23
  onInvalidInitResult: InitializationController["handleInvalidInitResult"];
24
24
  onConnect: (message: ConnectMessage) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"sandboxMessageRouter.d.ts","sourceRoot":"","sources":["../../src/messages/sandboxMessageRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4DAA4D,CAAA;AACtG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAEhG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAA;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAA;AAExF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,yEAAyE,CAAA;AAChI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAGhG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAY7D,MAAM,MAAM,2BAA2B,GAAG;IACzC,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACxE,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC7C,gBAAgB,EAAE,wBAAwB,CAAC,sBAAsB,CAAC,CAAA;IAClE,mBAAmB,EAAE,wBAAwB,CAAC,yBAAyB,CAAC,CAAA;IACxE,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAClD,iBAAiB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5E,4BAA4B,EAAE,CAC7B,OAAO,EAAE,iCAAiC,KACtC,IAAI,CAAA;IACT,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,2BAA2B,GAClC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAsI/B"}
1
+ {"version":3,"file":"sandboxMessageRouter.d.ts","sourceRoot":"","sources":["../../src/messages/sandboxMessageRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAA;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAA;AAE/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAA;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAA;AAC1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qDAAqD,CAAA;AAExF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,yEAAyE,CAAA;AAChI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAGhG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAY7D,MAAM,MAAM,2BAA2B,GAAG;IACzC,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,UAAU,CAAA;IAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACxE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAClD,gBAAgB,EAAE,wBAAwB,CAAC,sBAAsB,CAAC,CAAA;IAClE,mBAAmB,EAAE,wBAAwB,CAAC,yBAAyB,CAAC,CAAA;IACxE,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAClD,iBAAiB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5E,4BAA4B,EAAE,CAC7B,OAAO,EAAE,iCAAiC,KACtC,IAAI,CAAA;IACT,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,UAAU,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,WAAW,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,YAAY,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,2BAA2B,GAClC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAsI/B"}
@@ -13,7 +13,7 @@ const bridgeProtocolVersionSchema = v.object({
13
13
  bridgeProtocolVersion: v.union([v.number(), v.nan()]),
14
14
  });
15
15
  export function createSandboxMessageRouter(options) {
16
- const { iframe, sandboxOrigin, getInitStatus, emit, post, onInvalidConnect, onInvalidInitResult, onConnect, onInitResult, onQueryDataSource, onUnsubscribeDataSourceQuery, onCreatePage, onGetPage, onOpenPage, onGetUser, onListUsers, onUpdatePage, onResize, } = options;
16
+ const { iframe, sandboxOrigin, getInitStatus, emit, sendNack, onInvalidConnect, onInvalidInitResult, onConnect, onInitResult, onQueryDataSource, onUnsubscribeDataSourceQuery, onCreatePage, onGetPage, onOpenPage, onGetUser, onListUsers, onUpdatePage, onResize, } = options;
17
17
  function onInvalidSandboxMessage(data, issues) {
18
18
  emit("warn", {
19
19
  message: "Ignored unsupported sandbox message",
@@ -47,9 +47,9 @@ export function createSandboxMessageRouter(options) {
47
47
  error: initErrorForFailureReason("invalid_init_result_payload"),
48
48
  });
49
49
  }
50
- // Other messages get NACKed indicating they were invalid and skipped
51
- if (response.nack !== undefined) {
52
- post(response.nack);
50
+ // Other messages get NACKed indicating they were invalid and skipped.
51
+ if (response.nack !== undefined && getInitStatus() !== "stopped") {
52
+ sendNack(response.nack);
53
53
  }
54
54
  }
55
55
  return function onMessage(event) {
@@ -67,7 +67,7 @@ export function createSandboxMessageRouter(options) {
67
67
  return;
68
68
  }
69
69
  const message = parsed.output;
70
- if (!isInitHandshakeMessage(message) && getInitStatus() !== "success") {
70
+ if (!isInitHandshakeMessage(message) && getInitStatus() !== "initialized") {
71
71
  emit("warn", {
72
72
  message: `Ignored ${message.type} before initialization completed`,
73
73
  payload: message,
@@ -2,7 +2,7 @@ import * as v from "valibot";
2
2
  import type { CustomBlockErrorCode, CustomBlockErrorInfo } from "../errors.js";
3
3
  import type { CustomBlockInitResultErrorCode } from "./initResult.js";
4
4
  export declare const customBlockInitErrorCodeSchema: v.StringSchema<undefined>;
5
- export type CustomBlockInitErrorCode = CustomBlockErrorCode<"manifest_unavailable" | "manifest_invalid" | "invalid_connect_payload" | "invalid_protocol_version" | "unsupported_protocol_version" | "init_timeout" | "context_unavailable" | "current_user_unavailable" | "missing_data_source_binding" | "data_source_unavailable" | "missing_property_binding" | "invalid_property_binding">;
5
+ export type CustomBlockInitErrorCode = CustomBlockErrorCode<"manifest_unavailable" | "manifest_invalid" | "invalid_connect_payload" | "invalid_protocol_version" | "unsupported_protocol_version" | "init_timeout" | "context_unavailable" | "current_user_unavailable" | "initial_state_timeout" | "missing_data_source_binding" | "data_source_unavailable" | "missing_property_binding" | "invalid_property_binding">;
6
6
  export type CustomBlockInitErrorInfo = CustomBlockErrorInfo<CustomBlockInitErrorCode>;
7
7
  /**
8
8
  * Every initialization failure visible to block code. This combines errors
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notionhq/custom-blocks-host",
3
- "version": "0.1.30",
3
+ "version": "0.2.0",
4
4
  "description": "Reusable host runtime for Notion custom blocks.",
5
5
  "license": "MIT",
6
6
  "type": "module",