KeepSolid Sign — приложение для подписи документов под все популярные платформы. Его ядро написано на C++ и однажды поступила задача сделать веб-версию. Тимофей Лавренюк рассказывает о том, через что получилось пройти, чтобы в итоге сделать веб-приложение не хуже нативного.
35. Есть режим автораЕсть режим автора
Работает в OfflineРаботает в Offline
Новая WEB-версия
3 . 16
36. Есть режим автораЕсть режим автора
Работает в OfflineРаботает в Offline
Не уступает нативнымНе уступает нативным
клиентамклиентам
Новая WEB-версия
3 . 16
37. Криптография
Offline + Web Worker Работа с PDFОбщение с RPC-сервером
Framework Progressive Web App
4
103. CacheStorage CacheStorage Нет гибкости
File APIFile API FileWriter deprecated
CookiesCookies WATTT??
WebSQLWebSQL Deprecated
IndexedDBIndexedDB
LocalStorageLocalStorage Небольшой лимит
8 . 4
104. CacheStorage CacheStorage Нет гибкости
File APIFile API FileWriter deprecated
CookiesCookies WATTT??
WebSQLWebSQL Deprecated
IndexedDBIndexedDB
Большой лимит
Хорошая поддержка
Не Deprecated
LocalStorageLocalStorage Небольшой лимит
8 . 4
109. IndexedDBIndexedDB
объектно-ориентированная база данныхобъектно-ориентированная база данных
хранит обьекты, проиндексированные с ключомхранит обьекты, проиндексированные с ключом
выполнение операций происходит асинхронновыполнение операций происходит асинхронно
умеет хранить JS-объекты и блобыумеет хранить JS-объекты и блобы
8 . 5
110. IndexedDBIndexedDB
объектно-ориентированная база данныхобъектно-ориентированная база данных
хранит обьекты, проиндексированные с ключомхранит обьекты, проиндексированные с ключом
выполнение операций происходит асинхронновыполнение операций происходит асинхронно
имеет жутко неудобное низкоуровневое APIимеет жутко неудобное низкоуровневое API
умеет хранить JS-объекты и блобыумеет хранить JS-объекты и блобы
8 . 5
116. 1. Открыть или создать базу
var open = indexedDB.open("MyDatabase", 1);
9 . 2
117. 1. Открыть или создать базу
var open = indexedDB.open("MyDatabase", 1);
2. Создать Schema
9 . 2
118. 1. Открыть или создать базу
var open = indexedDB.open("MyDatabase", 1);
2. Создать Schema
open.onupgradeneeded = () => {
const db = open.result;
const store = db.createObjectStore("MyObjectStore", {keyPath: "id"});
const index = store.createIndex("NameIndex", ["name.last", "name.first"]);
};
9 . 2
134. Недостатки чистого IndexedDBНедостатки чистого IndexedDB
Тяжело поддерживать
Не поддержки JOIN'ов
Нельзя частично обновить документ
Скудная сортировка
9 . 6
135. Недостатки чистого IndexedDBНедостатки чистого IndexedDB
Тяжело поддерживать
Не поддержки JOIN'ов
Нельзя частично обновить документ
Скудная сортировка
Auto-commit транзакций
9 . 6
163. SQL-подобный APISQL-подобный API
SQL Lovefield
SELECT *
FROM Documents
WHERE type = "TEMPLATE"
Database
.select()
.from(document)
.where(document.type.eq('TEMPLATE'))
.exec()
9 . 13
164. SQL-подобный APISQL-подобный API
SQL Lovefield
SELECT *
FROM Documents
WHERE type = "TEMPLATE"
Database
.select()
.from(document)
.where(document.type.eq('TEMPLATE'))
.exec()
SELECT encryptionKey
FROM Documents
WHERE signOrder >= 1
ORDER BY signOrder DESC
LIMIT 10
9 . 13
165. SQL-подобный APISQL-подобный API
SQL Lovefield
SELECT *
FROM Documents
WHERE type = "TEMPLATE"
Database
.select()
.from(document)
.where(document.type.eq('TEMPLATE'))
.exec()
SELECT encryptionKey
FROM Documents
WHERE signOrder >= 1
ORDER BY signOrder DESC
LIMIT 10
Database
.select(document.encryptionKey)
.from(document)
.where(document.signOrder.gte(1))
.orderBy(document.signOrder, lf.Order.DESC)
.limit(10)
.exec()
9 . 13
179. Data ObservationData Observation
var query = db.select()
.from(documents)
.where(documents.id.eq('1'));
var handler = function(changes) {
// Будет вызываться всегда, когда происходит изменение данных
};
db.observe(query, handler);
db.update(documents)
.set(documents.title, 'New Title')
.where(documents.id.eq('1'))
.exec();
db.unobserve(query, handler);
9 . 17