在上下文中增加briefEnv,更正了locale的一个小bug

This commit is contained in:
Xu Chang 2023-11-30 16:58:32 +08:00
parent b6fcaa83fb
commit 9a2d941432
34 changed files with 232 additions and 62 deletions

View File

@ -2,9 +2,12 @@ import { EntityDict } from 'oak-domain/lib/base-app-domain';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/types/Entity';
import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { SerializedData } from './FrontendRuntimeContext';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
export declare abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDict> extends AsyncContext<ED> {
private subscriberId?;
private be?;
getSubscriberId(): string | undefined;
getBriefEnvironment(): BriefEnv | undefined;
protected getSerializedData(): SerializedData;
initialize(data?: SerializedData): Promise<void>;
}

View File

@ -1,17 +1,25 @@
import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
export class BackendRuntimeContext extends AsyncContext {
subscriberId;
be;
getSubscriberId() {
return this.subscriberId;
}
getBriefEnvironment() {
return this.be;
}
getSerializedData() {
return {
sid: this.subscriberId,
be: this.be,
};
}
async initialize(data) {
if (data?.sid) {
this.subscriberId = data.sid;
}
if (data?.be) {
this.be = data.be;
}
}
}

View File

@ -5,12 +5,16 @@ import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { CommonAspectDict } from 'oak-common-aspect';
import { Aspect } from 'oak-domain/lib/types';
import { SubScriber } from '../features/subscriber';
import { Environment } from '../features/environment';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
import { BasicFeatures } from '../features';
export type SerializedData = {
sid?: string;
be?: BriefEnv;
};
export declare abstract class FrontendRuntimeContext<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>, AD extends CommonAspectDict<ED, Cxt> & Record<string, Aspect<ED, Cxt>>> extends SyncContext<ED> {
subscriber: SubScriber<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>;
env: Environment;
constructor(store: SyncRowStore<ED, FrontendRuntimeContext<ED, Cxt, AD>>, features: BasicFeatures<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>);
protected getSerializedData(): SerializedData;
}

View File

@ -1,14 +1,18 @@
import { SyncContext } from 'oak-domain/lib/store/SyncRowStore';
export class FrontendRuntimeContext extends SyncContext {
subscriber;
env;
constructor(store, features) {
super(store);
this.subscriber = features.subscriber;
this.env = features.environment;
}
getSerializedData() {
const sid = this.subscriber.getSubscriberId();
const be = this.env.getBriefEnv();
return {
sid,
be,
};
}
}

View File

@ -1,9 +1,11 @@
import { Feature } from "../types/Feature";
import { NativeEnv, WebEnv, WechatMpEnv } from 'oak-domain/lib/types/Environment';
import { NativeEnv, WebEnv, WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare class Environment extends Feature {
env?: WebEnv | WechatMpEnv | NativeEnv;
fullEnv?: WebEnv | WechatMpEnv | NativeEnv;
briefEnv?: BriefEnv;
loading: boolean;
constructor();
private initialize;
getEnv(): Promise<WebEnv | WechatMpEnv | NativeEnv>;
getBriefEnv(): BriefEnv | undefined;
}

View File

@ -3,7 +3,8 @@ import { getEnv } from '../utils/env/env';
import { assert } from 'oak-domain/lib/utils/assert';
import { OakEnvInitializedFailure } from "../types/Exception";
export class Environment extends Feature {
env;
fullEnv;
briefEnv;
loading = false;
constructor() {
super();
@ -12,9 +13,10 @@ export class Environment extends Feature {
async initialize() {
this.loading = true;
try {
const env = await getEnv();
const { fullEnv, briefEnv } = await getEnv();
this.loading = false;
this.env = env;
this.fullEnv = fullEnv;
this.briefEnv = briefEnv;
this.publish();
}
catch (err) {
@ -22,19 +24,22 @@ export class Environment extends Feature {
}
}
async getEnv() {
if (this.env) {
return this.env;
if (this.fullEnv) {
return this.fullEnv;
}
else {
assert(this.loading);
return new Promise((resolve, reject) => {
const fn = this.subscribe(() => {
fn();
assert(this.env);
resolve(this.env);
assert(this.fullEnv);
resolve(this.fullEnv);
});
});
}
}
getBriefEnv() {
return this.briefEnv;
}
}
;

View File

@ -127,7 +127,7 @@ export class Locales extends Feature {
async loadData(key) {
assert(typeof key === 'string');
const [ns] = key.split('.');
await this.loadServerData([key]);
await this.loadServerData([ns]);
if (!this.hasKey(key)) {
console.warn(`命名空间${ns}中的${key}缺失且可能请求不到更新的数据`);
if (process.env.NODE_ENV === 'development') {

View File

@ -1,2 +1,5 @@
import { WechatMpEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<WechatMpEnv>;
import { WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<{
fullEnv: WechatMpEnv;
briefEnv: BriefEnv;
}>;

View File

@ -1,8 +1,18 @@
export async function getEnv() {
const env = await wx.getSystemInfo();
return Object.assign(env, {
const fullEnv = Object.assign(env, {
type: 'wechatMp',
localStorageEnabled: true,
language: env.language.replace('_', '-'), // 全局统一用中连接符
});
const briefEnv = {
system: fullEnv.system,
wechat: `${fullEnv.platform}/${fullEnv.version}/${fullEnv.language}`,
brand: fullEnv.brand,
model: fullEnv.model,
};
return {
fullEnv,
briefEnv,
};
}

View File

@ -1,2 +1,5 @@
import { NativeEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<NativeEnv>;
import { NativeEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<{
fullEnv: NativeEnv;
briefEnv: BriefEnv;
}>;

View File

@ -2,8 +2,17 @@ import { Platform } from 'react-native';
import { getLocales } from 'react-native-localize';
export async function getEnv() {
const language = getLocales()[0].languageTag;
return {
const fullEnv = {
...Platform,
language,
};
const briefEnv = {
brand: fullEnv.constants.Brand,
model: fullEnv.constants.Model,
system: `${fullEnv.OS}/${fullEnv.constants.Version || fullEnv.constants.osVersion}/${language}`,
};
return {
fullEnv,
briefEnv,
};
}

View File

@ -1,6 +1,9 @@
import { WebEnv } from 'oak-domain/lib/types/Environment';
import { WebEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
/**
* fingerprintJs当中的一些敏感项
* @returns
*/
export declare function getEnv(): Promise<WebEnv>;
export declare function getEnv(): Promise<{
fullEnv: WebEnv;
briefEnv: BriefEnv;
}>;

View File

@ -9,7 +9,7 @@ export async function getEnv() {
// 有浏览器没有storage
const [result /* , localStorageEnabled */] = await Promise.all([fp.get() /* , navigator.storage.persisted() */]);
const { visitorId, components } = result;
return Object.assign(pick(components, [
const fullEnv = Object.assign(pick(components, [
'platform',
'timezone',
'vendor',
@ -20,4 +20,12 @@ export async function getEnv() {
// localStorageEnabled,
language: navigator.language,
});
const briefEnv = {
system: `${fullEnv.platform.value}`,
explorer: `${fullEnv.vendor.value}/${fullEnv.vendorFlavors.value[0]}`,
};
return {
fullEnv,
briefEnv,
};
}

View File

@ -2,9 +2,12 @@ import { EntityDict } from 'oak-domain/lib/base-app-domain';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/types/Entity';
import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { SerializedData } from './FrontendRuntimeContext';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
export declare abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDict> extends AsyncContext<ED> {
private subscriberId?;
private be?;
getSubscriberId(): string | undefined;
getBriefEnvironment(): BriefEnv | undefined;
protected getSerializedData(): SerializedData;
initialize(data?: SerializedData): Promise<void>;
}

View File

@ -4,18 +4,26 @@ exports.BackendRuntimeContext = void 0;
const AsyncRowStore_1 = require("oak-domain/lib/store/AsyncRowStore");
class BackendRuntimeContext extends AsyncRowStore_1.AsyncContext {
subscriberId;
be;
getSubscriberId() {
return this.subscriberId;
}
getBriefEnvironment() {
return this.be;
}
getSerializedData() {
return {
sid: this.subscriberId,
be: this.be,
};
}
async initialize(data) {
if (data?.sid) {
this.subscriberId = data.sid;
}
if (data?.be) {
this.be = data.be;
}
}
}
exports.BackendRuntimeContext = BackendRuntimeContext;

View File

@ -5,12 +5,16 @@ import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { CommonAspectDict } from 'oak-common-aspect';
import { Aspect } from 'oak-domain/lib/types';
import { SubScriber } from '../features/subscriber';
import { Environment } from '../features/environment';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
import { BasicFeatures } from '../features';
export type SerializedData = {
sid?: string;
be?: BriefEnv;
};
export declare abstract class FrontendRuntimeContext<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>, AD extends CommonAspectDict<ED, Cxt> & Record<string, Aspect<ED, Cxt>>> extends SyncContext<ED> {
subscriber: SubScriber<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>;
env: Environment;
constructor(store: SyncRowStore<ED, FrontendRuntimeContext<ED, Cxt, AD>>, features: BasicFeatures<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>);
protected getSerializedData(): SerializedData;
}

View File

@ -4,14 +4,18 @@ exports.FrontendRuntimeContext = void 0;
const SyncRowStore_1 = require("oak-domain/lib/store/SyncRowStore");
class FrontendRuntimeContext extends SyncRowStore_1.SyncContext {
subscriber;
env;
constructor(store, features) {
super(store);
this.subscriber = features.subscriber;
this.env = features.environment;
}
getSerializedData() {
const sid = this.subscriber.getSubscriberId();
const be = this.env.getBriefEnv();
return {
sid,
be,
};
}
}

View File

@ -1,9 +1,11 @@
import { Feature } from "../types/Feature";
import { NativeEnv, WebEnv, WechatMpEnv } from 'oak-domain/lib/types/Environment';
import { NativeEnv, WebEnv, WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare class Environment extends Feature {
env?: WebEnv | WechatMpEnv | NativeEnv;
fullEnv?: WebEnv | WechatMpEnv | NativeEnv;
briefEnv?: BriefEnv;
loading: boolean;
constructor();
private initialize;
getEnv(): Promise<WebEnv | WechatMpEnv | NativeEnv>;
getBriefEnv(): BriefEnv | undefined;
}

View File

@ -6,7 +6,8 @@ const env_1 = require("../utils/env/env");
const assert_1 = require("oak-domain/lib/utils/assert");
const Exception_1 = require("../types/Exception");
class Environment extends Feature_1.Feature {
env;
fullEnv;
briefEnv;
loading = false;
constructor() {
super();
@ -15,9 +16,10 @@ class Environment extends Feature_1.Feature {
async initialize() {
this.loading = true;
try {
const env = await (0, env_1.getEnv)();
const { fullEnv, briefEnv } = await (0, env_1.getEnv)();
this.loading = false;
this.env = env;
this.fullEnv = fullEnv;
this.briefEnv = briefEnv;
this.publish();
}
catch (err) {
@ -25,20 +27,23 @@ class Environment extends Feature_1.Feature {
}
}
async getEnv() {
if (this.env) {
return this.env;
if (this.fullEnv) {
return this.fullEnv;
}
else {
(0, assert_1.assert)(this.loading);
return new Promise((resolve, reject) => {
const fn = this.subscribe(() => {
fn();
(0, assert_1.assert)(this.env);
resolve(this.env);
(0, assert_1.assert)(this.fullEnv);
resolve(this.fullEnv);
});
});
}
}
getBriefEnv() {
return this.briefEnv;
}
}
exports.Environment = Environment;
;

View File

@ -130,7 +130,7 @@ class Locales extends Feature_1.Feature {
async loadData(key) {
(0, assert_1.assert)(typeof key === 'string');
const [ns] = key.split('.');
await this.loadServerData([key]);
await this.loadServerData([ns]);
if (!this.hasKey(key)) {
console.warn(`命名空间${ns}中的${key}缺失且可能请求不到更新的数据`);
if (process.env.NODE_ENV === 'development') {

View File

@ -1,2 +1,5 @@
import { WechatMpEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<WechatMpEnv>;
import { WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<{
fullEnv: WechatMpEnv;
briefEnv: BriefEnv;
}>;

View File

@ -3,10 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.getEnv = void 0;
async function getEnv() {
const env = await wx.getSystemInfo();
return Object.assign(env, {
const fullEnv = Object.assign(env, {
type: 'wechatMp',
localStorageEnabled: true,
language: env.language.replace('_', '-'), // 全局统一用中连接符
});
const briefEnv = {
system: fullEnv.system,
wechat: `${fullEnv.platform}/${fullEnv.version}/${fullEnv.language}`,
brand: fullEnv.brand,
model: fullEnv.model,
};
return {
fullEnv,
briefEnv,
};
}
exports.getEnv = getEnv;

View File

@ -1,2 +1,5 @@
import { NativeEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<NativeEnv>;
import { NativeEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export declare function getEnv(): Promise<{
fullEnv: NativeEnv;
briefEnv: BriefEnv;
}>;

View File

@ -5,9 +5,18 @@ const react_native_1 = require("react-native");
const react_native_localize_1 = require("react-native-localize");
async function getEnv() {
const language = (0, react_native_localize_1.getLocales)()[0].languageTag;
return {
const fullEnv = {
...react_native_1.Platform,
language,
};
const briefEnv = {
brand: fullEnv.constants.Brand,
model: fullEnv.constants.Model,
system: `${fullEnv.OS}/${fullEnv.constants.Version || fullEnv.constants.osVersion}/${language}`,
};
return {
fullEnv,
briefEnv,
};
}
exports.getEnv = getEnv;

View File

@ -1,6 +1,9 @@
import { WebEnv } from 'oak-domain/lib/types/Environment';
import { WebEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
/**
* fingerprintJs当中的一些敏感项
* @returns
*/
export declare function getEnv(): Promise<WebEnv>;
export declare function getEnv(): Promise<{
fullEnv: WebEnv;
briefEnv: BriefEnv;
}>;

View File

@ -13,7 +13,7 @@ async function getEnv() {
// 有浏览器没有storage
const [result /* , localStorageEnabled */] = await Promise.all([fp.get() /* , navigator.storage.persisted() */]);
const { visitorId, components } = result;
return Object.assign((0, lodash_1.pick)(components, [
const fullEnv = Object.assign((0, lodash_1.pick)(components, [
'platform',
'timezone',
'vendor',
@ -24,5 +24,13 @@ async function getEnv() {
// localStorageEnabled,
language: navigator.language,
});
const briefEnv = {
system: `${fullEnv.platform.value}`,
explorer: `${fullEnv.vendor.value}/${fullEnv.vendorFlavors.value[0]}`,
};
return {
fullEnv,
briefEnv,
};
}
exports.getEnv = getEnv;

View File

@ -2,17 +2,24 @@ import { EntityDict } from 'oak-domain/lib/base-app-domain';
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/types/Entity';
import { AsyncContext, AsyncRowStore } from 'oak-domain/lib/store/AsyncRowStore';
import { SerializedData } from './FrontendRuntimeContext';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
export abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDict> extends AsyncContext<ED> {
private subscriberId?: string;
private be?: BriefEnv;
getSubscriberId() {
return this.subscriberId;
}
getBriefEnvironment() {
return this.be;
}
protected getSerializedData(): SerializedData {
return {
sid: this.subscriberId,
be: this.be,
}
}
@ -20,5 +27,8 @@ export abstract class BackendRuntimeContext<ED extends EntityDict & BaseEntityDi
if (data?.sid) {
this.subscriberId = data.sid;
}
if (data?.be) {
this.be = data.be;
}
}
}

View File

@ -5,10 +5,13 @@ import { AsyncContext } from 'oak-domain/lib/store/AsyncRowStore';
import { CommonAspectDict } from 'oak-common-aspect';
import { Aspect } from 'oak-domain/lib/types';
import { SubScriber } from '../features/subscriber';
import { Environment } from '../features/environment';
import { BriefEnv } from 'oak-domain/lib/types/Environment';
import { BasicFeatures } from '../features';
export type SerializedData = {
sid?: string;
be?: BriefEnv;
};
export abstract class FrontendRuntimeContext<
@ -17,16 +20,20 @@ export abstract class FrontendRuntimeContext<
AD extends CommonAspectDict<ED, Cxt> & Record<string, Aspect<ED, Cxt>>
> extends SyncContext<ED> {
subscriber: SubScriber<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>;
env: Environment;
constructor(store: SyncRowStore<ED, FrontendRuntimeContext<ED, Cxt, AD>>, features: BasicFeatures<ED, Cxt, FrontendRuntimeContext<ED, Cxt, AD>, AD>) {
super(store);
this.subscriber = features.subscriber;
this.env = features.environment;
}
protected getSerializedData(): SerializedData {
const sid = this.subscriber.getSubscriberId();
const be = this.env.getBriefEnv();
return {
sid,
be,
};
}
}

View File

@ -1,11 +1,12 @@
import { Feature } from "../types/Feature";
import { NativeEnv, WebEnv, WechatMpEnv } from 'oak-domain/lib/types/Environment';
import { NativeEnv, WebEnv, WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
import { getEnv } from '../utils/env/env';
import { assert } from 'oak-domain/lib/utils/assert';
import { OakEnvInitializedFailure } from "../types/Exception";
export class Environment extends Feature {
env?: WebEnv | WechatMpEnv | NativeEnv;
fullEnv?: WebEnv | WechatMpEnv | NativeEnv;
briefEnv?: BriefEnv;
loading = false;
constructor() {
@ -17,9 +18,10 @@ export class Environment extends Feature {
private async initialize() {
this.loading = true;
try {
const env = await getEnv();
const { fullEnv, briefEnv } = await getEnv();
this.loading = false;
this.env = env;
this.fullEnv = fullEnv;
this.briefEnv = briefEnv;
this.publish();
}
catch (err) {
@ -28,8 +30,8 @@ export class Environment extends Feature {
}
async getEnv(): Promise<WebEnv | WechatMpEnv | NativeEnv> {
if (this.env) {
return this.env;
if (this.fullEnv) {
return this.fullEnv;
}
else {
assert(this.loading);
@ -38,12 +40,16 @@ export class Environment extends Feature {
const fn = this.subscribe(
() => {
fn();
assert(this.env);
resolve(this.env);
assert(this.fullEnv);
resolve(this.fullEnv);
}
)
}
);
}
}
getBriefEnv() {
return this.briefEnv;
}
};

View File

@ -157,7 +157,7 @@ export class Locales<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncCo
assert(typeof key === 'string');
const [ ns ] = key.split('.');
await this.loadServerData([key]);
await this.loadServerData([ns]);
if (!this.hasKey(key)) {
console.warn(`命名空间${ns}中的${key}缺失且可能请求不到更新的数据`);
if (process.env.NODE_ENV === 'development') {

View File

@ -1,6 +1,6 @@
import { assert } from 'oak-domain/lib/utils/assert';
import { cloneDeep, pull, unset, merge, uniq, omit } from "oak-domain/lib/utils/lodash";
import { checkFilterContains, combineFilters, contains, repel, same } from "oak-domain/lib/store/filter";
import { checkFilterContains, combineFilters } from "oak-domain/lib/store/filter";
import { createOperationsFromModies } from 'oak-domain/lib/store/modi';
import { judgeRelation } from "oak-domain/lib/store/relation";
import { EntityDict, StorageSchema, OpRecord, CreateOpResult, RemoveOpResult, AspectWrapper, AuthDefDict, CascadeRelationItem, CascadeActionItem } from "oak-domain/lib/types";
@ -168,14 +168,6 @@ abstract class Node<
const attr2 = attr.split(':')[0]; // 处理attr:prev
return judgeRelation(this.schema, this.entity, attr2);
}
/* protected contains(filter: ED[T]['Selection']['filter'], conditionalFilter: ED[T]['Selection']['filter']) {
return contains(this.entity, this.schema, filter, conditionalFilter);
}
protected repel(filter1: ED[T]['Selection']['filter'], filter2: ED[T]['Selection']['filter']) {
return repel(this.entity, this.schema, filter1, filter2);
} */
}
const DEFAULT_PAGINATION: Pagination = {

View File

@ -1,10 +1,21 @@
import { WechatMpEnv } from 'oak-domain/lib/types/Environment';
import { WechatMpEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
export async function getEnv() {
const env = await wx.getSystemInfo();
return Object.assign(env, {
const fullEnv = Object.assign(env, {
type: 'wechatMp',
localStorageEnabled: true,
language: env.language.replace('_', '-'), // 全局统一用中连接符
}) as unknown as WechatMpEnv;
const briefEnv: BriefEnv = {
system: fullEnv.system,
wechat: `${fullEnv.platform}/${fullEnv.version}/${fullEnv.language}`,
brand: fullEnv.brand,
model: fullEnv.model,
};
return {
fullEnv,
briefEnv,
};
}

View File

@ -1,11 +1,21 @@
import { NativeEnv } from 'oak-domain/lib/types/Environment';
import { NativeEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
import { Platform } from 'react-native';
import { getLocales } from 'react-native-localize';
export async function getEnv() {
const language = getLocales()[0].languageTag;
return {
const fullEnv = {
...Platform,
language,
} as NativeEnv;
const briefEnv: BriefEnv = {
brand: fullEnv.constants.Brand,
model: fullEnv.constants.Model,
system: `${fullEnv.OS}/${fullEnv.constants.Version || fullEnv.constants.osVersion}/${language}`,
};
return {
fullEnv,
briefEnv,
};
}

View File

@ -1,6 +1,6 @@
import FingerprintJS from '@fingerprintjs/fingerprintjs';
import { pick } from 'oak-domain/lib/utils/lodash';
import { WebEnv } from 'oak-domain/lib/types/Environment';
import { WebEnv, BriefEnv } from 'oak-domain/lib/types/Environment';
/**
* fingerprintJs当中的一些敏感项
@ -12,7 +12,7 @@ export async function getEnv() {
const [result/* , localStorageEnabled */] = await Promise.all([fp.get()/* , navigator.storage.persisted() */]);
const { visitorId, components } = result;
return Object.assign(
const fullEnv = Object.assign(
pick(components, [
'platform',
'timezone',
@ -24,4 +24,14 @@ export async function getEnv() {
// localStorageEnabled,
language: navigator.language,
}) as unknown as WebEnv;
const briefEnv: BriefEnv = {
system: `${fullEnv.platform.value}`,
explorer: `${fullEnv.vendor.value}/${fullEnv.vendorFlavors.value[0]}`,
};
return {
fullEnv,
briefEnv,
};
}