Расширения
Загрузка (динамических) расширений DuckDB-Wasm моделируется по образцу загрузки расширений обычного DuckDB, с некоторыми существенными отличиями из-за различий в платформе.
Формат
Расширения в DuckDB представляют собой двоичные файлы, которые загружаются динамически через dlopen. К двоичному файлу добавляется криптографическая подпись. Расширение в DuckDB-Wasm представляет собой обычный файл Wasm, который загружается динамически через dlopen Emscripten. К файлу Wasm добавляется криптографическая подпись в виде специального раздела WebAssembly, называемого duckdb_signature. Это гарантирует, что файл остаётся корректным файлом WebAssembly.
В настоящее время мы требуем, чтобы этот специальный раздел был последним, но в будущем это может быть изменено.
INSTALL и LOAD
Семантика INSTALL в родственных встраиваниях DuckDB заключается в извлечении, распаковке из gzip и сохранении данных в локальном диске. Семантика LOAD в родственных встраиваниях DuckDB заключается в (необязательной) проверке подписи и динамической загрузке двоичного файла вместе с основным двоичным файлом DuckDB.
В DuckDB-Wasm, INSTALL является пустой операцией, так как нет долговременного хранения между сеансами. Операция LOAD будет извлекать (и распаковывать на лету), проверять подписи и динамически загружать через реализацию Emscripten dlopen.
Автозагрузка
Автозагрузка, т.е. возможность для DuckDB добавлять функциональность расширения в режиме реального времени, включена по умолчанию в DuckDB-Wasm.
Список официально доступных расширений
| Название расширения | Описание | Псевдонимы |
|---|---|---|
| autocomplete | Добавляет поддержку автозаполнения в оболочке | |
| excel | Добавляет поддержку строк формата, похожих на Excel | |
| fts | Добавляет поддержку индексов полнотекстового поиска | |
| icu | Добавляет поддержку часовых поясов и сортировок с использованием библиотеки ICU | |
| inet | Добавляет поддержку типов и функций, связанных с IP-адресами | |
| json | Добавляет поддержку операций с JSON | |
| parquet | Добавляет поддержку чтения и записи файлов Parquet | |
| sqlite GitHub | Добавляет поддержку чтения файлов баз данных SQLite | sqlite, sqlite3 |
| sqlsmith | ||
| substrait GitHub | Добавляет поддержку интеграции Substrait | |
| tpcds | Добавляет поддержку генерации и запросов данных TPC-DS | |
| tpch | Добавляет поддержку генерации и запросов данных TPC-H |
WebAssembly — это, по сути, дополнительная платформа, и могут быть платформенные ограничения, которые не позволяют некоторым расширениям соответствовать своим родственным возможностям или выполнять их по-другому. Здесь будут описаны существенные различия для расширений, размещаемых в DuckDB.
HTTPFS
Расширение HTTPFS в настоящее время недоступно в DuckDB-Wasm. Возможности протокола https требуют дополнительного уровня, браузера, который добавляет как отличия, так и некоторые ограничения на то, что можно сделать из родственной среды.
Вместо этого DuckDB-Wasm имеет отдельную реализацию, которая в большинстве случаев взаимозаменяема, но не поддерживает все варианты использования (поскольку она должна соблюдать правила безопасности, налагаемые браузером, такие как CORS). Из-за этого ограничения CORS любые запросы данных, сделанные с помощью расширения HTTPFS, должны направляться на веб-сайты, которые разрешают (с использованием заголовков CORS) веб-сайту, на котором размещается экземпляр DuckDB-Wasm, доступ к этим данным. Сайт MDN является отличным ресурсом для получения дополнительной информации о CORS.
Подпись расширений
Как и в обычных расширениях DuckDB, расширения DuckDB-Wasm по умолчанию проверяются на LOAD для проверки подписи, чтобы убедиться, что расширение не было повреждено. Проверка подписи расширения может быть отключена с помощью опции конфигурации. Подпись — это свойство самого двоичного файла, поэтому копирование расширения DuckDB (например, для его размещения в другом месте) сохранит действительную подпись (например, для локального разработки).
Загрузка расширений DuckDB-Wasm
Официальные расширения DuckDB размещаются по адресу extensions.duckdb.org, и это также значение по умолчанию для опции default_extension_repository. При установке расширений будет сгенерирован соответствующий URL, который будет выглядеть так: extensions.duckdb.org/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.gz.
Расширения DuckDB-Wasm загружаются только при загрузке, и URL будет выглядеть так: extensions.duckdb.org/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm.
Обратите внимание, что к структуре папок добавляется дополнительный duckdb-wasm, и файл предоставляется как файл .wasm.
Расширения DuckDB-Wasm предоставляются в предварительно сжатом виде с использованием сжатия Brotli. При загрузке из браузера расширения будут прозрачно распакованы. Если вы хотите вручную загрузить расширение duckdb-wasm, вы можете использовать curl --compress extensions.duckdb.org/<...>/icu.duckdb_extension.wasm.
Размещение расширений из стороннего репозитория
Как и в обычном DuckDB, если вы используете SET custom_extension_repository = some.url.com, последующие попытки загрузки будут выполняться по адресу some.url.com/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm.
Обратите внимание, что запросы GET к расширениям должны быть разрешены CORS для браузера, чтобы разрешить подключение.
Инструменты
DuckDB-Wasm и его расширения были скомпилированы с использованием последней версии инструментальной цепочки Emscripten.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/api/wasm/extensions.html