From c5d115f0889858e6cb5185ea29109a1cda7646e7 Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Tue, 2 Apr 2024 04:37:33 +0300 Subject: [PATCH] chore: use target=es2022 with useDefineForClassFields=true --- packages/core/src/highlevel/base.ts | 28 +++--- .../core/src/highlevel/storage/storage.ts | 45 ++++++--- .../core/src/highlevel/updates/manager.ts | 9 +- packages/core/src/network/mtproto-session.ts | 10 +- packages/core/src/network/network-manager.ts | 92 ++++++++++--------- .../core/src/network/session-connection.ts | 9 +- .../storage/memory/repository/auth-keys.ts | 15 +-- .../core/src/storage/memory/repository/kv.ts | 7 +- .../src/storage/memory/repository/peers.ts | 15 +-- .../storage/memory/repository/ref-messages.ts | 11 ++- packages/core/src/storage/sqlite/index.ts | 15 ++- packages/core/src/storage/storage.ts | 33 ++++--- packages/core/src/utils/logger.ts | 13 ++- packages/mtproxy/fake-tls.ts | 3 +- .../src/common-internals-node/platform.ts | 6 +- packages/web/src/idb/index.ts | 18 ++-- packages/web/src/platform.ts | 18 ++-- tsconfig.json | 3 +- 18 files changed, 206 insertions(+), 144 deletions(-) diff --git a/packages/core/src/highlevel/base.ts b/packages/core/src/highlevel/base.ts index a4e09963..e5619383 100644 --- a/packages/core/src/highlevel/base.ts +++ b/packages/core/src/highlevel/base.ts @@ -33,7 +33,18 @@ export class BaseTelegramClient implements ITelegramClient { private _serverUpdatesHandler: (updates: tl.TypeUpdates) => void = () => {} private _connectionStateHandler: (state: ConnectionState) => void = () => {} + readonly log + readonly mt + readonly crypto + readonly storage + constructor(readonly params: BaseTelegramClientOptions) { + this.log = this.params.logger ?? new LogManager('client') + this.mt = new MtClient({ + ...this.params, + logger: this.log.create('mtproto'), + }) + if (!params.disableUpdates && params.updates !== false) { this.updates = new UpdatesManager(this, params.updates) this._serverUpdatesHandler = this.updates.handleUpdate.bind(this.updates) @@ -56,18 +67,13 @@ export class BaseTelegramClient implements ITelegramClient { this._connectionStateHandler('offline') } }) - } - readonly log = this.params.logger ?? new LogManager('client') - readonly mt = new MtClient({ - ...this.params, - logger: this.log.create('mtproto'), - }) - readonly crypto = this.mt.crypto - readonly storage = new TelegramStorageManager(this.mt.storage, { - provider: this.params.storage, - ...this.params.storageOptions, - }) + this.crypto = this.mt.crypto + this.storage = new TelegramStorageManager(this.mt.storage, { + provider: this.params.storage, + ...this.params.storageOptions, + }) + } readonly appConfig = new AppConfigManager(this) private _prepare = asyncResettable(async () => { diff --git a/packages/core/src/highlevel/storage/storage.ts b/packages/core/src/highlevel/storage/storage.ts index 0f32baab..863b202f 100644 --- a/packages/core/src/highlevel/storage/storage.ts +++ b/packages/core/src/highlevel/storage/storage.ts @@ -1,3 +1,4 @@ +import { ServiceOptions } from '../../storage/service/base.js' import { StorageManager } from '../../storage/storage.js' import { PublicPart } from '../../types/utils.js' import { ITelegramStorageProvider } from './provider.js' @@ -17,26 +18,40 @@ export interface TelegramStorageManagerExtraOptions { } export class TelegramStorageManager { + private provider + + readonly updates + readonly self: PublicPart + readonly refMsgs + readonly peers: PublicPart + constructor( private mt: StorageManager, private options: TelegramStorageManagerOptions & TelegramStorageManagerExtraOptions, - ) {} + ) { + this.provider = this.options.provider - private provider = this.options.provider + const serviceOptions: ServiceOptions = { + driver: this.mt.driver, + readerMap: this.mt.options.readerMap, + writerMap: this.mt.options.writerMap, + log: this.mt.log, + } - readonly updates = new UpdatesStateService(this.provider.kv, this.mt._serviceOptions) - readonly self: PublicPart = new CurrentUserService(this.provider.kv, this.mt._serviceOptions) - readonly refMsgs = new RefMessagesService( - this.options.refMessages ?? {}, - this.provider.refMessages, - this.mt._serviceOptions, - ) - readonly peers: PublicPart = new PeersService( - this.options.peers ?? {}, - this.provider.peers, - this.refMsgs, - this.mt._serviceOptions, - ) + this.updates = new UpdatesStateService(this.provider.kv, serviceOptions) + this.self = new CurrentUserService(this.provider.kv, serviceOptions) + this.refMsgs = new RefMessagesService( + this.options.refMessages ?? {}, + this.provider.refMessages, + serviceOptions, + ) + this.peers = new PeersService( + this.options.peers ?? {}, + this.provider.peers, + this.refMsgs, + serviceOptions, + ) + } async clear(withAuthKeys = false) { await this.provider.peers.deleteAll() diff --git a/packages/core/src/highlevel/updates/manager.ts b/packages/core/src/highlevel/updates/manager.ts index fc9a3e52..226be0d7 100644 --- a/packages/core/src/highlevel/updates/manager.ts +++ b/packages/core/src/highlevel/updates/manager.ts @@ -100,7 +100,7 @@ export class UpdatesManager { pendingQtsUpdatesPostponed = new SortedLinkedList((a, b) => a.qtsBefore! - b.qtsBefore!) pendingUnorderedUpdates = new Deque() - noDispatchEnabled = !this.params.disableNoDispatch + noDispatchEnabled // channel id or 0 => msg id noDispatchMsg = new Map>() // channel id or 0 => pts @@ -128,14 +128,14 @@ export class UpdatesManager { // whether to catch up channels from the locally stored pts catchingUp = false - catchUpOnStart = this.params.catchUp ?? false + catchUpOnStart cpts = new Map() cptsMod = new Map() channelDiffTimeouts = new Map() channelsOpened = new Map() - log = this.client.log.create('updates') + log private _handler: RawUpdateHandler = () => {} private _onCatchingUp: (catchingUp: boolean) => void = () => {} @@ -157,6 +157,9 @@ export class UpdatesManager { this.hasTimedoutPostponed = true this.updatesLoopCv.notify() }) + this.log = client.log.create('updates') + this.catchUpOnStart = params.catchUp ?? false + this.noDispatchEnabled = !params.disableNoDispatch } setHandler(handler: RawUpdateHandler): void { diff --git a/packages/core/src/network/mtproto-session.ts b/packages/core/src/network/mtproto-session.ts index 93adf044..5fc4e0e0 100644 --- a/packages/core/src/network/mtproto-session.ts +++ b/packages/core/src/network/mtproto-session.ts @@ -91,9 +91,9 @@ export type PendingMessage = export class MtprotoSession { _sessionId = randomLong() - _authKey = new AuthKey(this._crypto, this.log, this._readerMap) - _authKeyTemp = new AuthKey(this._crypto, this.log, this._readerMap) - _authKeyTempSecondary = new AuthKey(this._crypto, this.log, this._readerMap) + _authKey: AuthKey + _authKeyTemp: AuthKey + _authKeyTempSecondary: AuthKey _timeOffset = 0 _lastMessageId = Long.ZERO @@ -139,6 +139,10 @@ export class MtprotoSession { readonly _salts: ServerSaltManager, ) { this.log.prefix = `[SESSION ${this._sessionId.toString(16)}] ` + + this._authKey = new AuthKey(_crypto, log, _readerMap) + this._authKeyTemp = new AuthKey(_crypto, log, _readerMap) + this._authKeyTempSecondary = new AuthKey(_crypto, log, _readerMap) } get hasPendingMessages(): boolean { diff --git a/packages/core/src/network/network-manager.ts b/packages/core/src/network/network-manager.ts index 632c45d6..da746da2 100644 --- a/packages/core/src/network/network-manager.ts +++ b/packages/core/src/network/network-manager.ts @@ -188,53 +188,16 @@ export interface RpcCallOptions { */ export class DcConnectionManager { private _salts = new ServerSaltManager() - private __baseConnectionParams = (): SessionConnectionParams => ({ - crypto: this.manager.params.crypto, - initConnection: this.manager._initConnectionParams, - transportFactory: this.manager._transportFactory, - dc: this._dcs.media, - testMode: this.manager.params.testMode, - reconnectionStrategy: this.manager._reconnectionStrategy, - layer: this.manager.params.layer, - disableUpdates: this.manager.params.disableUpdates, - readerMap: this.manager.params.readerMap, - writerMap: this.manager.params.writerMap, - usePfs: this.manager.params.usePfs, - isMainConnection: false, - isMainDcConnection: this.isPrimary, - inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000, - enableErrorReporting: this.manager.params.enableErrorReporting, - salts: this._salts, - }) - - private _log = this.manager._log.create('dc-manager') + private _log /** Main connection pool */ main: MultiSessionConnection - /** Upload connection pool */ - upload = new MultiSessionConnection( - this.__baseConnectionParams(), - this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium), - this._log, - 'UPLOAD', - ) - + upload: MultiSessionConnection /** Download connection pool */ - download = new MultiSessionConnection( - this.__baseConnectionParams(), - this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium), - this._log, - 'DOWNLOAD', - ) - + download: MultiSessionConnection /** Download connection pool (for small files) */ - downloadSmall = new MultiSessionConnection( - this.__baseConnectionParams(), - this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium), - this._log, - 'DOWNLOAD_SMALL', - ) + downloadSmall: MultiSessionConnection private get _mainConnectionCount() { if (!this.isPrimary) return 1 @@ -252,9 +215,29 @@ export class DcConnectionManager { /** Whether this DC is the primary one */ public isPrimary = false, ) { + this._log = this.manager._log.create('dc-manager') this._log.prefix = `[DC ${dcId}] ` - const mainParams = this.__baseConnectionParams() + const baseConnectionParams = (): SessionConnectionParams => ({ + crypto: this.manager.params.crypto, + initConnection: this.manager._initConnectionParams, + transportFactory: this.manager._transportFactory, + dc: this._dcs.media, + testMode: this.manager.params.testMode, + reconnectionStrategy: this.manager._reconnectionStrategy, + layer: this.manager.params.layer, + disableUpdates: this.manager.params.disableUpdates, + readerMap: this.manager.params.readerMap, + writerMap: this.manager.params.writerMap, + usePfs: this.manager.params.usePfs, + isMainConnection: false, + isMainDcConnection: this.isPrimary, + inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000, + enableErrorReporting: this.manager.params.enableErrorReporting, + salts: this._salts, + }) + + const mainParams = baseConnectionParams() mainParams.isMainConnection = true mainParams.dc = _dcs.main @@ -263,6 +246,24 @@ export class DcConnectionManager { } this.main = new MultiSessionConnection(mainParams, this._mainConnectionCount, this._log, 'MAIN') + this.upload = new MultiSessionConnection( + baseConnectionParams(), + this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium), + this._log, + 'UPLOAD', + ) + this.download = new MultiSessionConnection( + baseConnectionParams(), + this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium), + this._log, + 'DOWNLOAD', + ) + this.downloadSmall = new MultiSessionConnection( + baseConnectionParams(), + this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium), + this._log, + 'DOWNLOAD_SMALL', + ) this._setupMulti('main') this._setupMulti('upload') @@ -425,8 +426,8 @@ export class DcConnectionManager { * Class that manages all connections to Telegram servers. */ export class NetworkManager { - readonly _log = this.params.log.create('network') - readonly _storage = this.params.storage + readonly _log + readonly _storage readonly _initConnectionParams: tl.RawInitConnectionRequest readonly _transportFactory: TransportFactory @@ -465,6 +466,9 @@ export class NetworkManager { this._onConfigChanged = this._onConfigChanged.bind(this) config.onReload(this._onConfigChanged) + + this._log = params.log.create('network') + this._storage = params.storage } private async _findDcOptions(dcId: number): Promise { diff --git a/packages/core/src/network/session-connection.ts b/packages/core/src/network/session-connection.ts index 27bb18b4..401162ba 100644 --- a/packages/core/src/network/session-connection.ts +++ b/packages/core/src/network/session-connection.ts @@ -70,7 +70,7 @@ function makeNiceStack(error: tl.RpcError, stack: string, method?: string) { * A connection to a single DC. */ export class SessionConnection extends PersistentConnection { - readonly params!: SessionConnectionParams + declare readonly params: SessionConnectionParams private _flushTimer = new EarlyTimer() private _queuedDestroySession: Long[] = [] @@ -78,7 +78,7 @@ export class SessionConnection extends PersistentConnection { // waitForMessage private _pendingWaitForUnencrypted: [ControllablePromise, NodeJS.Timeout][] = [] - private _usePfs = this.params.usePfs ?? false + private _usePfs private _isPfsBindingPending = false private _isPfsBindingPendingInBackground = false private _pfsUpdateTimeout?: NodeJS.Timeout @@ -102,9 +102,12 @@ export class SessionConnection extends PersistentConnection { this._crypto = params.crypto this._salts = params.salts this._handleRawMessage = this._handleRawMessage.bind(this) + + this._usePfs = this.params.usePfs ?? false + this._online = getPlatform().isOnline?.() ?? true } - private _online = getPlatform().isOnline?.() ?? true + private _online getAuthKey(temp = false): Uint8Array | null { const key = temp ? this._session._authKeyTemp : this._session._authKey diff --git a/packages/core/src/storage/memory/repository/auth-keys.ts b/packages/core/src/storage/memory/repository/auth-keys.ts index 79396198..233184b5 100644 --- a/packages/core/src/storage/memory/repository/auth-keys.ts +++ b/packages/core/src/storage/memory/repository/auth-keys.ts @@ -8,13 +8,14 @@ interface AuthKeysState { } export class MemoryAuthKeysRepository implements IAuthKeysRepository { - constructor(readonly _driver: MemoryStorageDriver) {} - - readonly state = this._driver.getState('authKeys', () => ({ - authKeys: new Map(), - authKeysTemp: new Map(), - authKeysTempExpiry: new Map(), - })) + readonly state + constructor(readonly _driver: MemoryStorageDriver) { + this.state = this._driver.getState('authKeys', () => ({ + authKeys: new Map(), + authKeysTemp: new Map(), + authKeysTempExpiry: new Map(), + })) + } set(dc: number, key: Uint8Array | null): void { if (key) { diff --git a/packages/core/src/storage/memory/repository/kv.ts b/packages/core/src/storage/memory/repository/kv.ts index f97c1b63..fe2fca6f 100644 --- a/packages/core/src/storage/memory/repository/kv.ts +++ b/packages/core/src/storage/memory/repository/kv.ts @@ -2,9 +2,10 @@ import { IKeyValueRepository } from '../../repository/key-value.js' import { MemoryStorageDriver } from '../driver.js' export class MemoryKeyValueRepository implements IKeyValueRepository { - constructor(readonly _driver: MemoryStorageDriver) {} - - readonly state = this._driver.getState>('kv', () => new Map()) + readonly state + constructor(readonly _driver: MemoryStorageDriver) { + this.state = this._driver.getState>('kv', () => new Map()) + } set(key: string, value: Uint8Array): void { this.state.set(key, value) diff --git a/packages/core/src/storage/memory/repository/peers.ts b/packages/core/src/storage/memory/repository/peers.ts index 9c5cb621..6d2b7eac 100644 --- a/packages/core/src/storage/memory/repository/peers.ts +++ b/packages/core/src/storage/memory/repository/peers.ts @@ -8,13 +8,14 @@ interface PeersState { } export class MemoryPeersRepository implements IPeersRepository { - constructor(readonly _driver: MemoryStorageDriver) {} - - readonly state = this._driver.getState('peers', () => ({ - entities: new Map(), - usernameIndex: new Map(), - phoneIndex: new Map(), - })) + readonly state + constructor(readonly _driver: MemoryStorageDriver) { + this.state = this._driver.getState('peers', () => ({ + entities: new Map(), + usernameIndex: new Map(), + phoneIndex: new Map(), + })) + } store(peer: IPeersRepository.PeerInfo): void { const old = this.state.entities.get(peer.id) diff --git a/packages/core/src/storage/memory/repository/ref-messages.ts b/packages/core/src/storage/memory/repository/ref-messages.ts index cb65d409..0cb2b746 100644 --- a/packages/core/src/storage/memory/repository/ref-messages.ts +++ b/packages/core/src/storage/memory/repository/ref-messages.ts @@ -6,11 +6,12 @@ interface RefMessagesState { } export class MemoryRefMessagesRepository implements IReferenceMessagesRepository { - constructor(readonly _driver: MemoryStorageDriver) {} - - readonly state = this._driver.getState('refMessages', () => ({ - refs: new Map(), - })) + readonly state + constructor(readonly _driver: MemoryStorageDriver) { + this.state = this._driver.getState('refMessages', () => ({ + refs: new Map(), + })) + } store(peerId: number, chatId: number, msgId: number): void { if (!this.state.refs.has(peerId)) { diff --git a/packages/core/src/storage/sqlite/index.ts b/packages/core/src/storage/sqlite/index.ts index 37218f7d..038ef9f8 100644 --- a/packages/core/src/storage/sqlite/index.ts +++ b/packages/core/src/storage/sqlite/index.ts @@ -10,10 +10,15 @@ export { BaseSqliteStorageDriver } export * from './types.js' export class BaseSqliteStorage implements IMtStorageProvider, ITelegramStorageProvider { - constructor(readonly driver: BaseSqliteStorageDriver) {} + readonly authKeys + readonly kv + readonly refMessages + readonly peers - readonly authKeys = new SqliteAuthKeysRepository(this.driver) - readonly kv = new SqliteKeyValueRepository(this.driver) - readonly refMessages = new SqliteRefMessagesRepository(this.driver) - readonly peers = new SqlitePeersRepository(this.driver) + constructor(readonly driver: BaseSqliteStorageDriver) { + this.authKeys = new SqliteAuthKeysRepository(this.driver) + this.kv = new SqliteKeyValueRepository(this.driver) + this.refMessages = new SqliteRefMessagesRepository(this.driver) + this.peers = new SqlitePeersRepository(this.driver) + } } diff --git a/packages/core/src/storage/storage.ts b/packages/core/src/storage/storage.ts index 6563a007..5303972c 100644 --- a/packages/core/src/storage/storage.ts +++ b/packages/core/src/storage/storage.ts @@ -40,23 +40,30 @@ export interface StorageManagerExtraOptions { } export class StorageManager { - constructor(readonly options: StorageManagerOptions & StorageManagerExtraOptions) {} + readonly provider + readonly driver + readonly log + readonly dcs + readonly salts + readonly keys - readonly provider = this.options.provider - readonly driver = this.provider.driver - readonly log = this.options.log.create('storage') + constructor(readonly options: StorageManagerOptions & StorageManagerExtraOptions) { + this.provider = this.options.provider + this.driver = this.provider.driver + this.log = this.options.log.create('storage') - readonly _serviceOptions: ServiceOptions = { - driver: this.driver, - readerMap: this.options.readerMap, - writerMap: this.options.writerMap, - log: this.log, + const serviceOptions: ServiceOptions = { + driver: this.driver, + readerMap: this.options.readerMap, + writerMap: this.options.writerMap, + log: this.log, + } + + this.dcs = new DefaultDcsService(this.provider.kv, serviceOptions) + this.salts = new FutureSaltsService(this.provider.kv, serviceOptions) + this.keys = new AuthKeysService(this.provider.authKeys, this.salts, serviceOptions) } - readonly dcs = new DefaultDcsService(this.provider.kv, this._serviceOptions) - readonly salts = new FutureSaltsService(this.provider.kv, this._serviceOptions) - readonly keys = new AuthKeysService(this.provider.authKeys, this.salts, this._serviceOptions) - private _cleanupRestore?: () => void private _load = asyncResettable(async () => { diff --git a/packages/core/src/utils/logger.ts b/packages/core/src/utils/logger.ts index 37285794..4c7b08c4 100644 --- a/packages/core/src/utils/logger.ts +++ b/packages/core/src/utils/logger.ts @@ -142,21 +142,24 @@ export class LogManager extends Logger { static DEBUG = 4 static VERBOSE = 5 + readonly platform + level: number + handler + constructor(tag = 'base') { // workaround because we cant pass this to super // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument super(null as any, tag) // eslint-disable-next-line @typescript-eslint/no-explicit-any ;(this as any).mgr = this + + this.platform = getPlatform() + this.level = this.platform.getDefaultLogLevel() ?? DEFAULT_LOG_LEVEL + this.handler = this.platform.log.bind(this.platform) } private _filter: (tag: string) => boolean = defaultFilter - readonly platform = getPlatform() - - level = this.platform.getDefaultLogLevel() ?? DEFAULT_LOG_LEVEL - handler = this.platform.log.bind(this.platform) - /** * Create a {@link Logger} with the given tag * diff --git a/packages/mtproxy/fake-tls.ts b/packages/mtproxy/fake-tls.ts index 5044ffd9..b8cfbf5b 100644 --- a/packages/mtproxy/fake-tls.ts +++ b/packages/mtproxy/fake-tls.ts @@ -165,7 +165,7 @@ class TlsHelloWriter implements TlsOperationHandler { pos = 0 private _domain: Buffer - private _grease = initGrease(this.crypto, 7) + private _grease private _scopes: number[] = [] constructor( @@ -175,6 +175,7 @@ class TlsHelloWriter implements TlsOperationHandler { ) { this._domain = domain this.buf = Buffer.allocUnsafe(size) + this._grease = initGrease(this.crypto, 7) } string(buf: Buffer) { diff --git a/packages/node/src/common-internals-node/platform.ts b/packages/node/src/common-internals-node/platform.ts index 49f7ca60..afd58299 100644 --- a/packages/node/src/common-internals-node/platform.ts +++ b/packages/node/src/common-internals-node/platform.ts @@ -12,9 +12,9 @@ const toBuffer = (buf: Uint8Array): Buffer => Buffer.from(buf.buffer, buf.byteOf export class NodePlatform implements ICorePlatform { // ICorePlatform - log!: typeof defaultLoggingHandler - beforeExit!: typeof beforeExit - normalizeFile!: typeof normalizeFile + declare log: typeof defaultLoggingHandler + declare beforeExit: typeof beforeExit + declare normalizeFile: typeof normalizeFile getDeviceModel(): string { return `${os.type()} ${os.arch()} ${os.release()}` diff --git a/packages/web/src/idb/index.ts b/packages/web/src/idb/index.ts index 3d76b78d..cadcd054 100644 --- a/packages/web/src/idb/index.ts +++ b/packages/web/src/idb/index.ts @@ -15,11 +15,17 @@ export { IdbStorageDriver } from './driver.js' * recommended over local storage based one. */ export class IdbStorage implements IMtStorageProvider { - constructor(readonly dbName: string) {} + readonly driver + readonly kv + readonly authKeys + readonly peers + readonly refMessages - readonly driver = new IdbStorageDriver(this.dbName) - readonly kv = new IdbKvRepository(this.driver) - readonly authKeys = new IdbAuthKeysRepository(this.driver) - readonly peers = new IdbPeersRepository(this.driver) - readonly refMessages = new IdbRefMsgRepository(this.driver) + constructor(readonly dbName: string) { + this.driver = new IdbStorageDriver(this.dbName) + this.kv = new IdbKvRepository(this.driver) + this.authKeys = new IdbAuthKeysRepository(this.driver) + this.peers = new IdbPeersRepository(this.driver) + this.refMessages = new IdbRefMsgRepository(this.driver) + } } diff --git a/packages/web/src/platform.ts b/packages/web/src/platform.ts index 027c47b5..d90f2c3a 100644 --- a/packages/web/src/platform.ts +++ b/packages/web/src/platform.ts @@ -8,8 +8,8 @@ import { defaultLoggingHandler } from './logging.js' export class WebPlatform implements ICorePlatform { // ICorePlatform - log!: typeof defaultLoggingHandler - beforeExit!: typeof beforeExit + declare log: typeof defaultLoggingHandler + declare beforeExit: typeof beforeExit getDeviceModel(): string { if (typeof navigator === 'undefined') return 'Browser' @@ -47,14 +47,14 @@ export class WebPlatform implements ICorePlatform { } // ITlPlatform - utf8ByteLength!: typeof utf8ByteLength - utf8Encode!: typeof utf8Encode - utf8Decode!: typeof utf8Decode - hexEncode!: typeof hexEncode - hexDecode!: typeof hexDecode + declare utf8ByteLength: typeof utf8ByteLength + declare utf8Encode: typeof utf8Encode + declare utf8Decode: typeof utf8Decode + declare hexEncode: typeof hexEncode + declare hexDecode: typeof hexDecode - base64Encode!: typeof base64Encode - base64Decode!: typeof base64Decode + declare base64Encode: typeof base64Encode + declare base64Decode: typeof base64Decode } WebPlatform.prototype.log = defaultLoggingHandler diff --git a/tsconfig.json b/tsconfig.json index d3481db6..92538b93 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "outDir": "./dist", "module": "NodeNext", "moduleResolution": "NodeNext", - "target": "es2020", + "target": "es2022", "allowJs": true, "sourceMap": true, "inlineSources": true, @@ -29,6 +29,7 @@ ], "resolveJsonModule": true, "isolatedModules": true, + "useDefineForClassFields": true, }, "ts-node": { "esm": true,