@alfalab/bridge-to-native 1.0.2 → 1.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.
- package/client/bridge-to-native.d.ts +4 -0
- package/client/bridge-to-native.js +6 -0
- package/client/services-and-utils/native-params-service.d.ts +1 -0
- package/client/services-and-utils/native-params-service.js +1 -0
- package/package.json +4 -3
- package/query-and-headers-keys.d.ts +1 -0
- package/query-and-headers-keys.js +3 -1
- package/server/prepare-native-app-details-for-client.js +4 -0
- package/server/utils.d.ts +6 -0
- package/server/utils.js +12 -0
- package/types.d.ts +1 -0
|
@@ -46,6 +46,10 @@ export declare class BridgeToNative {
|
|
|
46
46
|
* Тема (светлая/тёмная), в котором работает NA.
|
|
47
47
|
*/
|
|
48
48
|
get theme(): import("./types").Theme;
|
|
49
|
+
/**
|
|
50
|
+
* Время старта открытия WV экрана в формате timestamp. Значение никак не меняется в процессе всей жизни WV экрана.
|
|
51
|
+
*/
|
|
52
|
+
get webviewLaunchTime(): number | null;
|
|
49
53
|
/**
|
|
50
54
|
* Метод, проверяющий, можно ли использовать ли указанную функциональность
|
|
51
55
|
* в текущей версии NA.
|
|
@@ -62,6 +62,12 @@ class BridgeToNative {
|
|
|
62
62
|
get theme() {
|
|
63
63
|
return this.nativeParamsService.theme;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Время старта открытия WV экрана в формате timestamp. Значение никак не меняется в процессе всей жизни WV экрана.
|
|
67
|
+
*/
|
|
68
|
+
get webviewLaunchTime() {
|
|
69
|
+
return this.nativeParamsService.webviewLaunchTime;
|
|
70
|
+
}
|
|
65
71
|
/**
|
|
66
72
|
* Метод, проверяющий, можно ли использовать ли указанную функциональность
|
|
67
73
|
* в текущей версии NA.
|
|
@@ -15,6 +15,7 @@ export declare class NativeParamsService {
|
|
|
15
15
|
originalWebviewParams: string | null;
|
|
16
16
|
theme: Theme;
|
|
17
17
|
title: string;
|
|
18
|
+
webviewLaunchTime: number | null;
|
|
18
19
|
constructor(logError?: LogError | undefined);
|
|
19
20
|
canUseNativeFeature(feature: NativeFeatureKey): boolean;
|
|
20
21
|
isCurrentVersionHigherOrEqual(versionToCompare: string): boolean;
|
|
@@ -21,6 +21,7 @@ class NativeParamsService {
|
|
|
21
21
|
this.originalWebviewParams = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.originalWebviewParams) || null;
|
|
22
22
|
this.theme = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.theme) === 'dark' ? 'dark' : 'light';
|
|
23
23
|
this.title = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.title) || '';
|
|
24
|
+
this.webviewLaunchTime = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.webviewLaunchTime) || null;
|
|
24
25
|
}
|
|
25
26
|
canUseNativeFeature(feature) {
|
|
26
27
|
const { fromVersion } = constants_1.NATIVE_FEATURES_FROM_VERSION[this.environment][feature];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/bridge-to-native",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Утилита для удобной работы веб приложения внутри нативного приложения и коммуникации с ним.",
|
|
6
6
|
"engines": {
|
|
@@ -111,11 +111,12 @@
|
|
|
111
111
|
"stylelint": {
|
|
112
112
|
"extends": "arui-presets-lint/stylelint",
|
|
113
113
|
"ignoreFiles": [
|
|
114
|
-
"coverage/**/*.js"
|
|
114
|
+
"coverage/**/*.js",
|
|
115
|
+
".yarn/releases/*"
|
|
115
116
|
]
|
|
116
117
|
},
|
|
117
118
|
"publishConfig": {
|
|
118
119
|
"registry": "https://registry.npmjs.org"
|
|
119
120
|
},
|
|
120
|
-
"packageManager": "yarn@
|
|
121
|
+
"packageManager": "yarn@4.12.0"
|
|
121
122
|
}
|
|
@@ -3,6 +3,7 @@ export declare const HEADER_KEY_USER_AGENT = "user-agent";
|
|
|
3
3
|
export declare const COOKIE_KEY_BRIDGE_TO_NATIVE_DATA = "bridgeToNativeData";
|
|
4
4
|
export declare const COOKIE_KEY_BRIDGE_TO_NATIVE_RELOAD = "bridgeToNativeReload";
|
|
5
5
|
export declare const HEADER_KEY_NATIVE_APPVERSION = "app-version";
|
|
6
|
+
export declare const HEADER_KEY_WV_LAUNCH_TIME = "webview-launch-time";
|
|
6
7
|
export declare const QUERY_B2N_NEXT_PAGEID = "b2n-next-page-id";
|
|
7
8
|
export declare const QUERY_B2N_TITLE = "b2n-title";
|
|
8
9
|
export declare const QUERY_B2N_TITLE_DEPRECATED = "title";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Ключи стандартных заголовков.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SS_KEY_BRIDGE_TO_NATIVE_HISTORY_STACK = exports.QUERY_NATIVE_THEME = exports.QUERY_NATIVE_IOS_APPVERSION = exports.QUERY_NATIVE_IOS_APPID = exports.QUERY_B2N_TITLE_DEPRECATED = exports.QUERY_B2N_TITLE = exports.QUERY_B2N_NEXT_PAGEID = exports.HEADER_KEY_NATIVE_APPVERSION = exports.COOKIE_KEY_BRIDGE_TO_NATIVE_RELOAD = exports.COOKIE_KEY_BRIDGE_TO_NATIVE_DATA = exports.HEADER_KEY_USER_AGENT = exports.HEADER_KEY_COOKIE = void 0;
|
|
6
|
+
exports.SS_KEY_BRIDGE_TO_NATIVE_HISTORY_STACK = exports.QUERY_NATIVE_THEME = exports.QUERY_NATIVE_IOS_APPVERSION = exports.QUERY_NATIVE_IOS_APPID = exports.QUERY_B2N_TITLE_DEPRECATED = exports.QUERY_B2N_TITLE = exports.QUERY_B2N_NEXT_PAGEID = exports.HEADER_KEY_WV_LAUNCH_TIME = exports.HEADER_KEY_NATIVE_APPVERSION = exports.COOKIE_KEY_BRIDGE_TO_NATIVE_RELOAD = exports.COOKIE_KEY_BRIDGE_TO_NATIVE_DATA = exports.HEADER_KEY_USER_AGENT = exports.HEADER_KEY_COOKIE = void 0;
|
|
7
7
|
exports.HEADER_KEY_COOKIE = 'cookie';
|
|
8
8
|
exports.HEADER_KEY_USER_AGENT = 'user-agent';
|
|
9
9
|
/*
|
|
@@ -21,6 +21,8 @@ exports.COOKIE_KEY_BRIDGE_TO_NATIVE_RELOAD = 'bridgeToNativeReload';
|
|
|
21
21
|
// * Есть подозрение на некоторую нестабильность — возможно делает это
|
|
22
22
|
// только для первого документа в вебвью-сессии. Исследовать.
|
|
23
23
|
exports.HEADER_KEY_NATIVE_APPVERSION = 'app-version';
|
|
24
|
+
// Ключ заголовка, в котором передается время старта открытия WV экрана в формате timestamp
|
|
25
|
+
exports.HEADER_KEY_WV_LAUNCH_TIME = 'webview-launch-time';
|
|
24
26
|
// Флаг, предписывающий клиентскому коду B2N начать связь
|
|
25
27
|
// с нативным приложением с указанного в этом параметре id, а не с 1.
|
|
26
28
|
// Необходимо для server-side навигации.
|
|
@@ -54,6 +54,7 @@ function parseRequest(request) {
|
|
|
54
54
|
query_and_headers_keys_1.QUERY_B2N_TITLE_DEPRECATED,
|
|
55
55
|
]);
|
|
56
56
|
const appVersionFromHeaders = (0, utils_1.getHeaderValue)(request, query_and_headers_keys_1.HEADER_KEY_NATIVE_APPVERSION);
|
|
57
|
+
const webviewLaunchTime = (0, utils_1.parseHeaderTimestamp)((0, utils_1.getHeaderValue)(request, query_and_headers_keys_1.HEADER_KEY_WV_LAUNCH_TIME));
|
|
57
58
|
const nativeParams = {
|
|
58
59
|
originalWebviewParams,
|
|
59
60
|
theme: theme || 'light',
|
|
@@ -84,6 +85,9 @@ function parseRequest(request) {
|
|
|
84
85
|
else if (typeof deprecatedTitle === 'string') {
|
|
85
86
|
nativeParams.title = deprecatedTitle;
|
|
86
87
|
}
|
|
88
|
+
if (webviewLaunchTime) {
|
|
89
|
+
nativeParams.webviewLaunchTime = webviewLaunchTime;
|
|
90
|
+
}
|
|
87
91
|
return nativeParams;
|
|
88
92
|
}
|
|
89
93
|
// Возвращает результат сравнения темы полученной, из query-параметров
|
package/server/utils.d.ts
CHANGED
|
@@ -23,3 +23,9 @@ export declare function getQueryValues(request: UniversalRequest, queryKeys: str
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function hasBridgeToNativeDataCookie(cookieHeader: string | null): boolean;
|
|
25
25
|
export declare function parseCookies(cookieHeader: string): Record<string, string>;
|
|
26
|
+
/**
|
|
27
|
+
* Преобразует значение из заголовка в timestamp
|
|
28
|
+
*
|
|
29
|
+
* @param headerValue Значение заголовка
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseHeaderTimestamp(headerValue: string | number | null): number | null;
|
package/server/utils.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.getHeaderValue = getHeaderValue;
|
|
|
4
4
|
exports.getQueryValues = getQueryValues;
|
|
5
5
|
exports.hasBridgeToNativeDataCookie = hasBridgeToNativeDataCookie;
|
|
6
6
|
exports.parseCookies = parseCookies;
|
|
7
|
+
exports.parseHeaderTimestamp = parseHeaderTimestamp;
|
|
7
8
|
const regexp_patterns_1 = require("./regexp-patterns");
|
|
8
9
|
/**
|
|
9
10
|
* На основе объекта запроса любого типа возвращает
|
|
@@ -51,3 +52,14 @@ function parseCookies(cookieHeader) {
|
|
|
51
52
|
return acc;
|
|
52
53
|
}, {});
|
|
53
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Преобразует значение из заголовка в timestamp
|
|
57
|
+
*
|
|
58
|
+
* @param headerValue Значение заголовка
|
|
59
|
+
*/
|
|
60
|
+
function parseHeaderTimestamp(headerValue) {
|
|
61
|
+
if (!headerValue || (typeof headerValue === 'string' && !headerValue?.trim()))
|
|
62
|
+
return null;
|
|
63
|
+
const timestamp = Number(headerValue);
|
|
64
|
+
return Number.isFinite(timestamp) ? timestamp : null;
|
|
65
|
+
}
|