@web-widget/react 0.8.4 → 0.8.6

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.
@@ -3,6 +3,7 @@ import { RenderContext, ComponentProps } from '@web-widget/schema';
3
3
  import * as react from 'react';
4
4
  import { ReactNode, Component } from 'react';
5
5
  export * from '@web-widget/schema/client-helpers';
6
+ export { useWidgetSyncState as useWidgetState } from '@web-widget/schema/client-helpers';
6
7
  import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
7
8
 
8
9
  declare const __ENV__: {
@@ -52,9 +53,9 @@ interface CreateReactRenderOptions {
52
53
 
53
54
  declare const createReactRender: ({ onPrefetchData, }?: CreateReactRenderOptions) => (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>, renderOptions: any) => Promise<void | {
54
55
  mount?: (() => void | Promise<void>) | undefined;
55
- /**@deprecated Please use `createReactRender` instead.*/
56
56
  unmount?: (() => void | Promise<void>) | undefined;
57
57
  update?: (({ data }: {
58
+ /**@deprecated Please use `createReactRender` instead.*/
58
59
  data: Record<string, any>;
59
60
  }) => void | Promise<void>) | undefined;
60
61
  } | {
@@ -67,9 +68,9 @@ declare const createReactRender: ({ onPrefetchData, }?: CreateReactRenderOptions
67
68
  /**@deprecated Please use `createReactRender` instead.*/
68
69
  declare const defineReactRender: ({ onPrefetchData, }?: CreateReactRenderOptions) => (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>, renderOptions: any) => Promise<void | {
69
70
  mount?: (() => void | Promise<void>) | undefined;
70
- /**@deprecated Please use `createReactRender` instead.*/
71
71
  unmount?: (() => void | Promise<void>) | undefined;
72
72
  update?: (({ data }: {
73
+ /**@deprecated Please use `createReactRender` instead.*/
73
74
  data: Record<string, any>;
74
75
  }) => void | Promise<void>) | undefined;
75
76
  } | {
@@ -81,9 +82,9 @@ declare const defineReactRender: ({ onPrefetchData, }?: CreateReactRenderOptions
81
82
  }>;
82
83
  declare const render: (context: _web_widget_schema.ClientWidgetRenderContext<unknown> | _web_widget_schema.ClientRouteRenderContext<unknown, Record<string, string>>, renderOptions: any) => Promise<void | {
83
84
  mount?: (() => void | Promise<void>) | undefined;
84
- /**@deprecated Please use `createReactRender` instead.*/
85
85
  unmount?: (() => void | Promise<void>) | undefined;
86
86
  update?: (({ data }: {
87
+ /**@deprecated Please use `createReactRender` instead.*/
87
88
  data: Record<string, any>;
88
89
  }) => void | Promise<void>) | undefined;
89
90
  } | {
@@ -113,6 +113,7 @@ function defineWebWidget(loader, options) {
113
113
 
114
114
  // src/client.ts
115
115
  export * from "@web-widget/schema/client-helpers";
116
+ import { useWidgetSyncState } from "@web-widget/schema/client-helpers";
116
117
  Reflect.defineProperty(__ENV__, "server", {
117
118
  value: false
118
119
  });
@@ -161,5 +162,6 @@ export {
161
162
  createReactRender,
162
163
  defineReactRender,
163
164
  defineWebWidget,
164
- render
165
+ render,
166
+ useWidgetSyncState as useWidgetState
165
167
  };
@@ -4,6 +4,7 @@ import { RenderToReadableStreamOptions } from 'react-dom/server';
4
4
  import * as react from 'react';
5
5
  import { ReactNode, Component } from 'react';
6
6
  export * from '@web-widget/schema/server-helpers';
7
+ export { useWidgetSyncState as useWidgetState } from '@web-widget/schema/server-helpers';
7
8
  import { WebWidgetContainerOptions, Loader } from '@web-widget/web-widget';
8
9
 
9
10
  declare const __ENV__: {
@@ -113,12 +113,27 @@ function defineWebWidget(loader, options) {
113
113
  // src/server.ts
114
114
  import * as ReactDOMServer from "react-dom/server.browser";
115
115
  export * from "@web-widget/schema/server-helpers";
116
+ import { useWidgetSyncState } from "@web-widget/schema/server-helpers";
116
117
  Reflect.defineProperty(__ENV__, "server", {
117
118
  value: true
118
119
  });
119
120
  function renderToReadableStream2(vNode, renderOptions) {
120
121
  return ReactDOMServer.renderToReadableStream(vNode, renderOptions);
121
122
  }
123
+ function createTimeoutSignal(ms) {
124
+ const controller = new AbortController();
125
+ const timer = setTimeout(() => {
126
+ controller.abort(
127
+ new Error(`Component did not finish rendering within ${ms}ms.`)
128
+ );
129
+ }, ms);
130
+ return [
131
+ controller.signal,
132
+ function disconnect() {
133
+ clearTimeout(timer);
134
+ }
135
+ ];
136
+ }
122
137
  var createReactRender = ({
123
138
  onPrefetchData
124
139
  } = {}) => {
@@ -126,9 +141,24 @@ var createReactRender = ({
126
141
  throw new Error(`"onPrefetchData" is not supported.`);
127
142
  }
128
143
  return defineRender(
129
- async (context, { react: reactRenderOptions } = {}) => {
144
+ async (context, { react: reactRenderOptions = {} } = {}) => {
145
+ let error, signal, disconnect;
130
146
  const componentDescriptor = getComponentDescriptor(context);
131
147
  const { component, props } = componentDescriptor;
148
+ const onError = reactRenderOptions.onError;
149
+ const awaitAllReady = reactRenderOptions.awaitAllReady;
150
+ if (!reactRenderOptions.signal) {
151
+ [signal, disconnect] = createTimeoutSignal(1e3 * 10);
152
+ reactRenderOptions.signal = signal;
153
+ }
154
+ reactRenderOptions.onError = (e) => {
155
+ error = e;
156
+ if (onError) {
157
+ onError(e);
158
+ } else if (!awaitAllReady) {
159
+ console.error(`[@web-widget/react]`, e);
160
+ }
161
+ };
132
162
  let vNode;
133
163
  if (typeof component === "function" && component.constructor.name === "AsyncFunction") {
134
164
  vNode = await component(props);
@@ -136,9 +166,15 @@ var createReactRender = ({
136
166
  vNode = createElement2(component, props);
137
167
  }
138
168
  const stream = await renderToReadableStream2(vNode, reactRenderOptions);
139
- if (reactRenderOptions == null ? void 0 : reactRenderOptions.awaitAllReady) {
169
+ if (awaitAllReady) {
140
170
  await stream.allReady;
141
171
  }
172
+ if (disconnect) {
173
+ disconnect();
174
+ }
175
+ if (error) {
176
+ throw error;
177
+ }
142
178
  return stream;
143
179
  }
144
180
  );
@@ -151,5 +187,6 @@ export {
151
187
  createReactRender,
152
188
  defineReactRender,
153
189
  defineWebWidget,
154
- render
190
+ render,
191
+ useWidgetSyncState as useWidgetState
155
192
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-widget/react",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -31,9 +31,9 @@
31
31
  "globals.d.ts"
32
32
  ],
33
33
  "dependencies": {
34
- "@web-widget/vite": "2.8.2",
35
- "@web-widget/schema": "0.4.1",
36
- "@web-widget/web-widget": "1.6.2"
34
+ "@web-widget/vite": "2.8.4",
35
+ "@web-widget/schema": "0.4.2",
36
+ "@web-widget/web-widget": "1.7.1"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/react": "^18.2.9",