微调了web/initialize的返回格式,在DebugConnector中和backend一样尝试去处理未知的异常

This commit is contained in:
Xu Chang 2025-01-26 16:11:06 +08:00
parent 7b66a8d6aa
commit 19b6525049
16 changed files with 145 additions and 104 deletions

View File

@ -19,6 +19,6 @@ export declare abstract class FrontendRuntimeContext<ED extends EntityDict & Bas
env: Environment;
navigator: Navigator;
constructor(store: SyncRowStore<ED, FrontendRuntimeContext<ED>>, features: BasicFeatures<ED>);
protected getSerializedData(allowPartial?: boolean): Promise<SerializedData>;
protected getSerializedData(): Promise<SerializedData>;
}
export default FrontendRuntimeContext;

View File

@ -9,7 +9,7 @@ export class FrontendRuntimeContext extends SyncContext {
this.env = features.environment;
this.navigator = features.navigator;
}
async getSerializedData(allowPartial) {
async getSerializedData() {
const sid = this.subscriber.getSubscriberId();
const be = this.env.getBriefEnv();
const ns = this.navigator.getState();

2
es/initialize.d.ts vendored
View File

@ -18,7 +18,7 @@ import { BackendRuntimeContext } from './context/BackendRuntimeContext';
* @param actionDict
* @returns
*/
export declare function initialize<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED>>(storageSchema: StorageSchema<ED>, frontendContextBuilder: (store: CacheStore<ED>, allowPartial?: boolean) => FrontCxt, connector: Connector<ED, FrontCxt>, checkers: Array<Checker<ED, keyof ED, Cxt | FrontCxt>>, common: CommonConfiguration<ED>, render: RenderConfiguration<ED>): {
export declare function initialize<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED>>(storageSchema: StorageSchema<ED>, frontendContextBuilder: (store: CacheStore<ED>) => FrontCxt, connector: Connector<ED, FrontCxt>, checkers: Array<Checker<ED, keyof ED, Cxt | FrontCxt>>, common: CommonConfiguration<ED>, render: RenderConfiguration<ED>): {
features: {
location: import("./features/location").Location;
environment: import("./features/environment").Environment;

View File

@ -58,7 +58,6 @@ function Error(props) {
</ErrorPage>);
}
return (<ErrorPage code={ECode.error} title={locales.t('error::error.title')} desc={locales.t('error::error.content')}>
<ErrorMessage error={error}/>
<Button type="primary" onClick={async () => {
await features.localStorage.clear();
window.location.reload();
@ -70,6 +69,7 @@ function Error(props) {
function ErrorMessage(props) {
const { error } = props;
if (process.env.NODE_ENV === 'development') {
const {} = error;
return (<span style={{
marginBottom: 24,
color: 'red',

View File

@ -1,3 +1,4 @@
import React from 'react';
import { Locale as AntdLocale } from 'antd/lib/locale';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
import { BasicFeatures } from '../../../features';
@ -6,4 +7,4 @@ import { IRouter } from '../router/types';
export default function initialize<ED extends BaseEntityDict>(features: BasicFeatures<ED>, appName: string, routers: IRouter[], locales?: {
dayJs?: string;
antd?: AntdLocale;
}, error?: any): void;
}, error?: any, format?: 'react'): React.JSX.Element | undefined;

View File

@ -5,45 +5,49 @@ import { createBrowserHistory } from 'history';
import { unstable_HistoryRouter as HistoryRouter } from 'react-router-dom';
import { ConfigProvider } from 'antd';
import { StyleProvider, legacyLogicalPropertiesTransformer } from '@ant-design/cssinjs';
import dayjs from 'dayjs';
import { ResponsiveProvider } from '../responsive';
import { FeaturesProvider } from '../features';
import AppError from './AppError';
import AppContainer from './AppContainer';
import AppRouter from './AppRouter';
import { autoFixContext } from 'react-activation';
// import { AliveScope, autoFixContext } from 'react-activation'
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';
import zhCN from 'antd/locale/zh_CN';
import enUS from 'antd/locale/en_US';
autoFixContext([require('react/jsx-runtime'), 'jsx', 'jsxs', 'jsxDEV'], [require('react/jsx-dev-runtime'), 'jsx', 'jsxs', 'jsxDEV']);
export default function initialize(features, appName, routers, locales, error) {
const root = ReactDOM.createRoot(document.getElementById('root'));
/* autoFixContext(
[require('react/jsx-runtime'), 'jsx', 'jsxs', 'jsxDEV'],
[require('react/jsx-dev-runtime'), 'jsx', 'jsxs', 'jsxDEV']
) */
export default function initialize(features, appName, routers, locales, error, format) {
const history = createBrowserHistory();
features.navigator.setHistory(history);
if (error) {
root.render(<HistoryRouter history={history}>
<AppError error={error} features={features}/>
</HistoryRouter>);
const { language } = window.navigator;
dayjs.locale(locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? 'zh-cn' : 'en-us');
const Main = error ? (<HistoryRouter history={history}>
<AppError error={error} features={features}/>
</HistoryRouter>) : (<HistoryRouter history={history}>
<ResponsiveProvider>
<FeaturesProvider features={features}>
<ConfigProvider locale={locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zhCN : enUS} theme={{
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}}>
<StyleProvider hashPriority="high" transformers={[legacyLogicalPropertiesTransformer]}>
<AppContainer>
<AppRouter features={features} appName={appName} routers={routers}/>
</AppContainer>
</StyleProvider>
</ConfigProvider>
</FeaturesProvider>
</ResponsiveProvider>
</HistoryRouter>);
if (format) {
return Main;
}
else {
const { language } = window.navigator;
dayjs.locale(locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? 'zh-cn' : 'en-us');
root.render(<HistoryRouter history={history}>
<ResponsiveProvider>
<FeaturesProvider features={features}>
<ConfigProvider locale={locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zhCN : enUS} theme={{
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}}>
<StyleProvider hashPriority="high" transformers={[legacyLogicalPropertiesTransformer]}>
<AppContainer>
<AppRouter features={features} appName={appName} routers={routers}/>
</AppContainer>
</StyleProvider>
</ConfigProvider>
</FeaturesProvider>
</ResponsiveProvider>
</HistoryRouter>);
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(Main);
}
}

View File

@ -1,4 +1,5 @@
import assert from 'assert';
import { OakException } from "oak-domain/lib/types";
import { createDebugStore } from '../debugStore';
import { cloneDeep, mergeConcatArray } from "oak-domain/lib/utils/lodash";
import commonAspectDict, { registerPorts } from 'oak-common-aspect';
@ -45,6 +46,15 @@ export default class DebugConnector {
}
catch (err) {
await contextBackend.rollback();
if (err instanceof OakException) {
throw err;
}
if (err instanceof Error) {
const exception = await contextBackend.tryDeduceException(err);
if (exception) {
throw exception;
}
}
throw err;
}
}

View File

@ -19,6 +19,6 @@ export declare abstract class FrontendRuntimeContext<ED extends EntityDict & Bas
env: Environment;
navigator: Navigator;
constructor(store: SyncRowStore<ED, FrontendRuntimeContext<ED>>, features: BasicFeatures<ED>);
protected getSerializedData(allowPartial?: boolean): Promise<SerializedData>;
protected getSerializedData(): Promise<SerializedData>;
}
export default FrontendRuntimeContext;

View File

@ -12,7 +12,7 @@ class FrontendRuntimeContext extends SyncRowStore_1.SyncContext {
this.env = features.environment;
this.navigator = features.navigator;
}
async getSerializedData(allowPartial) {
async getSerializedData() {
const sid = this.subscriber.getSubscriberId();
const be = this.env.getBriefEnv();
const ns = this.navigator.getState();

2
lib/initialize.d.ts vendored
View File

@ -18,7 +18,7 @@ import { BackendRuntimeContext } from './context/BackendRuntimeContext';
* @param actionDict
* @returns
*/
export declare function initialize<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED>>(storageSchema: StorageSchema<ED>, frontendContextBuilder: (store: CacheStore<ED>, allowPartial?: boolean) => FrontCxt, connector: Connector<ED, FrontCxt>, checkers: Array<Checker<ED, keyof ED, Cxt | FrontCxt>>, common: CommonConfiguration<ED>, render: RenderConfiguration<ED>): {
export declare function initialize<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>, FrontCxt extends FrontendRuntimeContext<ED>>(storageSchema: StorageSchema<ED>, frontendContextBuilder: (store: CacheStore<ED>) => FrontCxt, connector: Connector<ED, FrontCxt>, checkers: Array<Checker<ED, keyof ED, Cxt | FrontCxt>>, common: CommonConfiguration<ED>, render: RenderConfiguration<ED>): {
features: {
location: import("./features/location").Location;
environment: import("./features/environment").Environment;

View File

@ -68,14 +68,15 @@ function Error(props) {
'#oakModule': "oak-frontend-base"
}) })] }));
}
return ((0, jsx_runtime_1.jsxs)(ErrorPage, { code: ErrorPage_1.ECode.error, title: locales.t('error::error.title'), desc: locales.t('error::error.content'), children: [(0, jsx_runtime_1.jsx)(ErrorMessage, { error: error }), (0, jsx_runtime_1.jsx)(antd_1.Button, { type: "primary", onClick: async () => {
await features.localStorage.clear();
window.location.reload();
}, children: locales.t('clearCache') })] }));
return ((0, jsx_runtime_1.jsx)(ErrorPage, { code: ErrorPage_1.ECode.error, title: locales.t('error::error.title'), desc: locales.t('error::error.content'), children: (0, jsx_runtime_1.jsx)(antd_1.Button, { type: "primary", onClick: async () => {
await features.localStorage.clear();
window.location.reload();
}, children: locales.t('clearCache') }) }));
}
function ErrorMessage(props) {
const { error } = props;
if (process.env.NODE_ENV === 'development') {
const {} = error;
return ((0, jsx_runtime_1.jsx)("span", { style: {
marginBottom: 24,
color: 'red',

View File

@ -1,3 +1,4 @@
import React from 'react';
import { Locale as AntdLocale } from 'antd/lib/locale';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
import { BasicFeatures } from '../../../features';
@ -6,4 +7,4 @@ import { IRouter } from '../router/types';
export default function initialize<ED extends BaseEntityDict>(features: BasicFeatures<ED>, appName: string, routers: IRouter[], locales?: {
dayJs?: string;
antd?: AntdLocale;
}, error?: any): void;
}, error?: any, format?: 'react'): React.JSX.Element | undefined;

View File

@ -7,32 +7,33 @@ const history_1 = require("history");
const react_router_dom_1 = require("react-router-dom");
const antd_1 = require("antd");
const cssinjs_1 = require("@ant-design/cssinjs");
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
const responsive_1 = require("../responsive");
const features_1 = require("../features");
const AppError_1 = tslib_1.__importDefault(require("./AppError"));
const AppContainer_1 = tslib_1.__importDefault(require("./AppContainer"));
const AppRouter_1 = tslib_1.__importDefault(require("./AppRouter"));
const react_activation_1 = require("react-activation");
// import { AliveScope, autoFixContext } from 'react-activation'
require("dayjs/locale/zh-cn");
const zh_CN_1 = tslib_1.__importDefault(require("antd/locale/zh_CN"));
const en_US_1 = tslib_1.__importDefault(require("antd/locale/en_US"));
(0, react_activation_1.autoFixContext)([require('react/jsx-runtime'), 'jsx', 'jsxs', 'jsxDEV'], [require('react/jsx-dev-runtime'), 'jsx', 'jsxs', 'jsxDEV']);
function initialize(features, appName, routers, locales, error) {
const root = client_1.default.createRoot(document.getElementById('root'));
/* autoFixContext(
[require('react/jsx-runtime'), 'jsx', 'jsxs', 'jsxDEV'],
[require('react/jsx-dev-runtime'), 'jsx', 'jsxs', 'jsxDEV']
) */
function initialize(features, appName, routers, locales, error, format) {
const history = (0, history_1.createBrowserHistory)();
features.navigator.setHistory(history);
if (error) {
root.render((0, jsx_runtime_1.jsx)(react_router_dom_1.unstable_HistoryRouter, { history: history, children: (0, jsx_runtime_1.jsx)(AppError_1.default, { error: error, features: features }) }));
const Main = error ? ((0, jsx_runtime_1.jsx)(react_router_dom_1.unstable_HistoryRouter, { history: history, children: (0, jsx_runtime_1.jsx)(AppError_1.default, { error: error, features: features }) })) : ((0, jsx_runtime_1.jsx)(react_router_dom_1.unstable_HistoryRouter, { history: history, children: (0, jsx_runtime_1.jsx)(responsive_1.ResponsiveProvider, { children: (0, jsx_runtime_1.jsx)(features_1.FeaturesProvider, { features: features, children: (0, jsx_runtime_1.jsx)(antd_1.ConfigProvider, { locale: locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zh_CN_1.default : en_US_1.default, theme: {
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}, children: (0, jsx_runtime_1.jsx)(cssinjs_1.StyleProvider, { hashPriority: "high", transformers: [cssinjs_1.legacyLogicalPropertiesTransformer], children: (0, jsx_runtime_1.jsx)(AppContainer_1.default, { children: (0, jsx_runtime_1.jsx)(AppRouter_1.default, { features: features, appName: appName, routers: routers }) }) }) }) }) }) }));
if (format) {
return Main;
}
else {
const { language } = window.navigator;
dayjs_1.default.locale(locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? 'zh-cn' : 'en-us');
root.render((0, jsx_runtime_1.jsx)(react_router_dom_1.unstable_HistoryRouter, { history: history, children: (0, jsx_runtime_1.jsx)(responsive_1.ResponsiveProvider, { children: (0, jsx_runtime_1.jsx)(features_1.FeaturesProvider, { features: features, children: (0, jsx_runtime_1.jsx)(antd_1.ConfigProvider, { locale: locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zh_CN_1.default : en_US_1.default, theme: {
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}, children: (0, jsx_runtime_1.jsx)(cssinjs_1.StyleProvider, { hashPriority: "high", transformers: [cssinjs_1.legacyLogicalPropertiesTransformer], children: (0, jsx_runtime_1.jsx)(AppContainer_1.default, { children: (0, jsx_runtime_1.jsx)(AppRouter_1.default, { features: features, appName: appName, routers: routers }) }) }) }) }) }) }));
const root = client_1.default.createRoot(document.getElementById('root'));
root.render(Main);
}
}
exports.default = initialize;

View File

@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const assert_1 = tslib_1.__importDefault(require("assert"));
const types_1 = require("oak-domain/lib/types");
const debugStore_1 = require("../debugStore");
const lodash_1 = require("oak-domain/lib/utils/lodash");
const oak_common_aspect_1 = tslib_1.__importStar(require("oak-common-aspect"));
@ -48,6 +49,15 @@ class DebugConnector {
}
catch (err) {
await contextBackend.rollback();
if (err instanceof types_1.OakException) {
throw err;
}
if (err instanceof Error) {
const exception = await contextBackend.tryDeduceException(err);
if (exception) {
throw exception;
}
}
throw err;
}
}

View File

@ -14,17 +14,17 @@ import { BasicFeatures } from '../../../features';
import AppError from './AppError';
import AppContainer from './AppContainer';
import AppRouter from './AppRouter';
import { AliveScope, autoFixContext } from 'react-activation'
// import { AliveScope, autoFixContext } from 'react-activation'
import 'dayjs/locale/zh-cn';
import zhCN from 'antd/locale/zh_CN';
import enUS from 'antd/locale/en_US';
import { IRouter } from '../router/types';
autoFixContext(
/* autoFixContext(
[require('react/jsx-runtime'), 'jsx', 'jsxs', 'jsxDEV'],
[require('react/jsx-dev-runtime'), 'jsx', 'jsxs', 'jsxDEV']
)
) */
export default function initialize<ED extends BaseEntityDict>(
features: BasicFeatures<ED>,
@ -34,56 +34,59 @@ export default function initialize<ED extends BaseEntityDict>(
dayJs?: string;
antd?: AntdLocale;
},
error?: any
) {
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
error?: any,
format?: 'react'
): React.JSX.Element | undefined {
const history = createBrowserHistory();
features.navigator.setHistory(history);
const { language } = window.navigator;
dayjs.locale(locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? 'zh-cn' : 'en-us');
if (error) {
root.render(
<HistoryRouter history={history as any}>
<AppError
error={error}
features={features}
/>
</HistoryRouter>
);
const Main = error ? (
<HistoryRouter history={history as any}>
<AppError
error={error}
features={features}
/>
</HistoryRouter>
) : (
<HistoryRouter history={history as any}>
<ResponsiveProvider>
<FeaturesProvider features={features}>
<ConfigProvider
locale={locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zhCN : enUS}
theme={{
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}}
>
<StyleProvider
hashPriority="high"
transformers={[legacyLogicalPropertiesTransformer]}
>
<AppContainer>
<AppRouter
features={features}
appName={appName}
routers={routers}
/>
</AppContainer>
</StyleProvider>
</ConfigProvider>
</FeaturesProvider>
</ResponsiveProvider>
</HistoryRouter>
);
if (format) {
return Main;
}
else {
const { language } = window.navigator;
dayjs.locale(locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? 'zh-cn' : 'en-us');
root.render(
<HistoryRouter history={history as any}>
<ResponsiveProvider>
<FeaturesProvider features={features}>
<ConfigProvider
locale={locales?.dayJs || ['zh-CN', 'zh_CN'].includes(language) ? zhCN : enUS}
theme={{
cssVar: {
prefix: 'adm', // 和antd-mobile共享
}
}}
>
<StyleProvider
hashPriority="high"
transformers={[legacyLogicalPropertiesTransformer]}
>
<AppContainer>
<AppRouter
features={features}
appName={appName}
routers={routers}
/>
</AppContainer>
</StyleProvider>
</ConfigProvider>
</FeaturesProvider>
</ResponsiveProvider>
</HistoryRouter>
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(Main);
}
}

View File

@ -1,6 +1,7 @@
import assert from 'assert';
import {
Checker, Trigger, StorageSchema, EntityDict, Watcher, Routine, Timer, Aspect
Checker, Trigger, StorageSchema, EntityDict, Watcher, Routine, Timer, Aspect,
OakException
} from "oak-domain/lib/types";
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
@ -76,6 +77,15 @@ export default class DebugConnector<ED extends EntityDict & BaseEntityDict, Cxt
};
} catch (err) {
await contextBackend.rollback();
if (err instanceof OakException) {
throw err;
}
if (err instanceof Error) {
const exception = await contextBackend.tryDeduceException(err);
if (exception) {
throw exception;
}
}
throw err;
}
}