fix(core): improved error when trying to use peers before starting the client
This commit is contained in:
parent
a7c7a636cd
commit
470b6ca635
1 changed files with 18 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
||||||
import { IPeersRepository } from '../../../highlevel/storage/repository/peers.js'
|
import { IPeersRepository } from '../../../highlevel/storage/repository/peers.js'
|
||||||
|
import { MtcuteError } from '../../../types/errors.js'
|
||||||
import { BaseSqliteStorageDriver } from '../driver.js'
|
import { BaseSqliteStorageDriver } from '../driver.js'
|
||||||
import { ISqliteStatement } from '../types.js'
|
import { ISqliteStatement } from '../types.js'
|
||||||
|
|
||||||
|
@ -23,6 +24,8 @@ function mapPeerDto(dto: PeerDto): IPeersRepository.PeerInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SqlitePeersRepository implements IPeersRepository {
|
export class SqlitePeersRepository implements IPeersRepository {
|
||||||
|
private _loaded = false
|
||||||
|
|
||||||
constructor(readonly _driver: BaseSqliteStorageDriver) {
|
constructor(readonly _driver: BaseSqliteStorageDriver) {
|
||||||
_driver.registerMigration('peers', 1, (db) => {
|
_driver.registerMigration('peers', 1, (db) => {
|
||||||
db.exec(`
|
db.exec(`
|
||||||
|
@ -39,6 +42,8 @@ export class SqlitePeersRepository implements IPeersRepository {
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
_driver.onLoad((db) => {
|
_driver.onLoad((db) => {
|
||||||
|
this._loaded = true
|
||||||
|
|
||||||
this._store = db.prepare(
|
this._store = db.prepare(
|
||||||
'insert or replace into peers (id, hash, usernames, updated, phone, complete) values (?, ?, ?, ?, ?, ?)',
|
'insert or replace into peers (id, hash, usernames, updated, phone, complete) values (?, ?, ?, ?, ?, ?)',
|
||||||
)
|
)
|
||||||
|
@ -57,6 +62,16 @@ export class SqlitePeersRepository implements IPeersRepository {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _ensureLoaded() {
|
||||||
|
// this is (so far) the only repo where we do such check because it's a common mistake to forget to call start()
|
||||||
|
// or connect() on the client and immediately start using high-level methods, which in turn try to resolve peers
|
||||||
|
// from the database, and fail because nothing is initialized yet
|
||||||
|
|
||||||
|
if (!this._loaded) {
|
||||||
|
throw new MtcuteError('Peers repository is not loaded. Have you called client.start() (or similar)?')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private _store!: ISqliteStatement
|
private _store!: ISqliteStatement
|
||||||
store(peer: IPeersRepository.PeerInfo): void {
|
store(peer: IPeersRepository.PeerInfo): void {
|
||||||
this._driver._writeLater(this._store, [
|
this._driver._writeLater(this._store, [
|
||||||
|
@ -71,6 +86,7 @@ export class SqlitePeersRepository implements IPeersRepository {
|
||||||
|
|
||||||
private _getById!: ISqliteStatement
|
private _getById!: ISqliteStatement
|
||||||
getById(id: number): IPeersRepository.PeerInfo | null {
|
getById(id: number): IPeersRepository.PeerInfo | null {
|
||||||
|
this._ensureLoaded()
|
||||||
const row = this._getById.get(id)
|
const row = this._getById.get(id)
|
||||||
if (!row) return null
|
if (!row) return null
|
||||||
|
|
||||||
|
@ -79,6 +95,7 @@ export class SqlitePeersRepository implements IPeersRepository {
|
||||||
|
|
||||||
private _getByUsername!: ISqliteStatement
|
private _getByUsername!: ISqliteStatement
|
||||||
getByUsername(username: string): IPeersRepository.PeerInfo | null {
|
getByUsername(username: string): IPeersRepository.PeerInfo | null {
|
||||||
|
this._ensureLoaded()
|
||||||
const row = this._getByUsername.get(username)
|
const row = this._getByUsername.get(username)
|
||||||
if (!row) return null
|
if (!row) return null
|
||||||
|
|
||||||
|
@ -87,6 +104,7 @@ export class SqlitePeersRepository implements IPeersRepository {
|
||||||
|
|
||||||
private _getByPhone!: ISqliteStatement
|
private _getByPhone!: ISqliteStatement
|
||||||
getByPhone(phone: string): IPeersRepository.PeerInfo | null {
|
getByPhone(phone: string): IPeersRepository.PeerInfo | null {
|
||||||
|
this._ensureLoaded()
|
||||||
const row = this._getByPhone.get(phone)
|
const row = this._getByPhone.get(phone)
|
||||||
if (!row) return null
|
if (!row) return null
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue