@notionhq/custom-blocks-host 0.1.21 → 0.1.22
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 +2 -2
- package/dist/lifecycle/initializationController.d.ts +1 -0
- package/dist/lifecycle/initializationController.d.ts.map +1 -1
- package/dist/lifecycle/initializationController.js +15 -2
- package/dist/messages/sandboxMessageRouter.d.ts.map +1 -1
- package/dist/messages/sandboxMessageRouter.js +9 -0
- package/package.json +1 -1
- package/src/lifecycle/initializationController.ts +17 -2
- package/src/messages/sandboxMessageRouter.ts +10 -0
package/README.md
CHANGED
|
@@ -168,8 +168,8 @@ Malformed sandbox messages do not change the host's initialization state or time
|
|
|
168
168
|
two cases:
|
|
169
169
|
|
|
170
170
|
- The host expects `connect` and receives a malformed `connect` with a readable `initializationId`.
|
|
171
|
-
The host sends `init.error`
|
|
172
|
-
|
|
171
|
+
The host sends `init.error` instead of a NACK, then fails initialization. An invalid or
|
|
172
|
+
unsupported numeric protocol version takes precedence over `invalid_connect_payload`.
|
|
173
173
|
- The host expects `initResult` and receives a malformed `initResult` with the active
|
|
174
174
|
`initializationId`. The host sends a NACK and fails initialization with
|
|
175
175
|
`invalid_init_result_payload`. This error code describes a local host failure. The host does not
|
|
@@ -48,6 +48,7 @@ export type InitializationController = {
|
|
|
48
48
|
handleInvalidConnect: (args: {
|
|
49
49
|
initializationId: string;
|
|
50
50
|
error: CustomBlockInitErrorInfo;
|
|
51
|
+
bridgeProtocolVersion: number | undefined;
|
|
51
52
|
}) => "initErrorSent" | "nack";
|
|
52
53
|
handleInvalidInitResult: (args: {
|
|
53
54
|
initializationId: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializationController.d.ts","sourceRoot":"","sources":["../../src/lifecycle/initializationController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAA;AACtF,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,oBAAoB,EAAE,MAAM,4DAA4D,CAAA;AACtG,OAAO,KAAK,EACX,wBAAwB,EAExB,MAAM,mDAAmD,CAAA;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAA;AAChG,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;AAChF,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,sBAAsB,CAAA;AAGhF,OAAO,KAAK,EACX,qBAAqB,EACrB,iCAAiC,EACjC,UAAU,EACV,MAAM,YAAY,CAAA;AAKnB,KAAK,mBAAmB,GAAG;IAC1B,KAAK,EAAE,WAAW,CAAA;IAClB,YAAY,EAAE,kBAAkB,CAAA;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;IACrB,WAAW,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,KAAK,yBAAyB,GAC3B;IACA,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,WAAW,EAAE,iCAAiC,CAAA;CAC7C,GACD;IACA,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,wBAAwB,CAAA;CAC9B,CAAA;AAEJ,MAAM,MAAM,+BAA+B,GAAG;IAC7C,OAAO,EAAE,aAAa,CAAA;IACtB,QAAQ,EAAE,MAAM,mBAAmB,CAAA;IACnC,WAAW,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,yBAAyB,CAAA;IAC1E,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAA;IAC7C,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,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACnD,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,uBAAuB,CAAC,EAAE,CACzB,KAAK,EAAE,oCAAoC,KACvC,IAAI,CAAA;CACT,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,CAAA;QACxB,KAAK,EAAE,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"initializationController.d.ts","sourceRoot":"","sources":["../../src/lifecycle/initializationController.ts"],"names":[],"mappings":"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"}
|
|
@@ -130,12 +130,25 @@ export function createInitializationController(options) {
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
function handleInvalidConnect(args) {
|
|
133
|
-
const { initializationId, error } = args;
|
|
134
133
|
if (initStatus !== "waitingForConnect") {
|
|
135
134
|
// `connect` messages received when not waiting for one are NACKed like generic invalid messages.
|
|
136
135
|
return "nack";
|
|
137
136
|
}
|
|
138
|
-
|
|
137
|
+
const { initializationId, bridgeProtocolVersion } = args;
|
|
138
|
+
let error = args.error;
|
|
139
|
+
// Prefer a specific protocol version error over the generic connect payload error
|
|
140
|
+
// when the malformed message includes a numeric version.
|
|
141
|
+
if (bridgeProtocolVersion !== undefined) {
|
|
142
|
+
if (!isValidBridgeProtocolVersion(bridgeProtocolVersion)) {
|
|
143
|
+
error = initErrorForFailureReason("invalid_protocol_version");
|
|
144
|
+
}
|
|
145
|
+
else if (bridgeProtocolVersion < minBridgeProtocolVersion) {
|
|
146
|
+
error = initErrorForFailureReason("unsupported_protocol_version", {
|
|
147
|
+
currentBridgeProtocolVersion: bridgeProtocolVersion,
|
|
148
|
+
minBridgeProtocolVersion,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
139
152
|
sendInitError({ initializationId, error });
|
|
140
153
|
return "initErrorSent";
|
|
141
154
|
}
|
|
@@ -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;
|
|
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"}
|
|
@@ -7,6 +7,11 @@ import { getInvalidSandboxMessageResponse } from "./invalidSandboxMessage.js";
|
|
|
7
7
|
const initializationIdentitySchema = v.object({
|
|
8
8
|
initializationId: v.string(),
|
|
9
9
|
});
|
|
10
|
+
const bridgeProtocolVersionSchema = v.object({
|
|
11
|
+
// NaN is not a valid protocol version. Keep it in this parser so the host can
|
|
12
|
+
// report `invalid_protocol_version`.
|
|
13
|
+
bridgeProtocolVersion: v.union([v.number(), v.nan()]),
|
|
14
|
+
});
|
|
10
15
|
export function createSandboxMessageRouter(options) {
|
|
11
16
|
const { iframe, sandboxOrigin, getInitStatus, emit, post, onInvalidConnect, onInvalidInitResult, onConnect, onInitResult, onQueryDataSource, onUnsubscribeDataSourceQuery, onCreatePage, onGetPage, onOpenPage, onGetUser, onListUsers, onUpdatePage, onResize, } = options;
|
|
12
17
|
function onInvalidSandboxMessage(data, issues) {
|
|
@@ -19,9 +24,13 @@ export function createSandboxMessageRouter(options) {
|
|
|
19
24
|
if (response.incomingType === "connect") {
|
|
20
25
|
const parsedIdentity = v.safeParse(initializationIdentitySchema, data);
|
|
21
26
|
if (parsedIdentity.success) {
|
|
27
|
+
const parsedVersion = v.safeParse(bridgeProtocolVersionSchema, data);
|
|
22
28
|
const responseType = onInvalidConnect({
|
|
23
29
|
initializationId: parsedIdentity.output.initializationId,
|
|
24
30
|
error: initErrorForFailureReason("invalid_connect_payload"),
|
|
31
|
+
bridgeProtocolVersion: parsedVersion.success
|
|
32
|
+
? parsedVersion.output.bridgeProtocolVersion
|
|
33
|
+
: undefined,
|
|
25
34
|
});
|
|
26
35
|
if (responseType === "initErrorSent") {
|
|
27
36
|
// The controller already sent `init.error`, so no need to also send a NACK.
|
package/package.json
CHANGED
|
@@ -68,6 +68,7 @@ export type InitializationController = {
|
|
|
68
68
|
handleInvalidConnect: (args: {
|
|
69
69
|
initializationId: string
|
|
70
70
|
error: CustomBlockInitErrorInfo
|
|
71
|
+
bridgeProtocolVersion: number | undefined
|
|
71
72
|
}) => "initErrorSent" | "nack"
|
|
72
73
|
handleInvalidInitResult: (args: {
|
|
73
74
|
initializationId: string | undefined
|
|
@@ -239,13 +240,27 @@ export function createInitializationController(
|
|
|
239
240
|
function handleInvalidConnect(args: {
|
|
240
241
|
initializationId: string
|
|
241
242
|
error: CustomBlockInitErrorInfo
|
|
243
|
+
bridgeProtocolVersion: number | undefined
|
|
242
244
|
}): "initErrorSent" | "nack" {
|
|
243
|
-
const { initializationId, error } = args
|
|
244
245
|
if (initStatus !== "waitingForConnect") {
|
|
245
246
|
// `connect` messages received when not waiting for one are NACKed like generic invalid messages.
|
|
246
247
|
return "nack"
|
|
247
248
|
}
|
|
248
|
-
|
|
249
|
+
|
|
250
|
+
const { initializationId, bridgeProtocolVersion } = args
|
|
251
|
+
let error = args.error
|
|
252
|
+
// Prefer a specific protocol version error over the generic connect payload error
|
|
253
|
+
// when the malformed message includes a numeric version.
|
|
254
|
+
if (bridgeProtocolVersion !== undefined) {
|
|
255
|
+
if (!isValidBridgeProtocolVersion(bridgeProtocolVersion)) {
|
|
256
|
+
error = initErrorForFailureReason("invalid_protocol_version")
|
|
257
|
+
} else if (bridgeProtocolVersion < minBridgeProtocolVersion) {
|
|
258
|
+
error = initErrorForFailureReason("unsupported_protocol_version", {
|
|
259
|
+
currentBridgeProtocolVersion: bridgeProtocolVersion,
|
|
260
|
+
minBridgeProtocolVersion,
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
}
|
|
249
264
|
sendInitError({ initializationId, error })
|
|
250
265
|
return "initErrorSent"
|
|
251
266
|
}
|
|
@@ -24,6 +24,12 @@ const initializationIdentitySchema = v.object({
|
|
|
24
24
|
initializationId: v.string(),
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
+
const bridgeProtocolVersionSchema = v.object({
|
|
28
|
+
// NaN is not a valid protocol version. Keep it in this parser so the host can
|
|
29
|
+
// report `invalid_protocol_version`.
|
|
30
|
+
bridgeProtocolVersion: v.union([v.number(), v.nan()]),
|
|
31
|
+
})
|
|
32
|
+
|
|
27
33
|
export type SandboxMessageRouterOptions = {
|
|
28
34
|
iframe: HTMLIFrameElement
|
|
29
35
|
sandboxOrigin: string
|
|
@@ -85,9 +91,13 @@ export function createSandboxMessageRouter(
|
|
|
85
91
|
if (response.incomingType === "connect") {
|
|
86
92
|
const parsedIdentity = v.safeParse(initializationIdentitySchema, data)
|
|
87
93
|
if (parsedIdentity.success) {
|
|
94
|
+
const parsedVersion = v.safeParse(bridgeProtocolVersionSchema, data)
|
|
88
95
|
const responseType = onInvalidConnect({
|
|
89
96
|
initializationId: parsedIdentity.output.initializationId,
|
|
90
97
|
error: initErrorForFailureReason("invalid_connect_payload"),
|
|
98
|
+
bridgeProtocolVersion: parsedVersion.success
|
|
99
|
+
? parsedVersion.output.bridgeProtocolVersion
|
|
100
|
+
: undefined,
|
|
91
101
|
})
|
|
92
102
|
if (responseType === "initErrorSent") {
|
|
93
103
|
// The controller already sent `init.error`, so no need to also send a NACK.
|