Ao aplicarmos o module pattern ao objeto ConnectionFactory podemos 'subir' o método privado e estático _createStores para o escopo da IIF (e futuramente modulo), garantindo assim que o ninguém tenha acesso a ele
exemplo:
const stores = ['negociacoes']
const version = 2
const dbName = 'alura-frame'
let connection = null
let close = null
const createStores = connection => {
stores.forEach(s => {
if (connection.objectStoreNames.contains(s))
connection.deleteObjectStore(s)
connection.createObjectStore(s, { autoIncrement: true });
});
}
export class ConnectionFactory {
constructor() {
throw new Error('Não é possível criar instâncias de ConnectionFactory')
}
static getConnection() {
return new Promise((resolve, reject) => {
let openRequest = window.indexedDB.open(dbName, version)
openRequest.onupgradeneeded = event => {
createStores(event.target.result)
}
openRequest.onsuccess = event => {
if (!connection) {
connection = event.target.result
close = connection.close.bind(connection)
connection.close = () => {
throw new Error('Não é possível fechar diretamente a conexão')
}
}
resolve(connection)
}
openRequest.onerror = event => {
console.log(event.target.error)
reject(event.target.error.name)
}
})
}
static closeConnection() {
if (connection) {
close()
connection = null
}
}
}