server start

This commit is contained in:
2025-06-21 20:45:30 +02:00
parent abf864d98b
commit 1ff948af19
24 changed files with 4066 additions and 839 deletions

1
.gitignore vendored
View File

@@ -0,0 +1 @@
node_modules

1
server/.nvmrc Normal file
View File

@@ -0,0 +1 @@
v22.15.0

View File

@@ -1,4 +1,4 @@
{
"latest": "5.13.0",
"lastUpdateCheck": 1746738094002
"lastUpdateCheck": 1747087607661
}

Binary file not shown.

View File

@@ -4,7 +4,8 @@
"info": {
"singularName": "element",
"pluralName": "elements",
"displayName": "Element"
"displayName": "Element",
"description": ""
},
"options": {
"draftAndPublish": true
@@ -20,14 +21,21 @@
"type": "text"
},
"Image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images",
"files",
"videos",
"audios"
],
"type": "media",
"multiple": false
]
},
"Url": {
"type": "string",
"unique": true,
"required": true,
"regex": "[a-z0-9]"
}
}
}

1916
server/node_modules/.package-lock.json generated vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,61 +1,61 @@
{
"hash": "9edcf1e6",
"hash": "efc5c1a6",
"configHash": "96f1dd8e",
"lockfileHash": "19c9bd2a",
"browserHash": "1eb81ee0",
"lockfileHash": "56db8d13",
"browserHash": "9976a4e5",
"optimized": {
"react": {
"src": "../../../react/index.js",
"file": "react.js",
"fileHash": "7dfe0e9c",
"fileHash": "c80427c5",
"needsInterop": true
},
"react/jsx-runtime": {
"src": "../../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js",
"fileHash": "cf60935c",
"fileHash": "d265d8f2",
"needsInterop": true
},
"react-dom/client": {
"src": "../../../react-dom/client.js",
"file": "react-dom_client.js",
"fileHash": "2ed94d0e",
"fileHash": "c93adb79",
"needsInterop": true
},
"styled-components": {
"src": "../../../styled-components/dist/styled-components.browser.esm.js",
"file": "styled-components.js",
"fileHash": "07461124",
"fileHash": "c201fd22",
"needsInterop": false
},
"react-router-dom": {
"src": "../../../react-router-dom/dist/index.js",
"file": "react-router-dom.js",
"fileHash": "eda128bf",
"fileHash": "e8bbcb5b",
"needsInterop": false
},
"react/jsx-dev-runtime": {
"src": "../../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js",
"fileHash": "7ac906bf",
"fileHash": "bab1b549",
"needsInterop": true
},
"@strapi/plugin-cloud/strapi-admin": {
"src": "../../../@strapi/plugin-cloud/dist/admin/index.mjs",
"file": "@strapi_plugin-cloud_strapi-admin.js",
"fileHash": "b495c7e7",
"fileHash": "ec6d2399",
"needsInterop": false
},
"@strapi/plugin-users-permissions/strapi-admin": {
"src": "../../../@strapi/plugin-users-permissions/dist/admin/index.mjs",
"file": "@strapi_plugin-users-permissions_strapi-admin.js",
"fileHash": "1f2b8575",
"fileHash": "95b9b6ae",
"needsInterop": false
},
"@strapi/strapi/admin": {
"src": "../../../@strapi/strapi/dist/admin.mjs",
"file": "@strapi_strapi_admin.js",
"fileHash": "df6108d3",
"fileHash": "6a08dac2",
"needsInterop": false
}
},

View File

@@ -353,8 +353,8 @@ ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
endif
quiet_cmd_regen_makefile = ACTION Regenerating $@
cmd_regen_makefile = cd $(srcdir); /home/oier/.nvm/versions/node/v20.13.1/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/home/oier/.cache/node-gyp/20.13.1" "-Dnode_gyp_dir=/home/oier/.nvm/versions/node/v20.13.1/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/home/oier/.cache/node-gyp/20.13.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/home/oier/projects/fosil-group/pole-book/server/node_modules/better-sqlite3" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/home/oier/projects/fosil-group/pole-book/server/node_modules/better-sqlite3/build/config.gypi -I/home/oier/.nvm/versions/node/v20.13.1/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/home/oier/.cache/node-gyp/20.13.1/include/node/common.gypi "--toplevel-dir=." binding.gyp
Makefile: $(srcdir)/deps/defines.gypi $(srcdir)/../../../../../../.nvm/versions/node/v20.13.1/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/../../../../../../.cache/node-gyp/20.13.1/include/node/common.gypi $(srcdir)/deps/common.gypi $(srcdir)/deps/sqlite3.gyp $(srcdir)/binding.gyp $(srcdir)/build/config.gypi
cmd_regen_makefile = cd $(srcdir); /home/oier/.nvm/versions/node/v22.15.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/home/oier/.cache/node-gyp/22.15.0" "-Dnode_gyp_dir=/home/oier/.nvm/versions/node/v22.15.0/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/home/oier/.cache/node-gyp/22.15.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/home/oier/projects/fosil-group/pole-book/server/node_modules/better-sqlite3" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/home/oier/projects/fosil-group/pole-book/server/node_modules/better-sqlite3/build/config.gypi -I/home/oier/.nvm/versions/node/v22.15.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/home/oier/.cache/node-gyp/22.15.0/include/node/common.gypi "--toplevel-dir=." binding.gyp
Makefile: $(srcdir)/deps/common.gypi $(srcdir)/deps/sqlite3.gyp $(srcdir)/../../../../../../.nvm/versions/node/v22.15.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/deps/defines.gypi $(srcdir)/../../../../../../.cache/node-gyp/22.15.0/include/node/common.gypi $(srcdir)/build/config.gypi $(srcdir)/binding.gyp
$(call do_cmd,regen_makefile)
# "all" is a concatenation of the "all" targets from all the included

View File

@@ -1,123 +1,127 @@
cmd_Release/obj.target/better_sqlite3/src/better_sqlite3.o := g++ -o Release/obj.target/better_sqlite3/src/better_sqlite3.o ../src/better_sqlite3.cpp '-DNODE_GYP_MODULE_NAME=better_sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/home/oier/.cache/node-gyp/20.13.1/include/node -I/home/oier/.cache/node-gyp/20.13.1/src -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include -I/home/oier/.cache/node-gyp/20.13.1/deps/zlib -I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++17 -std=c++20 -MMD -MF ./Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d.raw -c
cmd_Release/obj.target/better_sqlite3/src/better_sqlite3.o := g++ -o Release/obj.target/better_sqlite3/src/better_sqlite3.o ../src/better_sqlite3.cpp '-DNODE_GYP_MODULE_NAME=better_sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/home/oier/.cache/node-gyp/22.15.0/include/node -I/home/oier/.cache/node-gyp/22.15.0/src -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fno-strict-aliasing -std=gnu++17 -std=c++20 -MMD -MF ./Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d.raw -c
Release/obj.target/better_sqlite3/src/better_sqlite3.o: \
../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \
Release/obj/gen/sqlite3/sqlite3.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/cppgc/common.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-array-buffer.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-local-handle.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-internal.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-version.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-object.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-maybe.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-persistent-handle.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-weak-callback-info.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-data.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-traced-handle.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-container.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-context.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-snapshot.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-date.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-debug.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-script.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-callbacks.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-promise.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-message.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-exception.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-extension.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-external.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function-callback.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-template.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-memory-span.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-initialization.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-isolate.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-heap.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-statistics.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-unwinder.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-state-scope.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-platform.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-json.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-locker.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask-queue.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive-object.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-proxy.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-regexp.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-typed-array.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value-serializer.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-wasm.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_version.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api_types.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api_types.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_object_wrap.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_buffer.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node.h
/home/oier/.cache/node-gyp/22.15.0/include/node/node.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/cppgc/common.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-array-buffer.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-local-handle.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-handle-base.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-internal.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-object.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-maybe.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-persistent-handle.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-weak-callback-info.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-data.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-value.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-traced-handle.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-container.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-context.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-snapshot.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-isolate.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-callbacks.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-promise.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-debug.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-script.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-memory-span.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-message.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-heap.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-function-callback.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-statistics.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-unwinder.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-state-scope.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-date.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-exception.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-extension.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-external.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-function.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-template.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-initialization.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-platform.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-source-location.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-json.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-locker.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask-queue.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive-object.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-proxy.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-regexp.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-typed-array.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-value-serializer.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-version.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-wasm.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node_version.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node_api.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api_types.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node_api_types.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node_object_wrap.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node_buffer.h \
/home/oier/.cache/node-gyp/22.15.0/include/node/node.h
../src/better_sqlite3.cpp:
../src/better_sqlite3.hpp:
Release/obj/gen/sqlite3/sqlite3.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/cppgc/common.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-array-buffer.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-local-handle.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-internal.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-version.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-object.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-maybe.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-persistent-handle.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-weak-callback-info.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-data.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-traced-handle.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-container.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-context.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-snapshot.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-date.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-debug.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-script.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-callbacks.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-promise.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-message.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-exception.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-extension.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-external.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function-callback.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-template.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-memory-span.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-initialization.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-isolate.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-heap.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-statistics.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-unwinder.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-state-scope.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-platform.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-json.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-locker.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask-queue.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive-object.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-proxy.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-regexp.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-typed-array.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value-serializer.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-wasm.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_version.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api_types.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api_types.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_object_wrap.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_buffer.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/cppgc/common.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-array-buffer.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-local-handle.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-handle-base.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-internal.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-object.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-maybe.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-persistent-handle.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-weak-callback-info.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-data.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-value.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-traced-handle.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-container.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-context.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-snapshot.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-isolate.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-callbacks.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-promise.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-debug.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-script.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-memory-span.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-message.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-heap.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-function-callback.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-statistics.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-unwinder.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-state-scope.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-date.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-exception.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-extension.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-external.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-function.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-template.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-initialization.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-platform.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-source-location.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-json.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-locker.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask-queue.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive-object.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-proxy.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-regexp.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-typed-array.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-value-serializer.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-version.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/v8-wasm.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node_version.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node_api.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api_types.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node_api_types.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node_object_wrap.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node_buffer.h:
/home/oier/.cache/node-gyp/22.15.0/include/node/node.h:

View File

@@ -1,4 +1,4 @@
cmd_Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o := cc -o Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o Release/obj/gen/sqlite3/sqlite3.c '-DNODE_GYP_MODULE_NAME=sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_INT16_T=1' '-DHAVE_INT32_T=1' '-DHAVE_INT8_T=1' '-DHAVE_STDINT_H=1' '-DHAVE_UINT16_T=1' '-DHAVE_UINT32_T=1' '-DHAVE_UINT8_T=1' '-DHAVE_USLEEP=1' '-DSQLITE_DEFAULT_CACHE_SIZE=-16000' '-DSQLITE_DEFAULT_FOREIGN_KEYS=1' '-DSQLITE_DEFAULT_MEMSTATUS=0' '-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' '-DSQLITE_DQS=0' '-DSQLITE_ENABLE_COLUMN_METADATA' '-DSQLITE_ENABLE_DBSTAT_VTAB' '-DSQLITE_ENABLE_DESERIALIZE' '-DSQLITE_ENABLE_FTS3' '-DSQLITE_ENABLE_FTS3_PARENTHESIS' '-DSQLITE_ENABLE_FTS4' '-DSQLITE_ENABLE_FTS5' '-DSQLITE_ENABLE_GEOPOLY' '-DSQLITE_ENABLE_JSON1' '-DSQLITE_ENABLE_MATH_FUNCTIONS' '-DSQLITE_ENABLE_RTREE' '-DSQLITE_ENABLE_STAT4' '-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' '-DSQLITE_OMIT_DEPRECATED' '-DSQLITE_OMIT_PROGRESS_CALLBACK' '-DSQLITE_OMIT_SHARED_CACHE' '-DSQLITE_OMIT_TCL_VARIABLE' '-DSQLITE_SOUNDEX' '-DSQLITE_THREADSAFE=2' '-DSQLITE_TRACE_SIZE_LIMIT=32' '-DSQLITE_USE_URI=0' '-DNDEBUG' -I/home/oier/.cache/node-gyp/20.13.1/include/node -I/home/oier/.cache/node-gyp/20.13.1/src -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include -I/home/oier/.cache/node-gyp/20.13.1/deps/zlib -I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -std=c99 -w -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d.raw -c
cmd_Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o := cc -o Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o Release/obj/gen/sqlite3/sqlite3.c '-DNODE_GYP_MODULE_NAME=sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_INT16_T=1' '-DHAVE_INT32_T=1' '-DHAVE_INT8_T=1' '-DHAVE_STDINT_H=1' '-DHAVE_UINT16_T=1' '-DHAVE_UINT32_T=1' '-DHAVE_UINT8_T=1' '-DHAVE_USLEEP=1' '-DSQLITE_DEFAULT_CACHE_SIZE=-16000' '-DSQLITE_DEFAULT_FOREIGN_KEYS=1' '-DSQLITE_DEFAULT_MEMSTATUS=0' '-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' '-DSQLITE_DQS=0' '-DSQLITE_ENABLE_COLUMN_METADATA' '-DSQLITE_ENABLE_DBSTAT_VTAB' '-DSQLITE_ENABLE_DESERIALIZE' '-DSQLITE_ENABLE_FTS3' '-DSQLITE_ENABLE_FTS3_PARENTHESIS' '-DSQLITE_ENABLE_FTS4' '-DSQLITE_ENABLE_FTS5' '-DSQLITE_ENABLE_GEOPOLY' '-DSQLITE_ENABLE_JSON1' '-DSQLITE_ENABLE_MATH_FUNCTIONS' '-DSQLITE_ENABLE_RTREE' '-DSQLITE_ENABLE_STAT4' '-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' '-DSQLITE_OMIT_DEPRECATED' '-DSQLITE_OMIT_PROGRESS_CALLBACK' '-DSQLITE_OMIT_SHARED_CACHE' '-DSQLITE_OMIT_TCL_VARIABLE' '-DSQLITE_SOUNDEX' '-DSQLITE_THREADSAFE=2' '-DSQLITE_TRACE_SIZE_LIMIT=32' '-DSQLITE_USE_URI=0' '-DNDEBUG' -I/home/oier/.cache/node-gyp/22.15.0/include/node -I/home/oier/.cache/node-gyp/22.15.0/src -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -std=c99 -w -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d.raw -c
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o: \
Release/obj/gen/sqlite3/sqlite3.c
Release/obj/gen/sqlite3/sqlite3.c:

View File

@@ -1,4 +1,4 @@
cmd_Release/obj.target/test_extension/deps/test_extension.o := cc -o Release/obj.target/test_extension/deps/test_extension.o ../deps/test_extension.c '-DNODE_GYP_MODULE_NAME=test_extension' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/home/oier/.cache/node-gyp/20.13.1/include/node -I/home/oier/.cache/node-gyp/20.13.1/src -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config -I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include -I/home/oier/.cache/node-gyp/20.13.1/deps/zlib -I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d.raw -c
cmd_Release/obj.target/test_extension/deps/test_extension.o := cc -o Release/obj.target/test_extension/deps/test_extension.o ../deps/test_extension.c '-DNODE_GYP_MODULE_NAME=test_extension' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/home/oier/.cache/node-gyp/22.15.0/include/node -I/home/oier/.cache/node-gyp/22.15.0/src -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include -I./Release/obj/gen/sqlite3 -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -O3 -fno-omit-frame-pointer -MMD -MF ./Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d.raw -c
Release/obj.target/test_extension/deps/test_extension.o: \
../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \
Release/obj/gen/sqlite3/sqlite3.h

View File

@@ -40,17 +40,18 @@ CFLAGS_C_Debug :=
CFLAGS_CC_Debug := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 \
-std=c++20
INCS_Debug := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
DEFS_Release := \
@@ -86,17 +87,18 @@ CFLAGS_C_Release :=
CFLAGS_CC_Release := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 \
-std=c++20
INCS_Release := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
OBJS := \

View File

@@ -2,6 +2,16 @@
{
"target_defaults": {
"cflags": [],
"configurations": {
"Debug": {
"v8_enable_v8_checks": 0,
"variables": {}
},
"Release": {
"v8_enable_v8_checks": 1,
"variables": {}
}
},
"default_configuration": "Release",
"defines": [],
"include_dirs": [],
@@ -9,6 +19,8 @@
},
"variables": {
"asan": 0,
"clang": 0,
"control_flow_guard": "false",
"coverage": "false",
"dcheck_always_on": 0,
"debug_nghttp2": "false",
@@ -20,22 +32,54 @@
"force_dynamic_crt": 0,
"gas_version": "2.35",
"host_arch": "x64",
"icu_data_in": "../../deps/icu-tmp/icudt75l.dat",
"icu_data_in": "../../deps/icu-tmp/icudt76l.dat",
"icu_endianness": "l",
"icu_gyp_path": "tools/icu/icu-generic.gyp",
"icu_path": "deps/icu-small",
"icu_small": "false",
"icu_ver_major": "75",
"is_debug": 0,
"icu_ver_major": "76",
"libdir": "lib",
"llvm_version": "0.0",
"napi_build_version": "9",
"napi_build_version": "10",
"node_builtin_shareable_builtins": [
"deps/cjs-module-lexer/lexer.js",
"deps/cjs-module-lexer/dist/lexer.js",
"deps/undici/undici.js"
"deps/undici/undici.js",
"deps/amaro/dist/index.js"
],
"node_byteorder": "little",
"node_cctest_sources": [
"src/node_snapshot_stub.cc",
"test/cctest/inspector/test_node_protocol.cc",
"test/cctest/node_test_fixture.cc",
"test/cctest/test_aliased_buffer.cc",
"test/cctest/test_base64.cc",
"test/cctest/test_base_object_ptr.cc",
"test/cctest/test_cppgc.cc",
"test/cctest/test_crypto_clienthello.cc",
"test/cctest/test_dataqueue.cc",
"test/cctest/test_environment.cc",
"test/cctest/test_inspector_socket.cc",
"test/cctest/test_inspector_socket_server.cc",
"test/cctest/test_json_utils.cc",
"test/cctest/test_linked_binding.cc",
"test/cctest/test_node_api.cc",
"test/cctest/test_node_crypto.cc",
"test/cctest/test_node_crypto_env.cc",
"test/cctest/test_node_postmortem_metadata.cc",
"test/cctest/test_node_task_runner.cc",
"test/cctest/test_path.cc",
"test/cctest/test_per_process.cc",
"test/cctest/test_platform.cc",
"test/cctest/test_quic_cid.cc",
"test/cctest/test_quic_error.cc",
"test/cctest/test_quic_tokens.cc",
"test/cctest/test_report.cc",
"test/cctest/test_sockaddr.cc",
"test/cctest/test_traced_value.cc",
"test/cctest/test_util.cc",
"test/cctest/node_test_fixture.h"
],
"node_debug_lib": "false",
"node_enable_d8": "false",
"node_enable_v8_vtunejit": "false",
@@ -83,7 +127,12 @@
"lib/internal/assert.js",
"lib/internal/assert/assertion_error.js",
"lib/internal/assert/calltracker.js",
"lib/internal/assert/myers_diff.js",
"lib/internal/assert/utils.js",
"lib/internal/async_context_frame.js",
"lib/internal/async_hooks.js",
"lib/internal/async_local_storage/async_context_frame.js",
"lib/internal/async_local_storage/async_hooks.js",
"lib/internal/blob.js",
"lib/internal/blocklist.js",
"lib/internal/bootstrap/node.js",
@@ -129,6 +178,7 @@
"lib/internal/crypto/webcrypto.js",
"lib/internal/crypto/webidl.js",
"lib/internal/crypto/x509.js",
"lib/internal/data_url.js",
"lib/internal/debugger/inspect.js",
"lib/internal/debugger/inspect_client.js",
"lib/internal/debugger/inspect_repl.js",
@@ -149,6 +199,7 @@
"lib/internal/fs/cp/cp-sync.js",
"lib/internal/fs/cp/cp.js",
"lib/internal/fs/dir.js",
"lib/internal/fs/glob.js",
"lib/internal/fs/promises.js",
"lib/internal/fs/read/context.js",
"lib/internal/fs/recursive_watch.js",
@@ -163,8 +214,11 @@
"lib/internal/http2/compat.js",
"lib/internal/http2/core.js",
"lib/internal/http2/util.js",
"lib/internal/idna.js",
"lib/internal/inspector/network.js",
"lib/internal/inspector/network_http.js",
"lib/internal/inspector/network_undici.js",
"lib/internal/inspector_async_hook.js",
"lib/internal/inspector_network_tracking.js",
"lib/internal/js_stream_socket.js",
"lib/internal/legacy/processbinding.js",
"lib/internal/linkedlist.js",
@@ -183,6 +237,7 @@
"lib/internal/main/worker_thread.js",
"lib/internal/mime.js",
"lib/internal/modules/cjs/loader.js",
"lib/internal/modules/customization_hooks.js",
"lib/internal/modules/esm/assert.js",
"lib/internal/modules/esm/create_dynamic_module.js",
"lib/internal/modules/esm/fetch_module.js",
@@ -194,7 +249,6 @@
"lib/internal/modules/esm/loader.js",
"lib/internal/modules/esm/module_job.js",
"lib/internal/modules/esm/module_map.js",
"lib/internal/modules/esm/package_config.js",
"lib/internal/modules/esm/resolve.js",
"lib/internal/modules/esm/shared_constants.js",
"lib/internal/modules/esm/translators.js",
@@ -203,6 +257,7 @@
"lib/internal/modules/helpers.js",
"lib/internal/modules/package_json_reader.js",
"lib/internal/modules/run_main.js",
"lib/internal/modules/typescript.js",
"lib/internal/navigator.js",
"lib/internal/net.js",
"lib/internal/options.js",
@@ -219,13 +274,11 @@
"lib/internal/perf/timerify.js",
"lib/internal/perf/usertiming.js",
"lib/internal/perf/utils.js",
"lib/internal/policy/manifest.js",
"lib/internal/policy/sri.js",
"lib/internal/priority_queue.js",
"lib/internal/process/execution.js",
"lib/internal/process/finalization.js",
"lib/internal/process/per_thread.js",
"lib/internal/process/permission.js",
"lib/internal/process/policy.js",
"lib/internal/process/pre_execution.js",
"lib/internal/process/promises.js",
"lib/internal/process/report.js",
@@ -235,6 +288,10 @@
"lib/internal/process/worker_thread_only.js",
"lib/internal/promise_hooks.js",
"lib/internal/querystring.js",
"lib/internal/quic/quic.js",
"lib/internal/quic/state.js",
"lib/internal/quic/stats.js",
"lib/internal/quic/symbols.js",
"lib/internal/readline/callbacks.js",
"lib/internal/readline/emitKeypressEvents.js",
"lib/internal/readline/interface.js",
@@ -249,12 +306,14 @@
"lib/internal/source_map/prepare_stack_trace.js",
"lib/internal/source_map/source_map.js",
"lib/internal/source_map/source_map_cache.js",
"lib/internal/source_map/source_map_cache_map.js",
"lib/internal/stream_base_commons.js",
"lib/internal/streams/add-abort-signal.js",
"lib/internal/streams/compose.js",
"lib/internal/streams/destroy.js",
"lib/internal/streams/duplex.js",
"lib/internal/streams/duplexify.js",
"lib/internal/streams/duplexpair.js",
"lib/internal/streams/end-of-stream.js",
"lib/internal/streams/from.js",
"lib/internal/streams/lazy_transform.js",
@@ -269,8 +328,10 @@
"lib/internal/streams/writable.js",
"lib/internal/test/binding.js",
"lib/internal/test/transfer.js",
"lib/internal/test_runner/assert.js",
"lib/internal/test_runner/coverage.js",
"lib/internal/test_runner/harness.js",
"lib/internal/test_runner/mock/loader.js",
"lib/internal/test_runner/mock/mock.js",
"lib/internal/test_runner/mock/mock_timers.js",
"lib/internal/test_runner/reporter/dot.js",
@@ -278,8 +339,10 @@
"lib/internal/test_runner/reporter/lcov.js",
"lib/internal/test_runner/reporter/spec.js",
"lib/internal/test_runner/reporter/tap.js",
"lib/internal/test_runner/reporter/utils.js",
"lib/internal/test_runner/reporter/v8-serializer.js",
"lib/internal/test_runner/runner.js",
"lib/internal/test_runner/snapshot.js",
"lib/internal/test_runner/test.js",
"lib/internal/test_runner/tests_stream.js",
"lib/internal/test_runner/utils.js",
@@ -293,10 +356,9 @@
"lib/internal/util/colors.js",
"lib/internal/util/comparisons.js",
"lib/internal/util/debuglog.js",
"lib/internal/util/embedding.js",
"lib/internal/util/diff.js",
"lib/internal/util/inspect.js",
"lib/internal/util/inspector.js",
"lib/internal/util/iterable_weak_map.js",
"lib/internal/util/parse_args/parse_args.js",
"lib/internal/util/parse_args/utils.js",
"lib/internal/util/types.js",
@@ -310,6 +372,7 @@
"lib/internal/watch_mode/files_watcher.js",
"lib/internal/watchdog.js",
"lib/internal/webidl.js",
"lib/internal/webstorage.js",
"lib/internal/webstreams/adapters.js",
"lib/internal/webstreams/compression.js",
"lib/internal/webstreams/encoding.js",
@@ -322,6 +385,7 @@
"lib/internal/worker.js",
"lib/internal/worker/io.js",
"lib/internal/worker/js_transferable.js",
"lib/internal/worker/messaging.js",
"lib/module.js",
"lib/net.js",
"lib/os.js",
@@ -336,6 +400,7 @@
"lib/readline/promises.js",
"lib/repl.js",
"lib/sea.js",
"lib/sqlite.js",
"lib/stream.js",
"lib/stream/consumers.js",
"lib/stream/promises.js",
@@ -358,12 +423,13 @@
"lib/worker_threads.js",
"lib/zlib.js"
],
"node_module_version": 115,
"node_module_version": 127,
"node_no_browser_globals": "false",
"node_prefix": "/",
"node_release_urlbase": "https://nodejs.org/download/release/",
"node_section_ordering_info": "",
"node_shared": "false",
"node_shared_ada": "false",
"node_shared_brotli": "false",
"node_shared_cares": "false",
"node_shared_http_parser": "false",
@@ -372,9 +438,15 @@
"node_shared_nghttp3": "false",
"node_shared_ngtcp2": "false",
"node_shared_openssl": "false",
"node_shared_simdjson": "false",
"node_shared_simdutf": "false",
"node_shared_sqlite": "false",
"node_shared_uvwasi": "false",
"node_shared_zlib": "false",
"node_shared_zstd": "false",
"node_tag": "",
"node_target_type": "executable",
"node_use_amaro": "true",
"node_use_bundled_v8": "true",
"node_use_node_code_cache": "true",
"node_use_node_snapshot": "true",
@@ -384,12 +456,14 @@
"node_without_node_options": "false",
"node_write_snapshot_as_array_literals": "false",
"openssl_is_fips": "false",
"openssl_quic": "true",
"openssl_quic": "false",
"ossfuzz": "false",
"shlib_suffix": "so.115",
"shlib_suffix": "so.127",
"single_executable_application": "true",
"suppress_all_error_on_warn": "false",
"target_arch": "x64",
"ubsan": 0,
"use_ccache_win": 0,
"use_prefix_to_find_headers": "false",
"v8_enable_31bit_smis_on_64bit_arch": 0,
"v8_enable_extensible_ro_snapshot": 0,
@@ -402,29 +476,29 @@
"v8_enable_maglev": 0,
"v8_enable_object_print": 1,
"v8_enable_pointer_compression": 0,
"v8_enable_sandbox": 0,
"v8_enable_shared_ro_heap": 1,
"v8_enable_short_builtin_calls": 1,
"v8_enable_v8_checks": 0,
"v8_enable_wasm_simd256_revec": 1,
"v8_enable_webassembly": 1,
"v8_no_strict_aliasing": 1,
"v8_optimized_debug": 1,
"v8_promise_internal_field_count": 1,
"v8_random_seed": 0,
"v8_trace_maps": 0,
"v8_use_siphash": 1,
"want_separate_host_toolset": 0,
"nodedir": "/home/oier/.cache/node-gyp/20.13.1",
"nodedir": "/home/oier/.cache/node-gyp/22.15.0",
"python": "/usr/bin/python3",
"standalone_static_library": 1,
"user_agent": "npm/10.5.2 node/v20.13.1 linux x64 workspaces/false",
"user_agent": "npm/10.9.2 node/v22.15.0 linux x64 workspaces/false",
"userconfig": "/home/oier/.npmrc",
"local_prefix": "/home/oier/projects/fosil-group/pole-book/server",
"prefix": "/home/oier/.nvm/versions/node/v20.13.1",
"npm_version": "10.5.2",
"prefix": "/home/oier/.nvm/versions/node/v22.15.0",
"npm_version": "10.9.2",
"cache": "/home/oier/.npm",
"node_gyp": "/home/oier/.nvm/versions/node/v20.13.1/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
"globalconfig": "/home/oier/.nvm/versions/node/v20.13.1/etc/npmrc",
"node_gyp": "/home/oier/.nvm/versions/node/v22.15.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
"globalconfig": "/home/oier/.nvm/versions/node/v22.15.0/etc/npmrc",
"init_module": "/home/oier/.npm-init.js",
"global_prefix": "/home/oier/.nvm/versions/node/v20.13.1"
"global_prefix": "/home/oier/.nvm/versions/node/v22.15.0"
}
}

