@tramvai/module-common 2.143.1 → 2.145.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.
- package/lib/actions/ActionModule.browser.js +8 -2
- package/lib/actions/ActionModule.es.js +8 -2
- package/lib/actions/ActionModule.js +6 -0
- package/lib/actions/actionPageRunner.browser.browser.js +24 -2
- package/lib/actions/actionPageRunner.browser.d.ts +7 -6
- package/lib/actions/actionPageRunner.d.ts +8 -1
- package/lib/actions/actionPageRunner.es.js +48 -2
- package/lib/actions/actionPageRunner.js +47 -1
- package/lib/actions/deferred/await.browser.js +36 -0
- package/lib/actions/deferred/await.d.ts +6 -0
- package/lib/actions/deferred/await.es.js +36 -0
- package/lib/actions/deferred/await.js +40 -0
- package/lib/actions/deferred/clientScriptsUtils.d.ts +8 -0
- package/lib/actions/deferred/clientScriptsUtils.es.js +10 -0
- package/lib/actions/deferred/clientScriptsUtils.js +15 -0
- package/lib/actions/deferred/deferred.browser.js +22 -0
- package/lib/actions/deferred/deferred.d.ts +11 -0
- package/lib/actions/deferred/deferred.es.js +22 -0
- package/lib/actions/deferred/deferred.inline.d.ts +2 -0
- package/lib/actions/deferred/deferred.inline.es.js +20 -0
- package/lib/actions/deferred/deferred.inline.js +24 -0
- package/lib/actions/deferred/deferred.js +26 -0
- package/lib/actions/deferred/providers.browser.browser.js +28 -0
- package/lib/actions/deferred/providers.browser.d.ts +9 -0
- package/lib/actions/deferred/providers.d.ts +20 -0
- package/lib/actions/deferred/providers.es.js +59 -0
- package/lib/actions/deferred/providers.js +63 -0
- package/lib/index.browser.js +2 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.es.js +2 -0
- package/lib/index.js +4 -0
- package/package.json +19 -17
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
|
-
import { createToken, Module, provide, Scope, ACTIONS_LIST_TOKEN, DI_TOKEN } from '@tramvai/core';
|
|
3
|
-
import { COMBINE_REDUCERS, ACTION_REGISTRY_TOKEN, ACTION_EXECUTION_TOKEN, ACTION_CONDITIONALS, CONTEXT_TOKEN, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, ACTION_PAGE_RUNNER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, LOGGER_TOKEN } from '@tramvai/tokens-common';
|
|
2
|
+
import { createToken, Module, provide, Scope, ACTIONS_LIST_TOKEN, DI_TOKEN, optional } from '@tramvai/core';
|
|
3
|
+
import { COMBINE_REDUCERS, ACTION_REGISTRY_TOKEN, ACTION_EXECUTION_TOKEN, ACTION_CONDITIONALS, CONTEXT_TOKEN, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, ACTION_PAGE_RUNNER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, LOGGER_TOKEN, DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
4
|
+
import { SERVER_RESPONSE_TASK_MANAGER, SERVER_RESPONSE_STREAM } from '@tramvai/tokens-server-private';
|
|
4
5
|
import { actionTramvaiReducer } from './actionTramvaiReducer.browser.js';
|
|
5
6
|
import { ActionExecution } from './actionExecution.browser.js';
|
|
6
7
|
import { ActionRegistry } from './actionRegistry.browser.js';
|
|
@@ -15,6 +16,7 @@ import { pageServer } from './conditions/pageServer.browser.js';
|
|
|
15
16
|
export { pageServer } from './conditions/pageServer.browser.js';
|
|
16
17
|
import { pageBrowser } from './conditions/pageBrowser.browser.js';
|
|
17
18
|
export { pageBrowser } from './conditions/pageBrowser.browser.js';
|
|
19
|
+
import { providers } from './deferred/providers.browser.browser.js';
|
|
18
20
|
|
|
19
21
|
const LIMIT_ACTION_GLOBAL_TIME_RUN = createToken('limitActionGlobalTimeRun');
|
|
20
22
|
let ActionModule = class ActionModule {
|
|
@@ -61,6 +63,9 @@ ActionModule = __decorate([
|
|
|
61
63
|
store: STORE_TOKEN,
|
|
62
64
|
limitTime: LIMIT_ACTION_GLOBAL_TIME_RUN,
|
|
63
65
|
logger: LOGGER_TOKEN,
|
|
66
|
+
deferredMap: DEFERRED_ACTIONS_MAP_TOKEN,
|
|
67
|
+
responseTaskManager: optional(SERVER_RESPONSE_TASK_MANAGER),
|
|
68
|
+
serverResponseStream: optional(SERVER_RESPONSE_STREAM),
|
|
64
69
|
},
|
|
65
70
|
}),
|
|
66
71
|
provide({
|
|
@@ -72,6 +77,7 @@ ActionModule = __decorate([
|
|
|
72
77
|
multi: true,
|
|
73
78
|
useValue: [alwaysCondition, onlyServer, onlyBrowser, pageServer, pageBrowser],
|
|
74
79
|
}),
|
|
80
|
+
...providers,
|
|
75
81
|
],
|
|
76
82
|
})
|
|
77
83
|
], ActionModule);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
|
-
import { createToken, Module, provide, Scope, ACTIONS_LIST_TOKEN, DI_TOKEN } from '@tramvai/core';
|
|
3
|
-
import { COMBINE_REDUCERS, ACTION_REGISTRY_TOKEN, ACTION_EXECUTION_TOKEN, ACTION_CONDITIONALS, CONTEXT_TOKEN, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, ACTION_PAGE_RUNNER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, LOGGER_TOKEN } from '@tramvai/tokens-common';
|
|
2
|
+
import { createToken, Module, provide, Scope, ACTIONS_LIST_TOKEN, DI_TOKEN, optional } from '@tramvai/core';
|
|
3
|
+
import { COMBINE_REDUCERS, ACTION_REGISTRY_TOKEN, ACTION_EXECUTION_TOKEN, ACTION_CONDITIONALS, CONTEXT_TOKEN, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, ACTION_PAGE_RUNNER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, LOGGER_TOKEN, DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
4
|
+
import { SERVER_RESPONSE_TASK_MANAGER, SERVER_RESPONSE_STREAM } from '@tramvai/tokens-server-private';
|
|
4
5
|
import { actionTramvaiReducer } from './actionTramvaiReducer.es.js';
|
|
5
6
|
import { ActionExecution } from './actionExecution.es.js';
|
|
6
7
|
import { ActionRegistry } from './actionRegistry.es.js';
|
|
@@ -15,6 +16,7 @@ import { pageServer } from './conditions/pageServer.es.js';
|
|
|
15
16
|
export { pageServer } from './conditions/pageServer.es.js';
|
|
16
17
|
import { pageBrowser } from './conditions/pageBrowser.es.js';
|
|
17
18
|
export { pageBrowser } from './conditions/pageBrowser.es.js';
|
|
19
|
+
import { providers } from './deferred/providers.es.js';
|
|
18
20
|
|
|
19
21
|
const LIMIT_ACTION_GLOBAL_TIME_RUN = createToken('limitActionGlobalTimeRun');
|
|
20
22
|
let ActionModule = class ActionModule {
|
|
@@ -61,6 +63,9 @@ ActionModule = __decorate([
|
|
|
61
63
|
store: STORE_TOKEN,
|
|
62
64
|
limitTime: LIMIT_ACTION_GLOBAL_TIME_RUN,
|
|
63
65
|
logger: LOGGER_TOKEN,
|
|
66
|
+
deferredMap: DEFERRED_ACTIONS_MAP_TOKEN,
|
|
67
|
+
responseTaskManager: optional(SERVER_RESPONSE_TASK_MANAGER),
|
|
68
|
+
serverResponseStream: optional(SERVER_RESPONSE_STREAM),
|
|
64
69
|
},
|
|
65
70
|
}),
|
|
66
71
|
provide({
|
|
@@ -72,6 +77,7 @@ ActionModule = __decorate([
|
|
|
72
77
|
multi: true,
|
|
73
78
|
useValue: [alwaysCondition, onlyServer, onlyBrowser, pageServer, pageBrowser],
|
|
74
79
|
}),
|
|
80
|
+
...providers,
|
|
75
81
|
],
|
|
76
82
|
})
|
|
77
83
|
], ActionModule);
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var tslib = require('tslib');
|
|
6
6
|
var core = require('@tramvai/core');
|
|
7
7
|
var tokensCommon = require('@tramvai/tokens-common');
|
|
8
|
+
var tokensServerPrivate = require('@tramvai/tokens-server-private');
|
|
8
9
|
var actionTramvaiReducer = require('./actionTramvaiReducer.js');
|
|
9
10
|
var actionExecution = require('./actionExecution.js');
|
|
10
11
|
var actionRegistry = require('./actionRegistry.js');
|
|
@@ -14,6 +15,7 @@ var onlyServer = require('./conditions/onlyServer.js');
|
|
|
14
15
|
var onlyBrowser = require('./conditions/onlyBrowser.js');
|
|
15
16
|
var pageServer = require('./conditions/pageServer.js');
|
|
16
17
|
var pageBrowser = require('./conditions/pageBrowser.js');
|
|
18
|
+
var providers = require('./deferred/providers.js');
|
|
17
19
|
|
|
18
20
|
const LIMIT_ACTION_GLOBAL_TIME_RUN = core.createToken('limitActionGlobalTimeRun');
|
|
19
21
|
exports.ActionModule = class ActionModule {
|
|
@@ -60,6 +62,9 @@ exports.ActionModule = tslib.__decorate([
|
|
|
60
62
|
store: tokensCommon.STORE_TOKEN,
|
|
61
63
|
limitTime: LIMIT_ACTION_GLOBAL_TIME_RUN,
|
|
62
64
|
logger: tokensCommon.LOGGER_TOKEN,
|
|
65
|
+
deferredMap: tokensCommon.DEFERRED_ACTIONS_MAP_TOKEN,
|
|
66
|
+
responseTaskManager: core.optional(tokensServerPrivate.SERVER_RESPONSE_TASK_MANAGER),
|
|
67
|
+
serverResponseStream: core.optional(tokensServerPrivate.SERVER_RESPONSE_STREAM),
|
|
63
68
|
},
|
|
64
69
|
}),
|
|
65
70
|
core.provide({
|
|
@@ -71,6 +76,7 @@ exports.ActionModule = tslib.__decorate([
|
|
|
71
76
|
multi: true,
|
|
72
77
|
useValue: [always.alwaysCondition, onlyServer.onlyServer, onlyBrowser.onlyBrowser, pageServer.pageServer, pageBrowser.pageBrowser],
|
|
73
78
|
}),
|
|
79
|
+
...providers.providers,
|
|
74
80
|
],
|
|
75
81
|
})
|
|
76
82
|
], exports.ActionModule);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isSilentError } from '@tinkoff/errors';
|
|
2
|
-
import {
|
|
2
|
+
import { ACTION_PARAMETERS, isTramvaiAction } from '@tramvai/core';
|
|
3
|
+
import { Deferred } from './deferred/deferred.browser.js';
|
|
3
4
|
|
|
4
5
|
const DEFAULT_PAYLOAD = {};
|
|
5
6
|
class ActionPageRunner {
|
|
@@ -10,8 +11,29 @@ class ActionPageRunner {
|
|
|
10
11
|
runActions(actions, stopRunAtError = () => false) {
|
|
11
12
|
return this.deps.executionContextManager.withContext(this.deps.commandLineExecutionContext(), { name: 'pageActions', values: { pageActions: true } }, async (executionContext) => {
|
|
12
13
|
const actionMapper = (action) => {
|
|
14
|
+
const isDeferredAction = ACTION_PARAMETERS in action && action[ACTION_PARAMETERS].deferred;
|
|
15
|
+
if (isDeferredAction && !this.deps.deferredMap.get(action.name)) {
|
|
16
|
+
const deferred = new Deferred();
|
|
17
|
+
// avoid unhandled promise rejection
|
|
18
|
+
deferred.promise.catch(() => { });
|
|
19
|
+
this.deps.deferredMap.set(action.name, deferred);
|
|
20
|
+
}
|
|
13
21
|
return Promise.resolve()
|
|
14
|
-
.then(() =>
|
|
22
|
+
.then(() => {
|
|
23
|
+
const promise = this.deps.actionExecution.runInContext(executionContext, action, DEFAULT_PAYLOAD);
|
|
24
|
+
if (isDeferredAction) {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
26
|
+
const deferred = this.deps.deferredMap.get(action.name);
|
|
27
|
+
// @todo check always: true actions
|
|
28
|
+
if (!deferred.isResolved() && !deferred.isRejected()) {
|
|
29
|
+
// eslint-disable-next-line promise/no-nesting
|
|
30
|
+
promise.then(deferred.resolve).catch(deferred.reject);
|
|
31
|
+
}
|
|
32
|
+
// eslint-disable-next-line promise/no-return-wrap
|
|
33
|
+
return Promise.resolve();
|
|
34
|
+
}
|
|
35
|
+
return promise;
|
|
36
|
+
})
|
|
15
37
|
.catch((error) => {
|
|
16
38
|
var _a;
|
|
17
39
|
if (!isSilentError(error)) {
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import type { Action, TramvaiAction } from '@tramvai/core';
|
|
1
|
+
import type { Action, ExtractDependencyType, TramvaiAction } from '@tramvai/core';
|
|
2
2
|
import type { LOGGER_TOKEN } from '@tramvai/module-log';
|
|
3
|
-
import type { COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import type { COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
4
4
|
import type { ActionExecution } from './actionExecution';
|
|
5
5
|
export declare class ActionPageRunner {
|
|
6
6
|
private deps;
|
|
7
|
-
log: ReturnType<typeof LOGGER_TOKEN
|
|
7
|
+
log: ReturnType<ExtractDependencyType<typeof LOGGER_TOKEN>>;
|
|
8
8
|
constructor(deps: {
|
|
9
9
|
actionExecution: ActionExecution;
|
|
10
|
-
executionContextManager: typeof EXECUTION_CONTEXT_MANAGER_TOKEN
|
|
11
|
-
commandLineExecutionContext: typeof COMMAND_LINE_EXECUTION_CONTEXT_TOKEN
|
|
12
|
-
logger: typeof LOGGER_TOKEN
|
|
10
|
+
executionContextManager: ExtractDependencyType<typeof EXECUTION_CONTEXT_MANAGER_TOKEN>;
|
|
11
|
+
commandLineExecutionContext: ExtractDependencyType<typeof COMMAND_LINE_EXECUTION_CONTEXT_TOKEN>;
|
|
12
|
+
logger: ExtractDependencyType<typeof LOGGER_TOKEN>;
|
|
13
|
+
deferredMap: ExtractDependencyType<typeof DEFERRED_ACTIONS_MAP_TOKEN>;
|
|
13
14
|
});
|
|
14
15
|
runActions(actions: Array<Action | TramvaiAction<any[], any, any>>, stopRunAtError?: (error: Error) => boolean): Promise<void>;
|
|
15
16
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtractDependencyType, TramvaiAction } from '@tramvai/core';
|
|
2
|
-
import type { LOGGER_TOKEN, ActionPageRunner as ActionPageRunnerInterface, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, ACTION_EXECUTION_TOKEN } from '@tramvai/tokens-common';
|
|
2
|
+
import type { LOGGER_TOKEN, ActionPageRunner as ActionPageRunnerInterface, STORE_TOKEN, EXECUTION_CONTEXT_MANAGER_TOKEN, COMMAND_LINE_EXECUTION_CONTEXT_TOKEN, ACTION_EXECUTION_TOKEN, DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import type { SERVER_RESPONSE_STREAM, SERVER_RESPONSE_TASK_MANAGER } from '@tramvai/tokens-server-private';
|
|
3
4
|
declare module '@tramvai/tokens-common' {
|
|
4
5
|
interface ExecutionContextValues {
|
|
5
6
|
pageActions?: boolean;
|
|
@@ -8,6 +9,9 @@ declare module '@tramvai/tokens-common' {
|
|
|
8
9
|
export declare class ActionPageRunner implements ActionPageRunnerInterface {
|
|
9
10
|
private deps;
|
|
10
11
|
private log;
|
|
12
|
+
private deferredMap;
|
|
13
|
+
private responseTaskManager;
|
|
14
|
+
private serverResponseStream;
|
|
11
15
|
constructor(deps: {
|
|
12
16
|
store: ExtractDependencyType<typeof STORE_TOKEN>;
|
|
13
17
|
actionExecution: ExtractDependencyType<typeof ACTION_EXECUTION_TOKEN>;
|
|
@@ -15,6 +19,9 @@ export declare class ActionPageRunner implements ActionPageRunnerInterface {
|
|
|
15
19
|
commandLineExecutionContext: ExtractDependencyType<typeof COMMAND_LINE_EXECUTION_CONTEXT_TOKEN>;
|
|
16
20
|
limitTime: number;
|
|
17
21
|
logger: ExtractDependencyType<typeof LOGGER_TOKEN>;
|
|
22
|
+
deferredMap: ExtractDependencyType<typeof DEFERRED_ACTIONS_MAP_TOKEN>;
|
|
23
|
+
responseTaskManager: ExtractDependencyType<typeof SERVER_RESPONSE_TASK_MANAGER> | null;
|
|
24
|
+
serverResponseStream: ExtractDependencyType<typeof SERVER_RESPONSE_STREAM> | null;
|
|
18
25
|
});
|
|
19
26
|
runActions(actions: Array<Action | TramvaiAction<any[], any, any>>, stopRunAtError?: (error: Error) => boolean): Promise<void>;
|
|
20
27
|
private syncStateActions;
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ACTION_PARAMETERS, isTramvaiAction } from '@tramvai/core';
|
|
2
2
|
import { isSilentError } from '@tinkoff/errors';
|
|
3
3
|
import { actionServerStateEvent } from './actionTramvaiReducer.es.js';
|
|
4
|
+
import { Deferred } from './deferred/deferred.es.js';
|
|
5
|
+
import { generateDeferredResolve, generateDeferredReject } from './deferred/clientScriptsUtils.es.js';
|
|
4
6
|
|
|
5
7
|
const DEFAULT_PAYLOAD = {};
|
|
6
8
|
class ActionPageRunner {
|
|
7
9
|
constructor(deps) {
|
|
8
10
|
this.deps = deps;
|
|
9
11
|
this.log = deps.logger('action:action-page-runner');
|
|
12
|
+
this.deferredMap = deps.deferredMap;
|
|
13
|
+
this.responseTaskManager = deps.responseTaskManager;
|
|
14
|
+
this.serverResponseStream = deps.serverResponseStream;
|
|
10
15
|
}
|
|
11
16
|
// TODO stopRunAtError нужен только для редиректов на стороне сервера в экшенах. И нужно пересмотреть реализацию редиректов
|
|
12
17
|
runActions(actions, stopRunAtError = () => false) {
|
|
@@ -32,8 +37,49 @@ class ActionPageRunner {
|
|
|
32
37
|
resolve();
|
|
33
38
|
};
|
|
34
39
|
const actionMapper = (action) => {
|
|
40
|
+
const isDeferredAction = ACTION_PARAMETERS in action && action[ACTION_PARAMETERS].deferred;
|
|
41
|
+
if (isDeferredAction && !this.deferredMap.get(action.name)) {
|
|
42
|
+
const deferred = new Deferred();
|
|
43
|
+
// avoid unhandled promise rejection
|
|
44
|
+
deferred.promise.catch(() => { });
|
|
45
|
+
this.deferredMap.set(action.name, deferred);
|
|
46
|
+
}
|
|
35
47
|
return Promise.resolve()
|
|
36
|
-
.then(() =>
|
|
48
|
+
.then(() => {
|
|
49
|
+
var _a;
|
|
50
|
+
const promise = this.deps.actionExecution.runInContext(executionContext, action, DEFAULT_PAYLOAD);
|
|
51
|
+
if (isDeferredAction) {
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
53
|
+
const deferred = this.deferredMap.get(action.name);
|
|
54
|
+
// eslint-disable-next-line promise/no-nesting
|
|
55
|
+
promise.then(deferred.resolve).catch(deferred.reject);
|
|
56
|
+
(_a = this.responseTaskManager) === null || _a === void 0 ? void 0 : _a.push(async () => {
|
|
57
|
+
// scripts will already be present on the page HTML
|
|
58
|
+
if (deferred.isResolved() || deferred.isRejected()) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line promise/no-nesting
|
|
62
|
+
await deferred.promise
|
|
63
|
+
.then((data) => {
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
65
|
+
this.serverResponseStream.push(`<script>${generateDeferredResolve({
|
|
66
|
+
key: action.name,
|
|
67
|
+
data,
|
|
68
|
+
})}</script>`);
|
|
69
|
+
})
|
|
70
|
+
.catch((reason) => {
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
72
|
+
this.serverResponseStream.push(`<script>${generateDeferredReject({
|
|
73
|
+
key: action.name,
|
|
74
|
+
error: reason,
|
|
75
|
+
})}</script>`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// eslint-disable-next-line promise/no-return-wrap
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
}
|
|
81
|
+
return promise;
|
|
82
|
+
})
|
|
37
83
|
.catch((error) => {
|
|
38
84
|
var _a;
|
|
39
85
|
const isCriticalError = stopRunAtError(error);
|
|
@@ -5,12 +5,17 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var core = require('@tramvai/core');
|
|
6
6
|
var errors = require('@tinkoff/errors');
|
|
7
7
|
var actionTramvaiReducer = require('./actionTramvaiReducer.js');
|
|
8
|
+
var deferred = require('./deferred/deferred.js');
|
|
9
|
+
var clientScriptsUtils = require('./deferred/clientScriptsUtils.js');
|
|
8
10
|
|
|
9
11
|
const DEFAULT_PAYLOAD = {};
|
|
10
12
|
class ActionPageRunner {
|
|
11
13
|
constructor(deps) {
|
|
12
14
|
this.deps = deps;
|
|
13
15
|
this.log = deps.logger('action:action-page-runner');
|
|
16
|
+
this.deferredMap = deps.deferredMap;
|
|
17
|
+
this.responseTaskManager = deps.responseTaskManager;
|
|
18
|
+
this.serverResponseStream = deps.serverResponseStream;
|
|
14
19
|
}
|
|
15
20
|
// TODO stopRunAtError нужен только для редиректов на стороне сервера в экшенах. И нужно пересмотреть реализацию редиректов
|
|
16
21
|
runActions(actions, stopRunAtError = () => false) {
|
|
@@ -36,8 +41,49 @@ class ActionPageRunner {
|
|
|
36
41
|
resolve();
|
|
37
42
|
};
|
|
38
43
|
const actionMapper = (action) => {
|
|
44
|
+
const isDeferredAction = core.ACTION_PARAMETERS in action && action[core.ACTION_PARAMETERS].deferred;
|
|
45
|
+
if (isDeferredAction && !this.deferredMap.get(action.name)) {
|
|
46
|
+
const deferred$1 = new deferred.Deferred();
|
|
47
|
+
// avoid unhandled promise rejection
|
|
48
|
+
deferred$1.promise.catch(() => { });
|
|
49
|
+
this.deferredMap.set(action.name, deferred$1);
|
|
50
|
+
}
|
|
39
51
|
return Promise.resolve()
|
|
40
|
-
.then(() =>
|
|
52
|
+
.then(() => {
|
|
53
|
+
var _a;
|
|
54
|
+
const promise = this.deps.actionExecution.runInContext(executionContext, action, DEFAULT_PAYLOAD);
|
|
55
|
+
if (isDeferredAction) {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
57
|
+
const deferred = this.deferredMap.get(action.name);
|
|
58
|
+
// eslint-disable-next-line promise/no-nesting
|
|
59
|
+
promise.then(deferred.resolve).catch(deferred.reject);
|
|
60
|
+
(_a = this.responseTaskManager) === null || _a === void 0 ? void 0 : _a.push(async () => {
|
|
61
|
+
// scripts will already be present on the page HTML
|
|
62
|
+
if (deferred.isResolved() || deferred.isRejected()) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// eslint-disable-next-line promise/no-nesting
|
|
66
|
+
await deferred.promise
|
|
67
|
+
.then((data) => {
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
69
|
+
this.serverResponseStream.push(`<script>${clientScriptsUtils.generateDeferredResolve({
|
|
70
|
+
key: action.name,
|
|
71
|
+
data,
|
|
72
|
+
})}</script>`);
|
|
73
|
+
})
|
|
74
|
+
.catch((reason) => {
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
76
|
+
this.serverResponseStream.push(`<script>${clientScriptsUtils.generateDeferredReject({
|
|
77
|
+
key: action.name,
|
|
78
|
+
error: reason,
|
|
79
|
+
})}</script>`);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// eslint-disable-next-line promise/no-return-wrap
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
}
|
|
85
|
+
return promise;
|
|
86
|
+
})
|
|
41
87
|
.catch((error) => {
|
|
42
88
|
var _a;
|
|
43
89
|
const isCriticalError = stopRunAtError(error);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useDi } from '@tramvai/react';
|
|
2
|
+
import { DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { deserializeError } from '@tramvai/safe-strings';
|
|
4
|
+
import { Deferred } from './deferred.browser.js';
|
|
5
|
+
|
|
6
|
+
function Await({ action, children, error, }) {
|
|
7
|
+
const deferredMap = useDi(DEFERRED_ACTIONS_MAP_TOKEN);
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
+
let deferred = deferredMap.get(action.name);
|
|
10
|
+
if (!action.deferred) {
|
|
11
|
+
throw new Error(`Action ${action.name} is not deferred`);
|
|
12
|
+
}
|
|
13
|
+
// for SPA-transitions, when actions will be called after rendering
|
|
14
|
+
if (!deferred) {
|
|
15
|
+
deferred = new Deferred();
|
|
16
|
+
// avoid unhandled promise rejection
|
|
17
|
+
deferred.promise.catch(() => { });
|
|
18
|
+
deferredMap.set(action.name, deferred);
|
|
19
|
+
}
|
|
20
|
+
if (deferred.isResolved()) {
|
|
21
|
+
return children(deferred.resolveData);
|
|
22
|
+
}
|
|
23
|
+
if (deferred.isRejected()) {
|
|
24
|
+
const reason = deferred.rejectReason instanceof Error
|
|
25
|
+
? deferred.rejectReason
|
|
26
|
+
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
27
|
+
deserializeError(deferred.rejectReason);
|
|
28
|
+
if (!error) {
|
|
29
|
+
throw reason;
|
|
30
|
+
}
|
|
31
|
+
return error(reason);
|
|
32
|
+
}
|
|
33
|
+
throw deferred.promise;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { Await };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TramvaiAction } from '@tramvai/types-actions-state-context';
|
|
2
|
+
export declare function Await<Result>({ action, children, error, }: {
|
|
3
|
+
action: TramvaiAction<any, Result, any>;
|
|
4
|
+
children: (data: Result extends Promise<infer R> ? R : Result) => JSX.Element;
|
|
5
|
+
error?: (reason: any) => JSX.Element;
|
|
6
|
+
}): JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useDi } from '@tramvai/react';
|
|
2
|
+
import { DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
import { deserializeError } from '@tramvai/safe-strings';
|
|
4
|
+
import { Deferred } from './deferred.es.js';
|
|
5
|
+
|
|
6
|
+
function Await({ action, children, error, }) {
|
|
7
|
+
const deferredMap = useDi(DEFERRED_ACTIONS_MAP_TOKEN);
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
+
let deferred = deferredMap.get(action.name);
|
|
10
|
+
if (!action.deferred) {
|
|
11
|
+
throw new Error(`Action ${action.name} is not deferred`);
|
|
12
|
+
}
|
|
13
|
+
// for SPA-transitions, when actions will be called after rendering
|
|
14
|
+
if (!deferred) {
|
|
15
|
+
deferred = new Deferred();
|
|
16
|
+
// avoid unhandled promise rejection
|
|
17
|
+
deferred.promise.catch(() => { });
|
|
18
|
+
deferredMap.set(action.name, deferred);
|
|
19
|
+
}
|
|
20
|
+
if (deferred.isResolved()) {
|
|
21
|
+
return children(deferred.resolveData);
|
|
22
|
+
}
|
|
23
|
+
if (deferred.isRejected()) {
|
|
24
|
+
const reason = deferred.rejectReason instanceof Error
|
|
25
|
+
? deferred.rejectReason
|
|
26
|
+
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
27
|
+
deserializeError(deferred.rejectReason);
|
|
28
|
+
if (!error) {
|
|
29
|
+
throw reason;
|
|
30
|
+
}
|
|
31
|
+
return error(reason);
|
|
32
|
+
}
|
|
33
|
+
throw deferred.promise;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { Await };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var react = require('@tramvai/react');
|
|
6
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
7
|
+
var safeStrings = require('@tramvai/safe-strings');
|
|
8
|
+
var deferred = require('./deferred.js');
|
|
9
|
+
|
|
10
|
+
function Await({ action, children, error, }) {
|
|
11
|
+
const deferredMap = react.useDi(tokensCommon.DEFERRED_ACTIONS_MAP_TOKEN);
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
13
|
+
let deferred$1 = deferredMap.get(action.name);
|
|
14
|
+
if (!action.deferred) {
|
|
15
|
+
throw new Error(`Action ${action.name} is not deferred`);
|
|
16
|
+
}
|
|
17
|
+
// for SPA-transitions, when actions will be called after rendering
|
|
18
|
+
if (!deferred$1) {
|
|
19
|
+
deferred$1 = new deferred.Deferred();
|
|
20
|
+
// avoid unhandled promise rejection
|
|
21
|
+
deferred$1.promise.catch(() => { });
|
|
22
|
+
deferredMap.set(action.name, deferred$1);
|
|
23
|
+
}
|
|
24
|
+
if (deferred$1.isResolved()) {
|
|
25
|
+
return children(deferred$1.resolveData);
|
|
26
|
+
}
|
|
27
|
+
if (deferred$1.isRejected()) {
|
|
28
|
+
const reason = deferred$1.rejectReason instanceof Error
|
|
29
|
+
? deferred$1.rejectReason
|
|
30
|
+
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
31
|
+
safeStrings.deserializeError(deferred$1.rejectReason);
|
|
32
|
+
if (!error) {
|
|
33
|
+
throw reason;
|
|
34
|
+
}
|
|
35
|
+
return error(reason);
|
|
36
|
+
}
|
|
37
|
+
throw deferred$1.promise;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.Await = Await;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { safeStringifyJSON, serializeError } from '@tramvai/safe-strings';
|
|
2
|
+
|
|
3
|
+
const generateDeferredResolve = ({ key, data }) => {
|
|
4
|
+
return `window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].resolve(${safeStringifyJSON(data)});`;
|
|
5
|
+
};
|
|
6
|
+
const generateDeferredReject = ({ key, error }) => {
|
|
7
|
+
return `window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].reject(${safeStringifyJSON(serializeError(error))});`;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { generateDeferredReject, generateDeferredResolve };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var safeStrings = require('@tramvai/safe-strings');
|
|
6
|
+
|
|
7
|
+
const generateDeferredResolve = ({ key, data }) => {
|
|
8
|
+
return `window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].resolve(${safeStrings.safeStringifyJSON(data)});`;
|
|
9
|
+
};
|
|
10
|
+
const generateDeferredReject = ({ key, error }) => {
|
|
11
|
+
return `window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].reject(${safeStrings.safeStringifyJSON(safeStrings.serializeError(error))});`;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.generateDeferredReject = generateDeferredReject;
|
|
15
|
+
exports.generateDeferredResolve = generateDeferredResolve;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Deferred {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.promise = new Promise((resolve, reject) => {
|
|
4
|
+
this.resolve = (value) => {
|
|
5
|
+
this.resolveData = value;
|
|
6
|
+
resolve(value);
|
|
7
|
+
};
|
|
8
|
+
this.reject = (reason) => {
|
|
9
|
+
this.rejectReason = reason;
|
|
10
|
+
reject(reason);
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
isResolved() {
|
|
15
|
+
return typeof this.resolveData !== 'undefined';
|
|
16
|
+
}
|
|
17
|
+
isRejected() {
|
|
18
|
+
return typeof this.rejectReason !== 'undefined';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { Deferred };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Deferred as IDeferred } from '@tramvai/tokens-common';
|
|
2
|
+
export declare class Deferred implements IDeferred {
|
|
3
|
+
promise: Promise<any>;
|
|
4
|
+
resolve: (value: any) => void;
|
|
5
|
+
reject: (reason: any) => void;
|
|
6
|
+
resolveData: any;
|
|
7
|
+
rejectReason: any;
|
|
8
|
+
constructor();
|
|
9
|
+
isResolved(): boolean;
|
|
10
|
+
isRejected(): boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Deferred {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.promise = new Promise((resolve, reject) => {
|
|
4
|
+
this.resolve = (value) => {
|
|
5
|
+
this.resolveData = value;
|
|
6
|
+
resolve(value);
|
|
7
|
+
};
|
|
8
|
+
this.reject = (reason) => {
|
|
9
|
+
this.rejectReason = reason;
|
|
10
|
+
reject(reason);
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
isResolved() {
|
|
15
|
+
return typeof this.resolveData !== 'undefined';
|
|
16
|
+
}
|
|
17
|
+
isRejected() {
|
|
18
|
+
return typeof this.rejectReason !== 'undefined';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { Deferred };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
function __Deferred() {
|
|
2
|
+
this.promise = new Promise((resolve, reject) => {
|
|
3
|
+
this.resolve = (value) => {
|
|
4
|
+
this.resolveData = value;
|
|
5
|
+
resolve(value);
|
|
6
|
+
};
|
|
7
|
+
this.reject = (reason) => {
|
|
8
|
+
this.rejectReason = reason;
|
|
9
|
+
reject(reason);
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
this.isResolved = () => {
|
|
13
|
+
return typeof this.resolveData !== 'undefined';
|
|
14
|
+
};
|
|
15
|
+
this.isRejected = () => {
|
|
16
|
+
return typeof this.rejectReason !== 'undefined';
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { __Deferred };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
function __Deferred() {
|
|
6
|
+
this.promise = new Promise((resolve, reject) => {
|
|
7
|
+
this.resolve = (value) => {
|
|
8
|
+
this.resolveData = value;
|
|
9
|
+
resolve(value);
|
|
10
|
+
};
|
|
11
|
+
this.reject = (reason) => {
|
|
12
|
+
this.rejectReason = reason;
|
|
13
|
+
reject(reason);
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
this.isResolved = () => {
|
|
17
|
+
return typeof this.resolveData !== 'undefined';
|
|
18
|
+
};
|
|
19
|
+
this.isRejected = () => {
|
|
20
|
+
return typeof this.rejectReason !== 'undefined';
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.__Deferred = __Deferred;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
class Deferred {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.promise = new Promise((resolve, reject) => {
|
|
8
|
+
this.resolve = (value) => {
|
|
9
|
+
this.resolveData = value;
|
|
10
|
+
resolve(value);
|
|
11
|
+
};
|
|
12
|
+
this.reject = (reason) => {
|
|
13
|
+
this.rejectReason = reason;
|
|
14
|
+
reject(reason);
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
isResolved() {
|
|
19
|
+
return typeof this.resolveData !== 'undefined';
|
|
20
|
+
}
|
|
21
|
+
isRejected() {
|
|
22
|
+
return typeof this.rejectReason !== 'undefined';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.Deferred = Deferred;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { provide } from '@tramvai/core';
|
|
2
|
+
import { DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
3
|
+
|
|
4
|
+
const providers = [
|
|
5
|
+
provide({
|
|
6
|
+
provide: DEFERRED_ACTIONS_MAP_TOKEN,
|
|
7
|
+
useFactory: () => {
|
|
8
|
+
return {
|
|
9
|
+
get(key) {
|
|
10
|
+
return window.__TRAMVAI_DEFERRED_ACTIONS[key];
|
|
11
|
+
},
|
|
12
|
+
set(key, value) {
|
|
13
|
+
window.__TRAMVAI_DEFERRED_ACTIONS[key] = value;
|
|
14
|
+
},
|
|
15
|
+
has(key) {
|
|
16
|
+
return key in window.__TRAMVAI_DEFERRED_ACTIONS;
|
|
17
|
+
},
|
|
18
|
+
forEach(callback) {
|
|
19
|
+
Object.keys(window.__TRAMVAI_DEFERRED_ACTIONS).forEach((key) => {
|
|
20
|
+
callback(window.__TRAMVAI_DEFERRED_ACTIONS[key], key);
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export { providers };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Deferred } from '@tramvai/tokens-common';
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
__TRAMVAI_DEFERRED_ACTIONS: Record<string, Deferred>;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export declare const providers: import("@tramvai/core").Provider<unknown, import("@tramvai/tokens-common").DeferredActionsMap & {
|
|
8
|
+
__type?: "base token" | undefined;
|
|
9
|
+
}>[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const providers: (import("@tramvai/core").Provider<unknown, import("@tramvai/tokens-common").DeferredActionsMap & {
|
|
2
|
+
__type?: "base token" | undefined;
|
|
3
|
+
}> | import("@tramvai/core").Provider<{
|
|
4
|
+
resourcesRegistry: import("@tramvai/tokens-render").ResourcesRegistry & {
|
|
5
|
+
__type?: "base token" | undefined;
|
|
6
|
+
};
|
|
7
|
+
deferredMap: import("@tramvai/tokens-common").DeferredActionsMap & {
|
|
8
|
+
__type?: "base token" | undefined;
|
|
9
|
+
};
|
|
10
|
+
renderMode: {
|
|
11
|
+
token: ("sync" & {
|
|
12
|
+
__type?: "base token" | undefined;
|
|
13
|
+
}) | ("streaming" & {
|
|
14
|
+
__type?: "base token" | undefined;
|
|
15
|
+
});
|
|
16
|
+
optional: true;
|
|
17
|
+
};
|
|
18
|
+
}, import("@tramvai/core").Command & {
|
|
19
|
+
__type?: "multi token" | undefined;
|
|
20
|
+
}>)[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { provide, commandLineListTokens, optional } from '@tramvai/core';
|
|
2
|
+
import { ResourceSlot, ResourceType, RESOURCES_REGISTRY, REACT_SERVER_RENDER_MODE } from '@tramvai/tokens-render';
|
|
3
|
+
import { DEFERRED_ACTIONS_MAP_TOKEN } from '@tramvai/tokens-common';
|
|
4
|
+
import { __Deferred } from './deferred.inline.es.js';
|
|
5
|
+
import { generateDeferredResolve, generateDeferredReject } from './clientScriptsUtils.es.js';
|
|
6
|
+
|
|
7
|
+
const providers = [
|
|
8
|
+
provide({
|
|
9
|
+
provide: DEFERRED_ACTIONS_MAP_TOKEN,
|
|
10
|
+
useFactory: () => new Map(),
|
|
11
|
+
}),
|
|
12
|
+
provide({
|
|
13
|
+
provide: commandLineListTokens.generatePage,
|
|
14
|
+
useFactory: ({ resourcesRegistry, deferredMap, renderMode }) => {
|
|
15
|
+
// eslint-disable-next-line max-statements
|
|
16
|
+
return async function render() {
|
|
17
|
+
if (renderMode === 'streaming') {
|
|
18
|
+
resourcesRegistry.register({
|
|
19
|
+
slot: ResourceSlot.HEAD_CORE_SCRIPTS,
|
|
20
|
+
type: ResourceType.inlineScript,
|
|
21
|
+
payload: `window.__Deferred = ${__Deferred}
|
|
22
|
+
window.__TRAMVAI_DEFERRED_ACTIONS = {};`,
|
|
23
|
+
});
|
|
24
|
+
deferredMap.forEach((deferred, key) => {
|
|
25
|
+
const scriptLines = [
|
|
26
|
+
`window.__TRAMVAI_DEFERRED_ACTIONS['${key}'] = new __Deferred();`,
|
|
27
|
+
`window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].promise.catch(function(){});`,
|
|
28
|
+
];
|
|
29
|
+
if (deferred.isResolved()) {
|
|
30
|
+
scriptLines.push(generateDeferredResolve({
|
|
31
|
+
key,
|
|
32
|
+
data: deferred.resolveData,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
else if (deferred.isRejected()) {
|
|
36
|
+
scriptLines.push(generateDeferredReject({
|
|
37
|
+
key,
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
39
|
+
error: deferred.rejectReason,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
resourcesRegistry.register({
|
|
43
|
+
slot: ResourceSlot.HEAD_CORE_SCRIPTS,
|
|
44
|
+
type: ResourceType.inlineScript,
|
|
45
|
+
payload: scriptLines.join('\n'),
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
deps: {
|
|
52
|
+
resourcesRegistry: RESOURCES_REGISTRY,
|
|
53
|
+
deferredMap: DEFERRED_ACTIONS_MAP_TOKEN,
|
|
54
|
+
renderMode: optional(REACT_SERVER_RENDER_MODE),
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
export { providers };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@tramvai/core');
|
|
6
|
+
var tokensRender = require('@tramvai/tokens-render');
|
|
7
|
+
var tokensCommon = require('@tramvai/tokens-common');
|
|
8
|
+
var deferred_inline = require('./deferred.inline.js');
|
|
9
|
+
var clientScriptsUtils = require('./clientScriptsUtils.js');
|
|
10
|
+
|
|
11
|
+
const providers = [
|
|
12
|
+
core.provide({
|
|
13
|
+
provide: tokensCommon.DEFERRED_ACTIONS_MAP_TOKEN,
|
|
14
|
+
useFactory: () => new Map(),
|
|
15
|
+
}),
|
|
16
|
+
core.provide({
|
|
17
|
+
provide: core.commandLineListTokens.generatePage,
|
|
18
|
+
useFactory: ({ resourcesRegistry, deferredMap, renderMode }) => {
|
|
19
|
+
// eslint-disable-next-line max-statements
|
|
20
|
+
return async function render() {
|
|
21
|
+
if (renderMode === 'streaming') {
|
|
22
|
+
resourcesRegistry.register({
|
|
23
|
+
slot: tokensRender.ResourceSlot.HEAD_CORE_SCRIPTS,
|
|
24
|
+
type: tokensRender.ResourceType.inlineScript,
|
|
25
|
+
payload: `window.__Deferred = ${deferred_inline.__Deferred}
|
|
26
|
+
window.__TRAMVAI_DEFERRED_ACTIONS = {};`,
|
|
27
|
+
});
|
|
28
|
+
deferredMap.forEach((deferred, key) => {
|
|
29
|
+
const scriptLines = [
|
|
30
|
+
`window.__TRAMVAI_DEFERRED_ACTIONS['${key}'] = new __Deferred();`,
|
|
31
|
+
`window.__TRAMVAI_DEFERRED_ACTIONS['${key}'].promise.catch(function(){});`,
|
|
32
|
+
];
|
|
33
|
+
if (deferred.isResolved()) {
|
|
34
|
+
scriptLines.push(clientScriptsUtils.generateDeferredResolve({
|
|
35
|
+
key,
|
|
36
|
+
data: deferred.resolveData,
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
else if (deferred.isRejected()) {
|
|
40
|
+
scriptLines.push(clientScriptsUtils.generateDeferredReject({
|
|
41
|
+
key,
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
43
|
+
error: deferred.rejectReason,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
resourcesRegistry.register({
|
|
47
|
+
slot: tokensRender.ResourceSlot.HEAD_CORE_SCRIPTS,
|
|
48
|
+
type: tokensRender.ResourceType.inlineScript,
|
|
49
|
+
payload: scriptLines.join('\n'),
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
deps: {
|
|
56
|
+
resourcesRegistry: tokensRender.RESOURCES_REGISTRY,
|
|
57
|
+
deferredMap: tokensCommon.DEFERRED_ACTIONS_MAP_TOKEN,
|
|
58
|
+
renderMode: core.optional(tokensRender.REACT_SERVER_RENDER_MODE),
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
exports.providers = providers;
|
package/lib/index.browser.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { CommonModule } from './CommonModule.browser.js';
|
|
2
2
|
export { CommandModule } from './command/CommandModule.browser.js';
|
|
3
3
|
export { ActionExecution } from './actions/actionExecution.browser.js';
|
|
4
|
+
export { Deferred } from './actions/deferred/deferred.browser.js';
|
|
5
|
+
export { Await } from './actions/deferred/await.browser.js';
|
|
4
6
|
export { ExecutionContextManager } from './executionContext/executionContextManager.browser.js';
|
|
5
7
|
import './actions/ActionModule.browser.js';
|
|
6
8
|
export { createConsumerContext } from './createConsumerContext/createConsumerContext.browser.js';
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { CommonModule } from './CommonModule';
|
|
2
2
|
export { CommandModule } from './command/CommandModule';
|
|
3
3
|
export { ActionExecution } from './actions/actionExecution';
|
|
4
|
+
export { Deferred } from './actions/deferred/deferred';
|
|
5
|
+
export { Await } from './actions/deferred/await';
|
|
4
6
|
export { ExecutionContextManager } from './executionContext/executionContextManager';
|
|
5
7
|
export { alwaysCondition, onlyServer, onlyBrowser, pageServer, pageBrowser, } from './actions/ActionModule';
|
|
6
8
|
export { createConsumerContext } from './createConsumerContext/createConsumerContext';
|
package/lib/index.es.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { CommonModule } from './CommonModule.es.js';
|
|
2
2
|
export { CommandModule } from './command/CommandModule.es.js';
|
|
3
3
|
export { ActionExecution } from './actions/actionExecution.es.js';
|
|
4
|
+
export { Deferred } from './actions/deferred/deferred.es.js';
|
|
5
|
+
export { Await } from './actions/deferred/await.es.js';
|
|
4
6
|
export { ExecutionContextManager } from './executionContext/executionContextManager.es.js';
|
|
5
7
|
import './actions/ActionModule.es.js';
|
|
6
8
|
export { createConsumerContext } from './createConsumerContext/createConsumerContext.es.js';
|
package/lib/index.js
CHANGED
|
@@ -5,6 +5,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var CommonModule = require('./CommonModule.js');
|
|
6
6
|
var CommandModule = require('./command/CommandModule.js');
|
|
7
7
|
var actionExecution = require('./actions/actionExecution.js');
|
|
8
|
+
var deferred = require('./actions/deferred/deferred.js');
|
|
9
|
+
var _await = require('./actions/deferred/await.js');
|
|
8
10
|
var executionContextManager = require('./executionContext/executionContextManager.js');
|
|
9
11
|
require('./actions/ActionModule.js');
|
|
10
12
|
var createConsumerContext = require('./createConsumerContext/createConsumerContext.js');
|
|
@@ -28,6 +30,8 @@ Object.defineProperty(exports, 'CommandModule', {
|
|
|
28
30
|
get: function () { return CommandModule.CommandModule; }
|
|
29
31
|
});
|
|
30
32
|
exports.ActionExecution = actionExecution.ActionExecution;
|
|
33
|
+
exports.Deferred = deferred.Deferred;
|
|
34
|
+
exports.Await = _await.Await;
|
|
31
35
|
exports.ExecutionContextManager = executionContextManager.ExecutionContextManager;
|
|
32
36
|
exports.createConsumerContext = createConsumerContext.createConsumerContext;
|
|
33
37
|
Object.defineProperty(exports, 'CommonChildAppModule', {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tramvai/module-common",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.145.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
],
|
|
11
11
|
"browser": {
|
|
12
12
|
"./lib/actions/actionPageRunner.js": "./lib/actions/actionPageRunner.browser.js",
|
|
13
|
+
"./lib/actions/deferred/providers.js": "./lib/actions/deferred/providers.browser.js",
|
|
13
14
|
"./lib/cache/serverProviders.js": "./lib/cache/clientProviders.js",
|
|
14
15
|
"./lib/cache/cacheFactory.js": "./lib/cache/cacheFactory.browser.js",
|
|
15
16
|
"./lib/index.es.js": "./lib/index.browser.js",
|
|
@@ -34,28 +35,29 @@
|
|
|
34
35
|
"@akashbabu/lfu-cache": "1.0.2",
|
|
35
36
|
"@tinkoff/pubsub": "0.5.7",
|
|
36
37
|
"@tinkoff/url": "0.8.6",
|
|
37
|
-
"@tramvai/
|
|
38
|
-
"@tramvai/
|
|
39
|
-
"@tramvai/module-
|
|
40
|
-
"@tramvai/module-
|
|
41
|
-
"@tramvai/
|
|
42
|
-
"@tramvai/tokens-
|
|
43
|
-
"@tramvai/tokens-
|
|
44
|
-
"@tramvai/tokens-
|
|
45
|
-
"@tramvai/tokens-
|
|
46
|
-
"@tramvai/
|
|
38
|
+
"@tramvai/safe-strings": "0.5.12",
|
|
39
|
+
"@tramvai/experiments": "2.145.0",
|
|
40
|
+
"@tramvai/module-cookie": "2.145.0",
|
|
41
|
+
"@tramvai/module-environment": "2.145.0",
|
|
42
|
+
"@tramvai/module-log": "2.145.0",
|
|
43
|
+
"@tramvai/tokens-child-app": "2.145.0",
|
|
44
|
+
"@tramvai/tokens-core-private": "2.145.0",
|
|
45
|
+
"@tramvai/tokens-common": "2.145.0",
|
|
46
|
+
"@tramvai/tokens-render": "2.145.0",
|
|
47
|
+
"@tramvai/tokens-server-private": "2.145.0",
|
|
48
|
+
"@tramvai/types-actions-state-context": "2.145.0",
|
|
47
49
|
"hoist-non-react-statics": "^3.3.1",
|
|
48
50
|
"node-abort-controller": "^3.0.1"
|
|
49
51
|
},
|
|
50
52
|
"peerDependencies": {
|
|
51
53
|
"@tinkoff/dippy": "0.8.15",
|
|
52
54
|
"@tinkoff/utils": "^2.1.2",
|
|
53
|
-
"@tramvai/cli": "2.
|
|
54
|
-
"@tramvai/core": "2.
|
|
55
|
-
"@tramvai/papi": "2.
|
|
56
|
-
"@tramvai/react": "2.
|
|
57
|
-
"@tramvai/state": "2.
|
|
58
|
-
"@tramvai/tokens-server": "2.
|
|
55
|
+
"@tramvai/cli": "2.145.0",
|
|
56
|
+
"@tramvai/core": "2.145.0",
|
|
57
|
+
"@tramvai/papi": "2.145.0",
|
|
58
|
+
"@tramvai/react": "2.145.0",
|
|
59
|
+
"@tramvai/state": "2.145.0",
|
|
60
|
+
"@tramvai/tokens-server": "2.145.0",
|
|
59
61
|
"react": ">=16.14.0",
|
|
60
62
|
"tslib": "^2.4.0"
|
|
61
63
|
},
|