Skip to content

Commit

Permalink
refactor: sentry (#8617)
Browse files Browse the repository at this point in the history
* refactor: update DSN to private endpoint

* chore: update lock file

* fix: typing

* refactor: add @masknet/logs

* refactor: LoggerAPI

* chore: wip

* chore: add @masknet/logs

* refactor: log settings

* refactor: code style
  • Loading branch information
guanbinrui committed Feb 14, 2023
1 parent 9c8c212 commit 06f00a7
Show file tree
Hide file tree
Showing 36 changed files with 356 additions and 277 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Expand Up @@ -33,8 +33,6 @@ compilation-stats.json
/contracts

# Following content is copied from https://github.com/github/gitignore/blob/master/Node.gitignore
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
Expand Down
42 changes: 19 additions & 23 deletions packages/dashboard/src/initialization/Dashboard.tsx
@@ -1,4 +1,4 @@
import { useEffect, useMemo } from 'react'
import { useEffect } from 'react'
import { HashRouter } from 'react-router-dom'
import { CssBaseline, ThemeProvider, StyledEngineProvider } from '@mui/material'
import {
Expand All @@ -9,8 +9,7 @@ import {
useSystemPreferencePalette,
DialogStackingProvider,
} from '@masknet/theme'
import { LogHubBaseAPI } from '@masknet/web3-providers/types'
import { I18NextProviderHMR, SharedContextProvider, LoggerContextProvider } from '@masknet/shared'
import { I18NextProviderHMR, SharedContextProvider } from '@masknet/shared'
import { ErrorBoundary } from '@masknet/shared-base-ui'
import { createInjectHooksRenderer, useActivatedPluginsDashboard } from '@masknet/plugin-infra/dashboard'
import { EnvironmentContextProvider, Web3ContextProvider } from '@masknet/web3-hooks-base'
Expand All @@ -19,7 +18,7 @@ import { i18NextInstance, NetworkPluginID, queryRemoteI18NBundle } from '@maskne
import '../utils/kv-storage.js'

import { Pages } from '../pages/routes.js'
import { useAppearance, useLogSettings } from '../pages/Personas/api.js'
import { useAppearance, useLog } from '../pages/Personas/api.js'
import { PersonaContext } from '../pages/Personas/hooks/usePersonaContext.js'
import { Services } from '../API.js'

Expand All @@ -31,8 +30,7 @@ export default function DashboardRoot() {

// #region theme
const appearance = useAppearance()
const loggerId = useLogSettings()
const logContext = useMemo(() => ({ platform: LogHubBaseAPI.Platform.Dashboard, loggerId }), [loggerId])
const log = useLog()
const mode = useSystemPreferencePalette()
const theme = {
dark: DashboardDarkTheme,
Expand All @@ -49,23 +47,21 @@ export default function DashboardRoot() {
<I18NextProviderHMR i18n={i18NextInstance}>
<StyledEngineProvider injectFirst>
<ThemeProvider theme={theme}>
<LoggerContextProvider value={logContext}>
<DialogStackingProvider>
<PersonaContext.Provider>
<ErrorBoundary>
<CssBaseline />
<CustomSnackbarProvider>
<SharedContextProvider>
<HashRouter>
<Pages />
</HashRouter>
<PluginRender />
</SharedContextProvider>
</CustomSnackbarProvider>
</ErrorBoundary>
</PersonaContext.Provider>
</DialogStackingProvider>
</LoggerContextProvider>
<DialogStackingProvider>
<PersonaContext.Provider>
<ErrorBoundary>
<CssBaseline />
<CustomSnackbarProvider>
<SharedContextProvider>
<HashRouter>
<Pages />
</HashRouter>
<PluginRender />
</SharedContextProvider>
</CustomSnackbarProvider>
</ErrorBoundary>
</PersonaContext.Provider>
</DialogStackingProvider>
</ThemeProvider>
</StyledEngineProvider>
</I18NextProviderHMR>
Expand Down
7 changes: 4 additions & 3 deletions packages/dashboard/src/pages/Personas/api.ts
@@ -1,9 +1,10 @@
import { use, cache } from 'react'
import type {} from 'react/next'
import { noop } from 'lodash-es'
import { Services, Messages } from '../../API.js'
import { use, cache } from 'react'
import { ValueRef } from '@masknet/shared-base'
import { useValueRef } from '@masknet/shared-base-ui'
import { Services, Messages } from '../../API.js'

export type SocialNetwork = {
networkIdentifier: string
}
Expand Down Expand Up @@ -33,7 +34,7 @@ export const usePersonaAvatar = createHook(
},
)
export const useLanguage = createHook(Services.Settings.getLanguage, Messages.events.languageSettings.on)
export const useLogSettings = createHook(Services.Settings.getLogSettings, Messages.events.logSettings.on)
export const useLog = createHook(Services.Settings.getLog, Messages.events.logSettings.on)

// Do not move or export this function.
// This function should not be encouraged to use everywhere
Expand Down
8 changes: 4 additions & 4 deletions packages/dashboard/src/pages/Welcome/index.tsx
@@ -1,9 +1,9 @@
import urlcat from 'urlcat'
import { memo, useCallback, useState } from 'react'
import { useNavigate, useSearchParams } from 'react-router-dom'
import { DashboardRoutes } from '@masknet/shared-base'
import { makeStyles } from '@masknet/theme'
import { Button, Checkbox, FormControlLabel, FormGroup } from '@mui/material'
import { memo, useCallback, useState } from 'react'
import { useNavigate, useSearchParams } from 'react-router-dom'
import urlcat from 'urlcat'
import { Services } from '../../API.js'
import { FooterLine } from '../../components/FooterLine/index.js'
import { HeaderLine } from '../../components/HeaderLine/index.js'
Expand Down Expand Up @@ -78,7 +78,7 @@ export default memo(function Welcome() {

const handleAgree = useCallback(async () => {
if (allowedToCollect) {
await Services.Settings.setLogEnable(true)
await Services.Settings.setLog(true)
}
setAgreed(true)
const from = params.get('from')
Expand Down
13 changes: 13 additions & 0 deletions packages/logs/package.json
@@ -0,0 +1,13 @@
{
"name": "@masknet/logs",
"type": "module",
"private": true,
"exports": {
".": {
"types": "./dist/index.d.ts",
"mask-src": "./src/index.ts",
"default": "./dist/index.js"
}
},
"types": "./dist/index.d.ts"
}
1 change: 1 addition & 0 deletions packages/logs/src/index.ts
@@ -0,0 +1 @@
export {}
3 changes: 3 additions & 0 deletions packages/logs/tsconfig.json
@@ -0,0 +1,3 @@
{
"extends": "../../tsconfig.json"
}
@@ -1,5 +1,6 @@
import { ECKeyIdentifier, PersonaIdentifier, ValueRefWithReady } from '@masknet/shared-base'
import { head } from 'lodash-es'
import { ECKeyIdentifier, PersonaIdentifier, ValueRefWithReady } from '@masknet/shared-base'
import { BooleanPreference } from '@masknet/plugin-infra'
import {
appearanceSettings,
currentPersonaIdentifier,
Expand All @@ -11,10 +12,7 @@ import {
} from '../../../shared/legacy-settings/settings.js'
import { MaskMessages } from '../../../shared/messages.js'
import { queryPersonasDB } from '../../../background/database/persona/db.js'
import { BooleanPreference } from '@masknet/plugin-infra'
import { v4 as uuid } from 'uuid'
import { __deprecated__getStorage } from '../../utils/deprecated-storage.js'
import { Flags } from '../../../shared/flags.js'

function create<T>(settings: ValueRefWithReady<T>) {
async function get() {
Expand All @@ -27,20 +25,10 @@ function create<T>(settings: ValueRefWithReady<T>) {
}
return [get, set] as const
}
export const [getLog, setLog] = create(logSettings)
export const [getTheme, setTheme] = create(appearanceSettings)
export const [getLogSettings, setLogSettings] = create(logSettings)
export const [getLanguage, setLanguage] = create(languageSettings)

export async function setLogEnable(enable: boolean) {
if (enable) {
const newLoggerId = uuid()
await logSettings.readyPromise
setLogSettings(newLoggerId)
} else {
setLogSettings('')
}
}

export async function getCurrentPersonaIdentifier(): Promise<PersonaIdentifier | undefined> {
await currentPersonaIdentifier.readyPromise
const personas = (await queryPersonasDB({ hasPrivateKey: true }))
Expand Down Expand Up @@ -69,11 +57,3 @@ export async function setPluginMinimalModeEnabled(id: string, enabled: boolean)
export const [getDecentralizedSearchSettings, setDecentralizedSearchSettings] = create(decentralizedSearchSettings)

export { __deprecated__getStorage as getLegacySettingsInitialValue }

// should remove this flag after new log privacy policy release
if (Flags.log_enabled) {
getLogSettings().then((current) => {
if (current && typeof current === 'string') return
setLogEnable(true)
})
}
1 change: 1 addition & 0 deletions packages/mask/package.json
Expand Up @@ -23,6 +23,7 @@
"@masknet/gun-utils": "workspace:^",
"@masknet/icons": "workspace:^",
"@masknet/injected-script": "workspace:^",
"@masknet/logs": "workspace:^",
"@masknet/plugin-approval": "workspace:^",
"@masknet/plugin-cross-chain-bridge": "workspace:^",
"@masknet/plugin-cyberconnect": "workspace:^",
Expand Down
2 changes: 0 additions & 2 deletions packages/mask/shared/flags.ts
Expand Up @@ -56,8 +56,6 @@ export const Flags = {
v37PayloadDefaultEnabled: false, // new Date() > new Date('2022-07-01'),
i18nTranslationHotUpdate: true,
sandboxedPluginRuntime: insiderOnly,

log_enabled: process.env.NODE_ENV !== 'production',
} as const

if (process.env.NODE_ENV === 'development') {
Expand Down
6 changes: 2 additions & 4 deletions packages/mask/shared/legacy-settings/settings.ts
Expand Up @@ -2,8 +2,8 @@ import { isEqual } from 'lodash-es'
import { Appearance } from '@masknet/theme'
import { LanguageOptions } from '@masknet/public-api'
import { EnhanceableSite, ExtensionSite, updateLanguage, NetworkPluginID } from '@masknet/shared-base'
import { createGlobalSettings, createBulkSettings } from './createSettings.js'
import { BooleanPreference } from '@masknet/plugin-infra'
import { createGlobalSettings, createBulkSettings } from './createSettings.js'

export const appearanceSettings = createGlobalSettings<Appearance>('appearance', Appearance.default)
export const languageSettings = createGlobalSettings<LanguageOptions>('language', LanguageOptions.__auto__)
Expand All @@ -30,9 +30,7 @@ export const userGuideStatus = createBulkSettings('userGuideStatus', '')
export const sayHelloShowed = createBulkSettings('sayHelloShowed', false)
export const userPinExtension = createGlobalSettings('userPinExtension', false)
export const dismissVerifyNextID = createBulkSettings<Record<string, boolean>>('dismissVerifyNextID', {}, isEqual)

export const logSettings = createGlobalSettings<string>('log', '')

export const logSettings = createGlobalSettings<boolean>('log', false)
export const decentralizedSearchSettings = createGlobalSettings('decentralizedSearchSettings', true)

/**
Expand Down
11 changes: 2 additions & 9 deletions packages/mask/shared/plugin-infra/host.ts
Expand Up @@ -2,23 +2,20 @@
import './register.js'
import type { BooleanPreference, Plugin } from '@masknet/plugin-infra'
import { Emitter } from '@servie/events'
import { LogHub } from '@masknet/web3-providers'
import { createI18NBundle, createSubscriptionFromValueRef, i18NextInstance } from '@masknet/shared-base'
import { LogHubBaseAPI } from '@masknet/web3-providers/types'
import { MaskMessages } from '../../shared/messages.js'
import { InMemoryStorages, PersistentStorages } from '../../shared/index.js'
import { nativeAPI, hasNativeAPI } from '../../shared/native-rpc/index.js'
import {
currentMaskWalletAccountSettings,
currentMaskWalletChainIdSettings,
} from '../legacy-settings/wallet-settings.js'
import { logSettings } from '../legacy-settings/settings.js'

export type PartialSharedUIContext = Pick<
Plugin.Shared.SharedUIContext,
'nativeType' | 'hasNativeAPI' | 'account' | 'chainId' | 'createKVStorage' | 'createLogger'
'nativeType' | 'hasNativeAPI' | 'account' | 'chainId' | 'createKVStorage'
>
let sharedUIContextSingleton: Omit<PartialSharedUIContext, 'createKVStorage' | 'createLogger'>
let sharedUIContextSingleton: Omit<PartialSharedUIContext, 'createKVStorage'>
export const createPartialSharedUIContext = (id: string, signal: AbortSignal): PartialSharedUIContext => {
sharedUIContextSingleton ??= {
nativeType: nativeAPI?.type,
Expand All @@ -36,10 +33,6 @@ export function createSharedContext(pluginID: string, signal: AbortSignal): Plug
if (type === 'memory') return InMemoryStorages.Plugin.createSubScope(pluginID, defaultValues, signal)
else return PersistentStorages.Plugin.createSubScope(pluginID, defaultValues, signal)
},
createLogger() {
if (!logSettings.value) return
return LogHub.createLogger(LogHubBaseAPI.Platform.Plugin, pluginID)
},
}
}

Expand Down
64 changes: 29 additions & 35 deletions packages/mask/src/extension/popups/UI.tsx
Expand Up @@ -2,27 +2,25 @@ import { lazy, useEffect, useState, useMemo } from 'react'
import { Navigate, Route, Routes, HashRouter } from 'react-router-dom'
import { createInjectHooksRenderer, useActivatedPluginsDashboard } from '@masknet/plugin-infra/dashboard'
import { NetworkPluginID, PopupRoutes, queryRemoteI18NBundle } from '@masknet/shared-base'
import { useValueRef } from '@masknet/shared-base-ui'
import { PopupSnackbarProvider } from '@masknet/theme'
import { LoadingPlaceholder } from './components/LoadingPlaceholder/index.js'
import { Web3ContextProvider } from '@masknet/web3-hooks-base'
import { ProviderType } from '@masknet/web3-shared-evm'
import { usePopupFullPageTheme } from '../../utils/theme/useClassicMaskFullPageTheme.js'
import { logSettings, languageSettings } from '../../../shared/legacy-settings/settings.js'
import '../../social-network-adaptor/browser-action/index.js'
import { PopupContext } from './hook/usePopupContext.js'
import { PopupFrame } from './components/PopupFrame/index.js'
import { PopupContext } from './hook/usePopupContext.js'
import { MaskUIRootPage } from '../../UIRoot-page.js'
import { PageTitleContext } from './context.js'
import { useValueRef } from '@masknet/shared-base-ui'
import { logSettings, languageSettings } from '../../../shared/legacy-settings/settings.js'
import { PopupSnackbarProvider } from '@masknet/theme'
import { LoadingPlaceholder } from './components/LoadingPlaceholder/index.js'
import Services from '../service.js'
import { Web3ContextProvider } from '@masknet/web3-hooks-base'
import { ProviderType } from '@masknet/web3-shared-evm'
import { LogHubBaseAPI } from '@masknet/web3-providers/types'
import { LoggerContextProvider } from '@masknet/shared'

function usePopupTheme() {
return usePopupFullPageTheme(useValueRef(languageSettings))
}

function useLogSettings() {
function useLog() {
return useValueRef(logSettings)
}

Expand All @@ -46,38 +44,34 @@ const web3ContextType = { pluginID: NetworkPluginID.PLUGIN_EVM, providerType: Pr
export default function Popups() {
const [title, setTitle] = useState('')
useEffect(queryRemoteI18NBundle(Services.Helper.queryRemoteI18NBundle), [])
const loggerId = useLogSettings()
const loggerContext = useMemo(() => ({ platform: LogHubBaseAPI.Platform.Popup, loggerId }), [loggerId])
const titleContext = useMemo(() => ({ title, setTitle }), [title])

return MaskUIRootPage(
usePopupTheme,
<PopupSnackbarProvider>
<Web3ContextProvider value={web3ContextType}>
<PopupContext.Provider>
<LoggerContextProvider value={loggerContext}>
<PageTitleContext.Provider value={titleContext}>
<HashRouter>
<Routes>
<Route path={PopupRoutes.Personas + '/*'} element={frame(<Personas />)} />
<Route path={PopupRoutes.Wallet + '/*'} element={frame(<Wallet />)} />
<Route path={PopupRoutes.Swap} element={<SwapPage />} />
<Route path={PopupRoutes.RequestPermission} element={<RequestPermissionPage />} />
<Route
path={PopupRoutes.PermissionAwareRedirect}
element={<PermissionAwareRedirect />}
/>
<Route
path={PopupRoutes.ThirdPartyRequestPermission}
element={<ThirdPartyRequestPermission />}
/>
<Route path="*" element={<Navigate replace to={PopupRoutes.Personas} />} />
</Routes>
{/* TODO: Should only load plugins when the page is plugin-aware. */}
<PluginRenderDelayed />
</HashRouter>
</PageTitleContext.Provider>
</LoggerContextProvider>
<PageTitleContext.Provider value={titleContext}>
<HashRouter>
<Routes>
<Route path={PopupRoutes.Personas + '/*'} element={frame(<Personas />)} />
<Route path={PopupRoutes.Wallet + '/*'} element={frame(<Wallet />)} />
<Route path={PopupRoutes.Swap} element={<SwapPage />} />
<Route path={PopupRoutes.RequestPermission} element={<RequestPermissionPage />} />
<Route
path={PopupRoutes.PermissionAwareRedirect}
element={<PermissionAwareRedirect />}
/>
<Route
path={PopupRoutes.ThirdPartyRequestPermission}
element={<ThirdPartyRequestPermission />}
/>
<Route path="*" element={<Navigate replace to={PopupRoutes.Personas} />} />
</Routes>
{/* TODO: Should only load plugins when the page is plugin-aware. */}
<PluginRenderDelayed />
</HashRouter>
</PageTitleContext.Provider>
</PopupContext.Provider>
</Web3ContextProvider>
</PopupSnackbarProvider>,
Expand Down
5 changes: 0 additions & 5 deletions packages/plugin-infra/src/types.ts
Expand Up @@ -25,7 +25,6 @@ import type {
} from '@masknet/shared-base'
import type { TypedMessage } from '@masknet/typed-message'
import type { Web3Helper } from '@masknet/web3-helpers'
import type { LogHubBaseAPI } from '@masknet/web3-providers/types'
import type {
ChainDescriptor,
NetworkDescriptor,
Expand Down Expand Up @@ -160,10 +159,6 @@ export namespace Plugin.Shared {
* A lightweight K/V storage used to store some simple data.
*/
createKVStorage<T extends object>(type: 'memory' | 'persistent', defaultValues: T): ScopedStorage<T>
/**
* A Logger.
*/
createLogger(): LogHubBaseAPI.Logger | undefined
}

export interface SharedUIContext extends SharedContext {
Expand Down

0 comments on commit 06f00a7

Please sign in to comment.