Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ option(JSRUNTIMEHOST_POLYFILL_FILE "Include JsRuntimeHost Polyfill File and File
option(JSRUNTIMEHOST_POLYFILL_PERFORMANCE "Include JsRuntimeHost Polyfill Performance." ON)
option(JSRUNTIMEHOST_POLYFILL_TEXTDECODER "Include JsRuntimeHost Polyfill TextDecoder." ON)
option(JSRUNTIMEHOST_POLYFILL_TEXTENCODER "Include JsRuntimeHost Polyfill TextEncoder." ON)
option(JSRUNTIMEHOST_POLYFILL_STREAMS "Include JsRuntimeHost Polyfill Web Streams." ON)
option(JSRUNTIMEHOST_POLYFILL_COMPRESSION "Include JsRuntimeHost Polyfills CompressionStream and DecompressionStream." ON)

# Sanitizers
option(ENABLE_SANITIZERS "Enable AddressSanitizer and UBSan" OFF)
Expand Down
13 changes: 12 additions & 1 deletion Polyfills/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,15 @@ endif()

if(JSRUNTIMEHOST_POLYFILL_TEXTENCODER)
add_subdirectory(TextEncoder)
endif()
endif()

if(JSRUNTIMEHOST_POLYFILL_STREAMS)
add_subdirectory(Streams)
endif()

if(JSRUNTIMEHOST_POLYFILL_COMPRESSION)
if(NOT JSRUNTIMEHOST_POLYFILL_STREAMS)
message(FATAL_ERROR "The Compression polyfill requires the Streams polyfill.")
endif()
add_subdirectory(Compression)
endif()
59 changes: 59 additions & 0 deletions Polyfills/Compression/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
if(APPLE)
# FindZLIB exposes the SDK's usr/include as an explicit system include on
# recent Xcode versions. That breaks libc++'s include_next ordering. The
# header and library are both SDK-provided, so only add the link library.
find_library(JSRUNTIMEHOST_COMPRESSION_ZLIB_LIBRARY NAMES z REQUIRED)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET "${JSRUNTIMEHOST_COMPRESSION_ZLIB_LIBRARY}")
elseif(TARGET ZLIB::ZLIB)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET ZLIB::ZLIB)
elseif(TARGET zlibstatic)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET zlibstatic)
elseif(TARGET zlib)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET zlib)
else()
find_package(ZLIB QUIET)
if(ZLIB_FOUND)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET ZLIB::ZLIB)
else()
set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SKIP_INSTALL_ALL ON CACHE BOOL "" FORCE)
FetchContent_Declare(jsruntimehost_zlib
GIT_REPOSITORY https://github.com/madler/zlib.git
GIT_TAG 51b7f2abdade71cd9bb0e7a373ef2610ec6f9daf
EXCLUDE_FROM_ALL)
FetchContent_MakeAvailable_With_Message(jsruntimehost_zlib)
set(JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET zlibstatic)
set_property(TARGET zlibstatic PROPERTY FOLDER Dependencies)
endif()
endif()

set(COMPRESSION_POLYFILL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/Source/CompressionPolyfill.js")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${COMPRESSION_POLYFILL_FILE}")
file(READ "${COMPRESSION_POLYFILL_FILE}" COMPRESSION_POLYFILL_SOURCE)
configure_file(
"Source/CompressionScripts.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/Generated/CompressionScripts.h"
@ONLY)

set(SOURCES
"Include/Babylon/Polyfills/Compression.h"
"README.md"
"Source/Compression.cpp"
"Source/CompressionPolyfill.js"
"Source/CompressionScripts.h.in"
"ThirdParty/zlib/LICENSE")

add_library(Compression ${SOURCES})
warnings_as_errors(Compression)

target_include_directories(Compression
PUBLIC "Include"
PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/Generated")

target_link_libraries(Compression
PUBLIC JsRuntime
PUBLIC Streams
PRIVATE ${JSRUNTIMEHOST_COMPRESSION_ZLIB_TARGET})

set_property(TARGET Compression PROPERTY FOLDER Polyfills)
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES})
11 changes: 11 additions & 0 deletions Polyfills/Compression/Include/Babylon/Polyfills/Compression.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include <Babylon/Api.h>
#include <napi/env.h>

namespace Babylon::Polyfills::Compression
{
// Installs CompressionStream and DecompressionStream when the host does
// not already provide them. The Streams polyfill is initialized first.
void BABYLON_API Initialize(Napi::Env env);
}
16 changes: 16 additions & 0 deletions Polyfills/Compression/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Compression streams

This optional polyfill installs the browser `CompressionStream` and
`DecompressionStream` interfaces when the JavaScript host does not already
provide them. It supports the interoperable `deflate`, `deflate-raw`, and
`gzip` formats using zlib and the WHATWG Streams API.

Input `BufferSource` memory is borrowed only for the duration of a synchronous
codec call. Output is accumulated before invoking JavaScript so an enqueue
callback cannot invalidate an input buffer still in use. A native 64 KiB
scratch buffer is reused for the lifetime of each active stream; each emitted
`Uint8Array` receives one exact-size copy into JavaScript-owned memory.

The module uses an existing CMake zlib target or the platform zlib package when
available. It fetches pinned zlib 1.3.1 only when no zlib package is present.
The zlib license is included under `ThirdParty/zlib`.
Loading