View File

@@ -76,16 +76,17 @@ CFLAGS_C_Debug :=
CFLAGS_CC_Debug := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17
INCS_Debug := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
DEFS_Release := \
@@ -157,16 +158,17 @@ CFLAGS_C_Release :=
CFLAGS_CC_Release := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17
INCS_Release := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
OBJS := \

View File

@@ -40,16 +40,17 @@ CFLAGS_C_Debug :=
CFLAGS_CC_Debug := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17
INCS_Debug := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
DEFS_Release := \
@@ -85,16 +86,17 @@ CFLAGS_C_Release :=
CFLAGS_CC_Release := \
-fno-rtti \
-fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17
INCS_Release := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \
-I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3
OBJS := \

View File

@@ -1,10 +1,12 @@
# Can I cache this? [![Build Status](https://travis-ci.org/kornelski/http-cache-semantics.svg?branch=master)](https://travis-ci.org/kornelski/http-cache-semantics)
# Can I cache this?
`CachePolicy` tells when responses can be reused from a cache, taking into account [HTTP RFC 7234](http://httpwg.org/specs/rfc7234.html) rules for user agents and shared caches.
It also implements [RFC 5861](https://tools.ietf.org/html/rfc5861), implementing `stale-if-error` and `stale-while-revalidate`.
This library tells when responses can be reused from a cache, taking into account [HTTP RFC 7234/9111](http://httpwg.org/specs/rfc9111.html) rules for user agents and shared caches.
It also implements `stale-if-error` and `stale-while-revalidate` from [RFC 5861](https://tools.ietf.org/html/rfc5861).
It's aware of many tricky details such as the `Vary` header, proxy revalidation, and authenticated responses.
## Usage
## Basic Usage
`CachePolicy` is a metadata object that is meant to be stored in the cache, and it will keep track of cacheability of the response.
Cacheability of an HTTP response depends on how it was requested, so both `request` and `response` are required to create the policy.
@@ -20,22 +22,26 @@ if (!policy.storable()) {
// (this is pseudocode, roll your own cache (lru-cache package works))
letsPretendThisIsSomeCache.set(
request.url,
{ policy, response },
{ policy, body: response.body }, // you only need to store the response body. CachePolicy holds the headers.
policy.timeToLive()
);
```
```js
// And later, when you receive a new request:
const { policy, response } = letsPretendThisIsSomeCache.get(newRequest.url);
const { policy, body } = letsPretendThisIsSomeCache.get(newRequest.url);
// It's not enough that it exists in the cache, it has to match the new request, too:
if (policy && policy.satisfiesWithoutRevalidation(newRequest)) {
// OK, the previous response can be used to respond to the `newRequest`.
// Response headers have to be updated, e.g. to add Age and remove uncacheable headers.
response.headers = policy.responseHeaders();
return response;
return {
headers: policy.responseHeaders(),
body,
}
}
// Cache miss. See revalidationHeaders() and revalidatedPolicy() for advanced usage.
```
It may be surprising, but it's not enough for an HTTP response to be [fresh](#yo-fresh) to satisfy a request. It may need to match request headers specified in `Vary`. Even a matching fresh response may still not be usable if the new request restricted cacheability, etc.
@@ -84,7 +90,7 @@ Returns `true` if the response can be stored in a cache. If it's `false` then yo
### `satisfiesWithoutRevalidation(newRequest)`
This is the most important method. Use this method to check whether the cached response is still fresh in the context of the new request.
Use this method to check whether the cached response is still fresh in the context of the new request.
If it returns `true`, then the given `request` matches the original response this cache policy has been created with, and the response can be reused without contacting the server. Note that the old response can't be returned without being updated, see `responseHeaders()`.
@@ -95,19 +101,109 @@ If it returns `false`, then the response may not be matching at all (e.g. it's f
Returns updated, filtered set of response headers to return to clients receiving the cached response. This function is necessary, because proxies MUST always remove hop-by-hop headers (such as `TE` and `Connection`) and update response's `Age` to avoid doubling cache time.
```js
cachedResponse.headers = cachePolicy.responseHeaders(cachedResponse);
cachedResponse.headers = cachePolicy.responseHeaders();
```
### `timeToLive()`
Returns approximate time in _milliseconds_ until the response becomes stale (i.e. not fresh).
Suggests a time in _milliseconds_ for how long this cache entry may be useful. This is not freshness, so always check with `satisfiesWithoutRevalidation()`. This time may be longer than response's `max-age` to allow for `stale-if-error` and `stale-while-revalidate`.
After that time (when `timeToLive() <= 0`) the response might not be usable without revalidation. However, there are exceptions, e.g. a client can explicitly allow stale responses, so always check with `satisfiesWithoutRevalidation()`.
`stale-if-error` and `stale-while-revalidate` extend the time to live of the cache, that can still be used if stale.
After that time (when `timeToLive() <= 0`) the response may still be usable in certain cases, e.g. if client can explicitly allows stale responses.
### `toObject()`/`fromObject(json)`
Chances are you'll want to store the `CachePolicy` object along with the cached response. `obj = policy.toObject()` gives a plain JSON-serializable object. `policy = CachePolicy.fromObject(obj)` creates an instance from it.
You'll want to store the `CachePolicy` object along with the cached response. `obj = policy.toObject()` gives a plain JSON-serializable object. `policy = CachePolicy.fromObject(obj)` creates an instance from it.
## Complete Usage
### `evaluateRequest(newRequest)`
Returns an object telling what to do next — optional `revalidation`, and optional `response` from cache. Either one of these properties will be present. Both may be present at the same time.
```js
{
// If defined, you must send a request to the server.
revalidation: {
headers: {}, // HTTP headers to use when sending the revalidation response
// If true, you MUST wait for a response from the server before using the cache
// If false, this is stale-while-revalidate. The cache is stale, but you can use it while you update it asynchronously.
synchronous: bool,
},
// If defined, you can use this cached response.
response: {
headers: {}, // Updated cached HTTP headers you must use when responding to the client
},
}
```
### Example
```js
let cached = cacheStorage.get(incomingRequest.url);
// Cache miss - make a request to the origin and cache it
if (!cached) {
const newResponse = await makeRequest(incomingRequest);
const policy = new CachePolicy(incomingRequest, newResponse);
cacheStorage.set(
incomingRequest.url,
{ policy, body: newResponse.body },
policy.timeToLive()
);
return {
// use responseHeaders() to remove hop-by-hop headers that should not be passed through proxies
headers: policy.responseHeaders(),
body: newResponse.body,
}
}
// There's something cached, see if it's a hit
let { revalidation, response } = cached.policy.evaluateRequest(incomingRequest);
// Revalidation always goes first
if (revalidation) {
// It's very important to update the request headers to make a correct revalidation request
incomingRequest.headers = revalidation.headers; // Same as cached.policy.revalidationHeaders()
// The cache may be updated immediately or in the background,
// so use a Promise to optionally defer the update
const updatedResponsePromise = makeRequest(incomingRequest).then(() => {
// Refresh the old response with the new information, if applicable
const { policy, modified } = cached.policy.revalidatedPolicy(incomingRequest, newResponse);
const body = modified ? newResponse.body : cached.body;
// Update the cache with the newer response
if (policy.storable()) {
cacheStorage.set(
incomingRequest.url,
{ policy, body },
policy.timeToLive()
);
}
return {
headers: policy.responseHeaders(), // these are from the new revalidated policy
body,
}
});
if (revalidation.synchronous) {
// If synchronous, then you MUST get a reply from the server first
return await updatedResponsePromise;
}
// If not synchronous, it can fall thru to returning the cached response,
// while the request to the server is happening in the background.
}
return {
headers: response.headers, // Same as cached.policy.responseHeaders()
body: cached.body,
}
```
### Refreshing stale cache (revalidation)
@@ -119,7 +215,7 @@ The following methods help perform the update efficiently and correctly.
Returns updated, filtered set of request headers to send to the origin server to check if the cached response can be reused. These headers allow the origin server to return status 304 indicating the response is still fresh. All headers unrelated to caching are passed through as-is.
Use this method when updating cache from the origin server.
Use this method when updating cache from the origin server. Also available in `evaluateRequest(newRequest).revalidation.headers`.
```js
updateRequest.headers = cachePolicy.revalidationHeaders(updateRequest);
@@ -130,42 +226,9 @@ updateRequest.headers = cachePolicy.revalidationHeaders(updateRequest);
Use this method to update the cache after receiving a new response from the origin server. It returns an object with two keys:
- `policy` — A new `CachePolicy` with HTTP headers updated from `revalidationResponse`. You can always replace the old cached `CachePolicy` with the new one.
- `modified` — Boolean indicating whether the response body has changed.
- If `false`, then a valid 304 Not Modified response has been received, and you can reuse the old cached response body. This is also affected by `stale-if-error`.
- If `true`, you should use new response's body (if present), or make another request to the origin server without any conditional headers (i.e. don't use `revalidationHeaders()` this time) to get the new resource.
```js
// When serving requests from cache:
const { oldPolicy, oldResponse } = letsPretendThisIsSomeCache.get(
newRequest.url
);
if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
// Change the request to ask the origin server if the cached response can be used
newRequest.headers = oldPolicy.revalidationHeaders(newRequest);
// Send request to the origin server. The server may respond with status 304
const newResponse = await makeRequest(newRequest);
// Create updated policy and combined response from the old and new data
const { policy, modified } = oldPolicy.revalidatedPolicy(
newRequest,
newResponse
);
const response = modified ? newResponse : oldResponse;
// Update the cache with the newer/fresher response
letsPretendThisIsSomeCache.set(
newRequest.url,
{ policy, response },
policy.timeToLive()
);
// And proceed returning cached response as usual
response.headers = policy.responseHeaders();
return response;
}
```
- `modified` — Boolean indicating whether the response body has changed, and you should use the new response body sent by the server.
- If `true`, you should use the new response body, and you can replace the old cached response with the updated one.
- If `false`, then you should reuse the old cached response body. Either a valid 304 Not Modified response has been received, or an error happened and `stale-if-error` allows falling back to the cache.
# Yo, FRESH
@@ -174,6 +237,7 @@ if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
## Used by
- [ImageOptim API](https://imageoptim.com/api), [make-fetch-happen](https://github.com/zkat/make-fetch-happen), [cacheable-request](https://www.npmjs.com/package/cacheable-request) ([got](https://www.npmjs.com/package/got)), [npm/registry-fetch](https://github.com/npm/registry-fetch), [etc.](https://github.com/kornelski/http-cache-semantics/network/dependents)
- [Rust version of this library](https://lib.rs/crates/http-cache-semantics).
## Implemented
@@ -187,6 +251,7 @@ if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
- Filtering of hop-by-hop headers.
- Basic revalidation request
- `stale-if-error`
- `stale-while-revalidate`
## Unimplemented

View File

@@ -1,5 +1,22 @@
'use strict';
// rfc7231 6.1
/**
* @typedef {Object} HttpRequest
* @property {Record<string, string>} headers - Request headers
* @property {string} [method] - HTTP method
* @property {string} [url] - Request URL
*/
/**
* @typedef {Object} HttpResponse
* @property {Record<string, string>} headers - Response headers
* @property {number} [status] - HTTP status code
*/
/**
* Set of default cacheable status codes per RFC 7231 section 6.1.
* @type {Set<number>}
*/
const statusCodeCacheableByDefault = new Set([
200,
203,
@@ -15,7 +32,11 @@ const statusCodeCacheableByDefault = new Set([
501,
]);
// This implementation does not understand partial responses (206)
/**
* Set of HTTP status codes that the cache implementation understands.
* Note: This implementation does not understand partial responses (206).
* @type {Set<number>}
*/
const understoodStatuses = new Set([
200,
203,
@@ -33,13 +54,21 @@ const understoodStatuses = new Set([
501,
]);
/**
* Set of HTTP error status codes.
* @type {Set<number>}
*/
const errorStatusCodes = new Set([
500,
502,
503,
503,
504,
]);
/**
* Object representing hop-by-hop headers that should be removed.
* @type {Record<string, boolean>}
*/
const hopByHopHeaders = {
date: true, // included, because we add Age update Date
connection: true,
@@ -52,6 +81,10 @@ const hopByHopHeaders = {
upgrade: true,
};
/**
* Headers that are excluded from revalidation update.
* @type {Record<string, boolean>}
*/
const excludedFromRevalidationUpdate = {
// Since the old body is reused, it doesn't make sense to change properties of the body
'content-length': true,
@@ -60,21 +93,37 @@ const excludedFromRevalidationUpdate = {
'content-range': true,
};
/**
* Converts a string to a number or returns zero if the conversion fails.
* @param {string} s - The string to convert.
* @returns {number} The parsed number or 0.
*/
function toNumberOrZero(s) {
const n = parseInt(s, 10);
return isFinite(n) ? n : 0;
}
// RFC 5861
/**
* Determines if the given response is an error response.
* Implements RFC 5861 behavior.
* @param {HttpResponse|undefined} response - The HTTP response object.
* @returns {boolean} true if the response is an error or undefined, false otherwise.
*/
function isErrorResponse(response) {
// consider undefined response as faulty
if(!response) {
return true
if (!response) {
return true;
}
return errorStatusCodes.has(response.status);
}
/**
* Parses a Cache-Control header string into an object.
* @param {string} [header] - The Cache-Control header value.
* @returns {Record<string, string|boolean>} An object representing Cache-Control directives.
*/
function parseCacheControl(header) {
/** @type {Record<string, string|boolean>} */
const cc = {};
if (!header) return cc;
@@ -89,6 +138,11 @@ function parseCacheControl(header) {
return cc;
}
/**
* Formats a Cache-Control directives object into a header string.
* @param {Record<string, string|boolean>} cc - The Cache-Control directives.
* @returns {string|undefined} A formatted Cache-Control header string or undefined if empty.
*/
function formatCacheControl(cc) {
let parts = [];
for (const k in cc) {
@@ -102,6 +156,17 @@ function formatCacheControl(cc) {
}
module.exports = class CachePolicy {
/**
* Creates a new CachePolicy instance.
* @param {HttpRequest} req - Incoming client request.
* @param {HttpResponse} res - Received server response.
* @param {Object} [options={}] - Configuration options.
* @param {boolean} [options.shared=true] - Is the cache shared (a public proxy)? `false` for personal browser caches.
* @param {number} [options.cacheHeuristic=0.1] - Fallback heuristic (age fraction) for cache duration.
* @param {number} [options.immutableMinTimeToLive=86400000] - Minimum TTL for immutable responses in milliseconds.
* @param {boolean} [options.ignoreCargoCult=false] - Detect nonsense cache headers, and override them.
* @param {any} [options._fromObject] - Internal parameter for deserialization. Do not use.
*/
constructor(
req,
res,
@@ -123,29 +188,44 @@ module.exports = class CachePolicy {
}
this._assertRequestHasHeaders(req);
/** @type {number} Timestamp when the response was received */
this._responseTime = this.now();
/** @type {boolean} Indicates if the cache is shared */
this._isShared = shared !== false;
/** @type {boolean} Indicates if legacy cargo cult directives should be ignored */
this._ignoreCargoCult = !!ignoreCargoCult;
/** @type {number} Heuristic cache fraction */
this._cacheHeuristic =
undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE
/** @type {number} Minimum TTL for immutable responses in ms */
this._immutableMinTtl =
undefined !== immutableMinTimeToLive
? immutableMinTimeToLive
: 24 * 3600 * 1000;
/** @type {number} HTTP status code */
this._status = 'status' in res ? res.status : 200;
/** @type {Record<string, string>} Response headers */
this._resHeaders = res.headers;
/** @type {Record<string, string|boolean>} Parsed Cache-Control directives from response */
this._rescc = parseCacheControl(res.headers['cache-control']);
/** @type {string} HTTP method (e.g., GET, POST) */
this._method = 'method' in req ? req.method : 'GET';
/** @type {string} Request URL */
this._url = req.url;
/** @type {string} Host header from the request */
this._host = req.headers.host;
/** @type {boolean} Whether the request does not include an Authorization header */
this._noAuthorization = !req.headers.authorization;
/** @type {Record<string, string>|null} Request headers used for Vary matching */
this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used
/** @type {Record<string, string|boolean>} Parsed Cache-Control directives from request */
this._reqcc = parseCacheControl(req.headers['cache-control']);
// Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,
// so there's no point stricly adhering to the blindly copy&pasted directives.
if (
ignoreCargoCult &&
this._ignoreCargoCult &&
'pre-check' in this._rescc &&
'post-check' in this._rescc
) {
@@ -171,10 +251,18 @@ module.exports = class CachePolicy {
}
}
/**
* You can monkey-patch it for testing.
* @returns {number} Current time in milliseconds.
*/
now() {
return Date.now();
}
/**
* Determines if the response is storable in a cache.
* @returns {boolean} `false` if can never be cached.
*/
storable() {
// The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.
return !!(
@@ -208,62 +296,160 @@ module.exports = class CachePolicy {
);
}
/**
* @returns {boolean} true if expiration is explicitly defined.
*/
_hasExplicitExpiration() {
// 4.2.1 Calculating Freshness Lifetime
return (
return !!(
(this._isShared && this._rescc['s-maxage']) ||
this._rescc['max-age'] ||
this._resHeaders.expires
);
}
/**
* @param {HttpRequest} req - a request
* @throws {Error} if the headers are missing.
*/
_assertRequestHasHeaders(req) {
if (!req || !req.headers) {
throw Error('Request headers missing');
}
}
/**
* Checks if the request matches the cache and can be satisfied from the cache immediately,
* without having to make a request to the server.
*
* This doesn't support `stale-while-revalidate`. See `evaluateRequest()` for a more complete solution.
*
* @param {HttpRequest} req - The new incoming HTTP request.
* @returns {boolean} `true`` if the cached response used to construct this cache policy satisfies the request without revalidation.
*/
satisfiesWithoutRevalidation(req) {
const result = this.evaluateRequest(req);
return !result.revalidation;
}
/**
* @param {{headers: Record<string, string>, synchronous: boolean}|undefined} revalidation - Revalidation information, if any.
* @returns {{response: {headers: Record<string, string>}, revalidation: {headers: Record<string, string>, synchronous: boolean}|undefined}} An object with a cached response headers and revalidation info.
*/
_evaluateRequestHitResult(revalidation) {
return {
response: {
headers: this.responseHeaders(),
},
revalidation,
};
}
/**
* @param {HttpRequest} request - new incoming
* @param {boolean} synchronous - whether revalidation must be synchronous (not s-w-r).
* @returns {{headers: Record<string, string>, synchronous: boolean}} An object with revalidation headers and a synchronous flag.
*/
_evaluateRequestRevalidation(request, synchronous) {
return {
synchronous,
headers: this.revalidationHeaders(request),
};
}
/**
* @param {HttpRequest} request - new incoming
* @returns {{response: undefined, revalidation: {headers: Record<string, string>, synchronous: boolean}}} An object indicating no cached response and revalidation details.
*/
_evaluateRequestMissResult(request) {
return {
response: undefined,
revalidation: this._evaluateRequestRevalidation(request, true),
};
}
/**
* Checks if the given request matches this cache entry, and how the cache can be used to satisfy it. Returns an object with:
*
* ```
* {
* // If defined, you must send a request to the server.
* revalidation: {
* headers: {}, // HTTP headers to use when sending the revalidation response
* // If true, you MUST wait for a response from the server before using the cache
* // If false, this is stale-while-revalidate. The cache is stale, but you can use it while you update it asynchronously.
* synchronous: bool,
* },
* // If defined, you can use this cached response.
* response: {
* headers: {}, // Updated cached HTTP headers you must use when responding to the client
* },
* }
* ```
* @param {HttpRequest} req - new incoming HTTP request
* @returns {{response: {headers: Record<string, string>}|undefined, revalidation: {headers: Record<string, string>, synchronous: boolean}|undefined}} An object containing keys:
* - revalidation: { headers: Record<string, string>, synchronous: boolean } Set if you should send this to the origin server
* - response: { headers: Record<string, string> } Set if you can respond to the client with these cached headers
*/
evaluateRequest(req) {
this._assertRequestHasHeaders(req);
// In all circumstances, a cache MUST NOT ignore the must-revalidate directive
if (this._rescc['must-revalidate']) {
return this._evaluateRequestMissResult(req);
}
if (!this._requestMatches(req, false)) {
return this._evaluateRequestMissResult(req);
}
// When presented with a request, a cache MUST NOT reuse a stored response, unless:
// the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,
// unless the stored response is successfully validated (Section 4.3), and
const requestCC = parseCacheControl(req.headers['cache-control']);
if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {
return false;
return this._evaluateRequestMissResult(req);
}
if (requestCC['max-age'] && this.age() > requestCC['max-age']) {
return false;
if (requestCC['max-age'] && this.age() > toNumberOrZero(requestCC['max-age'])) {
return this._evaluateRequestMissResult(req);
}
if (
requestCC['min-fresh'] &&
this.timeToLive() < 1000 * requestCC['min-fresh']
) {
return false;
if (requestCC['min-fresh'] && this.maxAge() - this.age() < toNumberOrZero(requestCC['min-fresh'])) {
return this._evaluateRequestMissResult(req);
}
// the stored response is either:
// fresh, or allowed to be served stale
if (this.stale()) {
const allowsStale =
requestCC['max-stale'] &&
!this._rescc['must-revalidate'] &&
(true === requestCC['max-stale'] ||
requestCC['max-stale'] > this.age() - this.maxAge());
if (!allowsStale) {
return false;
// If a value is present, then the client is willing to accept a response that has
// exceeded its freshness lifetime by no more than the specified number of seconds
const allowsStaleWithoutRevalidation = 'max-stale' in requestCC &&
(true === requestCC['max-stale'] || requestCC['max-stale'] > this.age() - this.maxAge());
if (allowsStaleWithoutRevalidation) {
return this._evaluateRequestHitResult(undefined);
}
if (this.useStaleWhileRevalidate()) {
return this._evaluateRequestHitResult(this._evaluateRequestRevalidation(req, false));
}
return this._evaluateRequestMissResult(req);
}
return this._requestMatches(req, false);
return this._evaluateRequestHitResult(undefined);
}
/**
* @param {HttpRequest} req - check if this is for the same cache entry
* @param {boolean} allowHeadMethod - allow a HEAD method to match.
* @returns {boolean} `true` if the request matches.
*/
_requestMatches(req, allowHeadMethod) {
// The presented effective request URI and that of the stored response match, and
return (
return !!(
(!this._url || this._url === req.url) &&
this._host === req.headers.host &&
// the request method associated with the stored response allows it to be used for the presented request, and
@@ -275,15 +461,24 @@ module.exports = class CachePolicy {
);
}
/**
* Determines whether storing authenticated responses is allowed.
* @returns {boolean} `true` if allowed.
*/
_allowsStoringAuthenticated() {
// following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
return (
// following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
return !!(
this._rescc['must-revalidate'] ||
this._rescc.public ||
this._rescc['s-maxage']
);
}
/**
* Checks whether the Vary header in the response matches the new request.
* @param {HttpRequest} req - incoming HTTP request
* @returns {boolean} `true` if the vary headers match.
*/
_varyMatches(req) {
if (!this._resHeaders.vary) {
return true;
@@ -304,7 +499,13 @@ module.exports = class CachePolicy {
return true;
}
/**
* Creates a copy of the given headers without any hop-by-hop headers.
* @param {Record<string, string>} inHeaders - old headers from the cached response
* @returns {Record<string, string>} A new headers object without hop-by-hop headers.
*/
_copyWithoutHopByHopHeaders(inHeaders) {
/** @type {Record<string, string>} */
const headers = {};
for (const name in inHeaders) {
if (hopByHopHeaders[name]) continue;
@@ -330,6 +531,11 @@ module.exports = class CachePolicy {
return headers;
}
/**
* Returns the response headers adjusted for serving the cached response.
* Removes hop-by-hop headers and updates the Age and Date headers.
* @returns {Record<string, string>} The adjusted response headers.
*/
responseHeaders() {
const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);
const age = this.age();
@@ -351,8 +557,8 @@ module.exports = class CachePolicy {
}
/**
* Value of the Date response header or current time if Date was invalid
* @return timestamp
* Returns the Date header value from the response or the current time if invalid.
* @returns {number} Timestamp (in milliseconds) representing the Date header or response time.
*/
date() {
const serverDate = Date.parse(this._resHeaders.date);
@@ -365,8 +571,7 @@ module.exports = class CachePolicy {
/**
* Value of the Age header, in seconds, updated for the current time.
* May be fractional.
*
* @return Number
* @returns {number} The age in seconds.
*/
age() {
let age = this._ageValue();
@@ -375,16 +580,21 @@ module.exports = class CachePolicy {
return age + residentTime;
}
/**
* @returns {number} The Age header value as a number.
*/
_ageValue() {
return toNumberOrZero(this._resHeaders.age);
}
/**
* Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.
* Possibly outdated value of applicable max-age (or heuristic equivalent) in seconds.
* This counts since response's `Date`.
*
* For an up-to-date value, see `timeToLive()`.
*
* @return Number
* Returns the maximum age (freshness lifetime) of the response in seconds.
* @returns {number} The max-age value in seconds.
*/
maxAge() {
if (!this.storable() || this._rescc['no-cache']) {
@@ -446,29 +656,57 @@ module.exports = class CachePolicy {
return defaultMinTtl;
}
/**
* Remaining time this cache entry may be useful for, in *milliseconds*.
* You can use this as an expiration time for your cache storage.
*
* Prefer this method over `maxAge()`, because it includes other factors like `age` and `stale-while-revalidate`.
* @returns {number} Time-to-live in milliseconds.
*/
timeToLive() {
const age = this.maxAge() - this.age();
const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);
const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);
return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;
return Math.round(Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000);
}
/**
* If true, this cache entry is past its expiration date.
* Note that stale cache may be useful sometimes, see `evaluateRequest()`.
* @returns {boolean} `false` doesn't mean it's fresh nor usable
*/
stale() {
return this.maxAge() <= this.age();
}
/**
* @returns {boolean} `true` if `stale-if-error` condition allows use of a stale response.
*/
_useStaleIfError() {
return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();
}
/** See `evaluateRequest()` for a more complete solution
* @returns {boolean} `true` if `stale-while-revalidate` is currently allowed.
*/
useStaleWhileRevalidate() {
return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();
const swr = toNumberOrZero(this._rescc['stale-while-revalidate']);
return swr > 0 && this.maxAge() + swr > this.age();
}
/**
* Creates a `CachePolicy` instance from a serialized object.
* @param {Object} obj - The serialized object.
* @returns {CachePolicy} A new CachePolicy instance.
*/
static fromObject(obj) {
return new this(undefined, undefined, { _fromObject: obj });
}
/**
* @param {any} obj - The serialized object.
* @throws {Error} If already initialized or if the object is invalid.
*/
_fromObject(obj) {
if (this._responseTime) throw Error('Reinitialized');
if (!obj || obj.v !== 1) throw Error('Invalid serialization');
@@ -478,6 +716,7 @@ module.exports = class CachePolicy {
this._cacheHeuristic = obj.ch;
this._immutableMinTtl =
obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;
this._ignoreCargoCult = !!obj.icc;
this._status = obj.st;
this._resHeaders = obj.resh;
this._rescc = obj.rescc;
@@ -489,6 +728,10 @@ module.exports = class CachePolicy {
this._reqcc = obj.reqcc;
}
/**
* Serializes the `CachePolicy` instance into a JSON-serializable object.
* @returns {Object} The serialized object.
*/
toObject() {
return {
v: 1,
@@ -496,6 +739,7 @@ module.exports = class CachePolicy {
sh: this._isShared,
ch: this._cacheHeuristic,
imm: this._immutableMinTtl,
icc: this._ignoreCargoCult,
st: this._status,
resh: this._resHeaders,
rescc: this._rescc,
@@ -514,6 +758,8 @@ module.exports = class CachePolicy {
*
* Hop by hop headers are always stripped.
* Revalidation headers may be added or removed, depending on request.
* @param {HttpRequest} incomingReq - The incoming HTTP request.
* @returns {Record<string, string>} The headers for the revalidation request.
*/
revalidationHeaders(incomingReq) {
this._assertRequestHasHeaders(incomingReq);
@@ -578,17 +824,22 @@ module.exports = class CachePolicy {
* Returns {policy, modified} where modified is a boolean indicating
* whether the response body has been modified, and old cached body can't be used.
*
* @return {Object} {policy: CachePolicy, modified: Boolean}
* @param {HttpRequest} request - The latest HTTP request asking for the cached entry.
* @param {HttpResponse} response - The latest revalidation HTTP response from the origin server.
* @returns {{policy: CachePolicy, modified: boolean, matches: boolean}} The updated policy and modification status.
* @throws {Error} If the response headers are missing.
*/
revalidatedPolicy(request, response) {
this._assertRequestHasHeaders(request);
if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful
if (this._useStaleIfError() && isErrorResponse(response)) {
return {
modified: false,
matches: false,
policy: this,
policy: this,
modified: false,
matches: true,
};
}
if (!response || !response.headers) {
throw Error('Response headers missing');
}
@@ -635,9 +886,16 @@ module.exports = class CachePolicy {
}
}
const optionsCopy = {
shared: this._isShared,
cacheHeuristic: this._cacheHeuristic,
immutableMinTimeToLive: this._immutableMinTtl,
ignoreCargoCult: this._ignoreCargoCult,
};
if (!matches) {
return {
policy: new this.constructor(request, response),
policy: new this.constructor(request, response, optionsCopy),
// Client receiving 304 without body, even if it's invalid/mismatched has no option
// but to reuse a cached body. We don't have a good way to tell clients to do
// error recovery in such case.
@@ -662,11 +920,7 @@ module.exports = class CachePolicy {
headers,
});
return {
policy: new this.constructor(request, newResponse, {
shared: this._isShared,
cacheHeuristic: this._cacheHeuristic,
immutableMinTimeToLive: this._immutableMinTtl,
}),
policy: new this.constructor(request, newResponse, optionsCopy),
modified: false,
matches: true,
};

View File

@@ -1,18 +1,22 @@
{
"name": "http-cache-semantics",
"version": "4.1.1",
"version": "4.2.0",
"description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
"repository": "https://github.com/kornelski/http-cache-semantics.git",
"repository": {
"type": "git",
"url": "git+https://github.com/kornelski/http-cache-semantics.git"
},
"main": "index.js",
"types": "index.js",
"scripts": {
"test": "mocha"
},
"files": [
"index.js"
],
"author": "Kornel Lesiński <kornel@geekhood.net> (https://kornel.ski/)",
"author": "Kornel Lesiński <npms2@geekhood.net> (https://kornel.ski/)",
"license": "BSD-2-Clause",
"devDependencies": {
"mocha": "^10.0"
"mocha": "^11.0"
}
}

1942
server/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,8 @@
"info": {
"singularName": "element",
"pluralName": "elements",
"displayName": "Element"
"displayName": "Element",
"description": ""
},
"options": {
"draftAndPublish": true
@@ -20,14 +21,21 @@
"type": "text"
},
"Image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images",
"files",
"videos",
"audios"
],
"type": "media",
"multiple": false
]
},
"Url": {
"type": "string",
"unique": true,
"required": true,
"regex": "[a-z0-9]"
}
}
}

View File

@@ -376,6 +376,7 @@ export interface AdminUser extends Struct.CollectionTypeSchema {
export interface ApiElementElement extends Struct.CollectionTypeSchema {
collectionName: 'elements';
info: {
description: '';
displayName: 'Element';
pluralName: 'elements';
singularName: 'element';
@@ -401,6 +402,9 @@ export interface ApiElementElement extends Struct.CollectionTypeSchema {
updatedAt: Schema.Attribute.DateTime;
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
Schema.Attribute.Private;
Url: Schema.Attribute.String &
Schema.Attribute.Required &
Schema.Attribute.Unique;
};
}