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", "latest": "5.13.0",
"lastUpdateCheck": 1746738094002 "lastUpdateCheck": 1747087607661
} }

Binary file not shown.

View File

@@ -4,7 +4,8 @@
"info": { "info": {
"singularName": "element", "singularName": "element",
"pluralName": "elements", "pluralName": "elements",
"displayName": "Element" "displayName": "Element",
"description": ""
}, },
"options": { "options": {
"draftAndPublish": true "draftAndPublish": true
@@ -20,14 +21,21 @@
"type": "text" "type": "text"
}, },
"Image": { "Image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [ "allowedTypes": [
"images", "images",
"files", "files",
"videos", "videos",
"audios" "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", "configHash": "96f1dd8e",
"lockfileHash": "19c9bd2a", "lockfileHash": "56db8d13",
"browserHash": "1eb81ee0", "browserHash": "9976a4e5",
"optimized": { "optimized": {
"react": { "react": {
"src": "../../../react/index.js", "src": "../../../react/index.js",
"file": "react.js", "file": "react.js",
"fileHash": "7dfe0e9c", "fileHash": "c80427c5",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-runtime": { "react/jsx-runtime": {
"src": "../../../react/jsx-runtime.js", "src": "../../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js", "file": "react_jsx-runtime.js",
"fileHash": "cf60935c", "fileHash": "d265d8f2",
"needsInterop": true "needsInterop": true
}, },
"react-dom/client": { "react-dom/client": {
"src": "../../../react-dom/client.js", "src": "../../../react-dom/client.js",
"file": "react-dom_client.js", "file": "react-dom_client.js",
"fileHash": "2ed94d0e", "fileHash": "c93adb79",
"needsInterop": true "needsInterop": true
}, },
"styled-components": { "styled-components": {
"src": "../../../styled-components/dist/styled-components.browser.esm.js", "src": "../../../styled-components/dist/styled-components.browser.esm.js",
"file": "styled-components.js", "file": "styled-components.js",
"fileHash": "07461124", "fileHash": "c201fd22",
"needsInterop": false "needsInterop": false
}, },
"react-router-dom": { "react-router-dom": {
"src": "../../../react-router-dom/dist/index.js", "src": "../../../react-router-dom/dist/index.js",
"file": "react-router-dom.js", "file": "react-router-dom.js",
"fileHash": "eda128bf", "fileHash": "e8bbcb5b",
"needsInterop": false "needsInterop": false
}, },
"react/jsx-dev-runtime": { "react/jsx-dev-runtime": {
"src": "../../../react/jsx-dev-runtime.js", "src": "../../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js", "file": "react_jsx-dev-runtime.js",
"fileHash": "7ac906bf", "fileHash": "bab1b549",
"needsInterop": true "needsInterop": true
}, },
"@strapi/plugin-cloud/strapi-admin": { "@strapi/plugin-cloud/strapi-admin": {
"src": "../../../@strapi/plugin-cloud/dist/admin/index.mjs", "src": "../../../@strapi/plugin-cloud/dist/admin/index.mjs",
"file": "@strapi_plugin-cloud_strapi-admin.js", "file": "@strapi_plugin-cloud_strapi-admin.js",
"fileHash": "b495c7e7", "fileHash": "ec6d2399",
"needsInterop": false "needsInterop": false
}, },
"@strapi/plugin-users-permissions/strapi-admin": { "@strapi/plugin-users-permissions/strapi-admin": {
"src": "../../../@strapi/plugin-users-permissions/dist/admin/index.mjs", "src": "../../../@strapi/plugin-users-permissions/dist/admin/index.mjs",
"file": "@strapi_plugin-users-permissions_strapi-admin.js", "file": "@strapi_plugin-users-permissions_strapi-admin.js",
"fileHash": "1f2b8575", "fileHash": "95b9b6ae",
"needsInterop": false "needsInterop": false
}, },
"@strapi/strapi/admin": { "@strapi/strapi/admin": {
"src": "../../../@strapi/strapi/dist/admin.mjs", "src": "../../../@strapi/strapi/dist/admin.mjs",
"file": "@strapi_strapi_admin.js", "file": "@strapi_strapi_admin.js",
"fileHash": "df6108d3", "fileHash": "6a08dac2",
"needsInterop": false "needsInterop": false
} }
}, },

View File

@@ -353,8 +353,8 @@ ifeq ($(strip $(foreach prefix,$(NO_LOAD),\
endif endif
quiet_cmd_regen_makefile = ACTION Regenerating $@ 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 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/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 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) $(call do_cmd,regen_makefile)
# "all" is a concatenation of the "all" targets from all the included # "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: \ Release/obj.target/better_sqlite3/src/better_sqlite3.o: \
../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \ ../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \
Release/obj/gen/sqlite3/sqlite3.h \ Release/obj/gen/sqlite3/sqlite3.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/20.13.1/include/node/v8.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/cppgc/common.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/cppgc/common.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-array-buffer.h \ /home/oier/.cache/node-gyp/22.15.0/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/22.15.0/include/node/v8-local-handle.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-internal.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-handle-base.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-version.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-internal.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-object.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-object.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-maybe.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-maybe.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-persistent-handle.h \ /home/oier/.cache/node-gyp/22.15.0/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/22.15.0/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/22.15.0/include/node/v8-primitive.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-data.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-data.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-value.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-traced-handle.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-traced-handle.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-container.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-container.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-context.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-context.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-snapshot.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-snapshot.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-date.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-isolate.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-debug.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-callbacks.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-script.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-promise.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-callbacks.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-debug.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-promise.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-script.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-message.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-memory-span.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-exception.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-message.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-extension.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-heap.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-external.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-function-callback.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function-callback.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-statistics.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-template.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-unwinder.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-memory-span.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-state-scope.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-initialization.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-date.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-isolate.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-exception.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-heap.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-extension.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-external.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-statistics.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-function.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-unwinder.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-template.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-state-scope.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-initialization.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-platform.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-platform.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-json.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-source-location.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-locker.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-json.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask-queue.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-locker.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive-object.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask-queue.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-proxy.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive-object.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-regexp.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-proxy.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-typed-array.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-regexp.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value-serializer.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-typed-array.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-wasm.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-value-serializer.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_version.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-version.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/v8-wasm.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/node_version.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api_types.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/node_api.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api_types.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_object_wrap.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api_types.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node_buffer.h \ /home/oier/.cache/node-gyp/22.15.0/include/node/node_api_types.h \
/home/oier/.cache/node-gyp/20.13.1/include/node/node.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.cpp:
../src/better_sqlite3.hpp: ../src/better_sqlite3.hpp:
Release/obj/gen/sqlite3/sqlite3.h: Release/obj/gen/sqlite3/sqlite3.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/20.13.1/include/node/v8.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/cppgc/common.h: /home/oier/.cache/node-gyp/22.15.0/include/node/cppgc/common.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-array-buffer.h: /home/oier/.cache/node-gyp/22.15.0/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/22.15.0/include/node/v8-local-handle.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-internal.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-handle-base.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-version.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-internal.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8config.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8config.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-object.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-object.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-maybe.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-maybe.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-persistent-handle.h: /home/oier/.cache/node-gyp/22.15.0/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/22.15.0/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/22.15.0/include/node/v8-primitive.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-data.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-data.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-value.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-traced-handle.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-traced-handle.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-container.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-container.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-context.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-context.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-snapshot.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-snapshot.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-date.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-isolate.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-debug.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-callbacks.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-script.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-promise.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-callbacks.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-debug.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-promise.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-script.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-message.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-memory-span.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-exception.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-message.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-extension.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-heap.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-external.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-function-callback.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-function-callback.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-statistics.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-template.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-unwinder.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-memory-span.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-embedder-state-scope.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-initialization.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-date.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-isolate.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-exception.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-heap.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-extension.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-external.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-statistics.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-function.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-unwinder.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-template.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-embedder-state-scope.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-initialization.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-platform.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-platform.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-json.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-source-location.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-locker.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-json.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-microtask-queue.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-locker.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-primitive-object.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-microtask-queue.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-proxy.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-primitive-object.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-regexp.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-proxy.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-typed-array.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-regexp.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-value-serializer.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-typed-array.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/v8-wasm.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-value-serializer.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_version.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-version.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api.h: /home/oier/.cache/node-gyp/22.15.0/include/node/v8-wasm.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api.h: /home/oier/.cache/node-gyp/22.15.0/include/node/node_version.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/js_native_api_types.h: /home/oier/.cache/node-gyp/22.15.0/include/node/node_api.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_api_types.h: /home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_object_wrap.h: /home/oier/.cache/node-gyp/22.15.0/include/node/js_native_api_types.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node_buffer.h: /home/oier/.cache/node-gyp/22.15.0/include/node/node_api_types.h:
/home/oier/.cache/node-gyp/20.13.1/include/node/node.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.target/sqlite3/gen/sqlite3/sqlite3.o: \
Release/obj/gen/sqlite3/sqlite3.c Release/obj/gen/sqlite3/sqlite3.c
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: \ Release/obj.target/test_extension/deps/test_extension.o: \
../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \ ../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \
Release/obj/gen/sqlite3/sqlite3.h Release/obj/gen/sqlite3/sqlite3.h

View File

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

View File

@@ -2,6 +2,16 @@
{ {
"target_defaults": { "target_defaults": {
"cflags": [], "cflags": [],
"configurations": {
"Debug": {
"v8_enable_v8_checks": 0,
"variables": {}
},
"Release": {
"v8_enable_v8_checks": 1,
"variables": {}
}
},
"default_configuration": "Release", "default_configuration": "Release",
"defines": [], "defines": [],
"include_dirs": [], "include_dirs": [],
@@ -9,6 +19,8 @@
}, },
"variables": { "variables": {
"asan": 0, "asan": 0,
"clang": 0,
"control_flow_guard": "false",
"coverage": "false", "coverage": "false",
"dcheck_always_on": 0, "dcheck_always_on": 0,
"debug_nghttp2": "false", "debug_nghttp2": "false",
@@ -20,22 +32,54 @@
"force_dynamic_crt": 0, "force_dynamic_crt": 0,
"gas_version": "2.35", "gas_version": "2.35",
"host_arch": "x64", "host_arch": "x64",
"icu_data_in": "../../deps/icu-tmp/icudt75l.dat", "icu_data_in": "../../deps/icu-tmp/icudt76l.dat",
"icu_endianness": "l", "icu_endianness": "l",
"icu_gyp_path": "tools/icu/icu-generic.gyp", "icu_gyp_path": "tools/icu/icu-generic.gyp",
"icu_path": "deps/icu-small", "icu_path": "deps/icu-small",
"icu_small": "false", "icu_small": "false",
"icu_ver_major": "75", "icu_ver_major": "76",
"is_debug": 0,
"libdir": "lib", "libdir": "lib",
"llvm_version": "0.0", "llvm_version": "0.0",
"napi_build_version": "9", "napi_build_version": "10",
"node_builtin_shareable_builtins": [ "node_builtin_shareable_builtins": [
"deps/cjs-module-lexer/lexer.js", "deps/cjs-module-lexer/lexer.js",
"deps/cjs-module-lexer/dist/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_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_debug_lib": "false",
"node_enable_d8": "false", "node_enable_d8": "false",
"node_enable_v8_vtunejit": "false", "node_enable_v8_vtunejit": "false",
@@ -83,7 +127,12 @@
"lib/internal/assert.js", "lib/internal/assert.js",
"lib/internal/assert/assertion_error.js", "lib/internal/assert/assertion_error.js",
"lib/internal/assert/calltracker.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_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/blob.js",
"lib/internal/blocklist.js", "lib/internal/blocklist.js",
"lib/internal/bootstrap/node.js", "lib/internal/bootstrap/node.js",
@@ -129,6 +178,7 @@
"lib/internal/crypto/webcrypto.js", "lib/internal/crypto/webcrypto.js",
"lib/internal/crypto/webidl.js", "lib/internal/crypto/webidl.js",
"lib/internal/crypto/x509.js", "lib/internal/crypto/x509.js",
"lib/internal/data_url.js",
"lib/internal/debugger/inspect.js", "lib/internal/debugger/inspect.js",
"lib/internal/debugger/inspect_client.js", "lib/internal/debugger/inspect_client.js",
"lib/internal/debugger/inspect_repl.js", "lib/internal/debugger/inspect_repl.js",
@@ -149,6 +199,7 @@
"lib/internal/fs/cp/cp-sync.js", "lib/internal/fs/cp/cp-sync.js",
"lib/internal/fs/cp/cp.js", "lib/internal/fs/cp/cp.js",
"lib/internal/fs/dir.js", "lib/internal/fs/dir.js",
"lib/internal/fs/glob.js",
"lib/internal/fs/promises.js", "lib/internal/fs/promises.js",
"lib/internal/fs/read/context.js", "lib/internal/fs/read/context.js",
"lib/internal/fs/recursive_watch.js", "lib/internal/fs/recursive_watch.js",
@@ -163,8 +214,11 @@
"lib/internal/http2/compat.js", "lib/internal/http2/compat.js",
"lib/internal/http2/core.js", "lib/internal/http2/core.js",
"lib/internal/http2/util.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_async_hook.js",
"lib/internal/inspector_network_tracking.js",
"lib/internal/js_stream_socket.js", "lib/internal/js_stream_socket.js",
"lib/internal/legacy/processbinding.js", "lib/internal/legacy/processbinding.js",
"lib/internal/linkedlist.js", "lib/internal/linkedlist.js",
@@ -183,6 +237,7 @@
"lib/internal/main/worker_thread.js", "lib/internal/main/worker_thread.js",
"lib/internal/mime.js", "lib/internal/mime.js",
"lib/internal/modules/cjs/loader.js", "lib/internal/modules/cjs/loader.js",
"lib/internal/modules/customization_hooks.js",
"lib/internal/modules/esm/assert.js", "lib/internal/modules/esm/assert.js",
"lib/internal/modules/esm/create_dynamic_module.js", "lib/internal/modules/esm/create_dynamic_module.js",
"lib/internal/modules/esm/fetch_module.js", "lib/internal/modules/esm/fetch_module.js",
@@ -194,7 +249,6 @@
"lib/internal/modules/esm/loader.js", "lib/internal/modules/esm/loader.js",
"lib/internal/modules/esm/module_job.js", "lib/internal/modules/esm/module_job.js",
"lib/internal/modules/esm/module_map.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/resolve.js",
"lib/internal/modules/esm/shared_constants.js", "lib/internal/modules/esm/shared_constants.js",
"lib/internal/modules/esm/translators.js", "lib/internal/modules/esm/translators.js",
@@ -203,6 +257,7 @@
"lib/internal/modules/helpers.js", "lib/internal/modules/helpers.js",
"lib/internal/modules/package_json_reader.js", "lib/internal/modules/package_json_reader.js",
"lib/internal/modules/run_main.js", "lib/internal/modules/run_main.js",
"lib/internal/modules/typescript.js",
"lib/internal/navigator.js", "lib/internal/navigator.js",
"lib/internal/net.js", "lib/internal/net.js",
"lib/internal/options.js", "lib/internal/options.js",
@@ -219,13 +274,11 @@
"lib/internal/perf/timerify.js", "lib/internal/perf/timerify.js",
"lib/internal/perf/usertiming.js", "lib/internal/perf/usertiming.js",
"lib/internal/perf/utils.js", "lib/internal/perf/utils.js",
"lib/internal/policy/manifest.js",
"lib/internal/policy/sri.js",
"lib/internal/priority_queue.js", "lib/internal/priority_queue.js",
"lib/internal/process/execution.js", "lib/internal/process/execution.js",
"lib/internal/process/finalization.js",
"lib/internal/process/per_thread.js", "lib/internal/process/per_thread.js",
"lib/internal/process/permission.js", "lib/internal/process/permission.js",
"lib/internal/process/policy.js",
"lib/internal/process/pre_execution.js", "lib/internal/process/pre_execution.js",
"lib/internal/process/promises.js", "lib/internal/process/promises.js",
"lib/internal/process/report.js", "lib/internal/process/report.js",
@@ -235,6 +288,10 @@
"lib/internal/process/worker_thread_only.js", "lib/internal/process/worker_thread_only.js",
"lib/internal/promise_hooks.js", "lib/internal/promise_hooks.js",
"lib/internal/querystring.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/callbacks.js",
"lib/internal/readline/emitKeypressEvents.js", "lib/internal/readline/emitKeypressEvents.js",
"lib/internal/readline/interface.js", "lib/internal/readline/interface.js",
@@ -249,12 +306,14 @@
"lib/internal/source_map/prepare_stack_trace.js", "lib/internal/source_map/prepare_stack_trace.js",
"lib/internal/source_map/source_map.js", "lib/internal/source_map/source_map.js",
"lib/internal/source_map/source_map_cache.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/stream_base_commons.js",
"lib/internal/streams/add-abort-signal.js", "lib/internal/streams/add-abort-signal.js",
"lib/internal/streams/compose.js", "lib/internal/streams/compose.js",
"lib/internal/streams/destroy.js", "lib/internal/streams/destroy.js",
"lib/internal/streams/duplex.js", "lib/internal/streams/duplex.js",
"lib/internal/streams/duplexify.js", "lib/internal/streams/duplexify.js",
"lib/internal/streams/duplexpair.js",
"lib/internal/streams/end-of-stream.js", "lib/internal/streams/end-of-stream.js",
"lib/internal/streams/from.js", "lib/internal/streams/from.js",
"lib/internal/streams/lazy_transform.js", "lib/internal/streams/lazy_transform.js",
@@ -269,8 +328,10 @@
"lib/internal/streams/writable.js", "lib/internal/streams/writable.js",
"lib/internal/test/binding.js", "lib/internal/test/binding.js",
"lib/internal/test/transfer.js", "lib/internal/test/transfer.js",
"lib/internal/test_runner/assert.js",
"lib/internal/test_runner/coverage.js", "lib/internal/test_runner/coverage.js",
"lib/internal/test_runner/harness.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.js",
"lib/internal/test_runner/mock/mock_timers.js", "lib/internal/test_runner/mock/mock_timers.js",
"lib/internal/test_runner/reporter/dot.js", "lib/internal/test_runner/reporter/dot.js",
@@ -278,8 +339,10 @@
"lib/internal/test_runner/reporter/lcov.js", "lib/internal/test_runner/reporter/lcov.js",
"lib/internal/test_runner/reporter/spec.js", "lib/internal/test_runner/reporter/spec.js",
"lib/internal/test_runner/reporter/tap.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/reporter/v8-serializer.js",
"lib/internal/test_runner/runner.js", "lib/internal/test_runner/runner.js",
"lib/internal/test_runner/snapshot.js",
"lib/internal/test_runner/test.js", "lib/internal/test_runner/test.js",
"lib/internal/test_runner/tests_stream.js", "lib/internal/test_runner/tests_stream.js",
"lib/internal/test_runner/utils.js", "lib/internal/test_runner/utils.js",
@@ -293,10 +356,9 @@
"lib/internal/util/colors.js", "lib/internal/util/colors.js",
"lib/internal/util/comparisons.js", "lib/internal/util/comparisons.js",
"lib/internal/util/debuglog.js", "lib/internal/util/debuglog.js",
"lib/internal/util/embedding.js", "lib/internal/util/diff.js",
"lib/internal/util/inspect.js", "lib/internal/util/inspect.js",
"lib/internal/util/inspector.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/parse_args.js",
"lib/internal/util/parse_args/utils.js", "lib/internal/util/parse_args/utils.js",
"lib/internal/util/types.js", "lib/internal/util/types.js",
@@ -310,6 +372,7 @@
"lib/internal/watch_mode/files_watcher.js", "lib/internal/watch_mode/files_watcher.js",
"lib/internal/watchdog.js", "lib/internal/watchdog.js",
"lib/internal/webidl.js", "lib/internal/webidl.js",
"lib/internal/webstorage.js",
"lib/internal/webstreams/adapters.js", "lib/internal/webstreams/adapters.js",
"lib/internal/webstreams/compression.js", "lib/internal/webstreams/compression.js",
"lib/internal/webstreams/encoding.js", "lib/internal/webstreams/encoding.js",
@@ -322,6 +385,7 @@
"lib/internal/worker.js", "lib/internal/worker.js",
"lib/internal/worker/io.js", "lib/internal/worker/io.js",
"lib/internal/worker/js_transferable.js", "lib/internal/worker/js_transferable.js",
"lib/internal/worker/messaging.js",
"lib/module.js", "lib/module.js",
"lib/net.js", "lib/net.js",
"lib/os.js", "lib/os.js",
@@ -336,6 +400,7 @@
"lib/readline/promises.js", "lib/readline/promises.js",
"lib/repl.js", "lib/repl.js",
"lib/sea.js", "lib/sea.js",
"lib/sqlite.js",
"lib/stream.js", "lib/stream.js",
"lib/stream/consumers.js", "lib/stream/consumers.js",
"lib/stream/promises.js", "lib/stream/promises.js",
@@ -358,12 +423,13 @@
"lib/worker_threads.js", "lib/worker_threads.js",
"lib/zlib.js" "lib/zlib.js"
], ],
"node_module_version": 115, "node_module_version": 127,
"node_no_browser_globals": "false", "node_no_browser_globals": "false",
"node_prefix": "/", "node_prefix": "/",
"node_release_urlbase": "https://nodejs.org/download/release/", "node_release_urlbase": "https://nodejs.org/download/release/",
"node_section_ordering_info": "", "node_section_ordering_info": "",
"node_shared": "false", "node_shared": "false",
"node_shared_ada": "false",
"node_shared_brotli": "false", "node_shared_brotli": "false",
"node_shared_cares": "false", "node_shared_cares": "false",
"node_shared_http_parser": "false", "node_shared_http_parser": "false",
@@ -372,9 +438,15 @@
"node_shared_nghttp3": "false", "node_shared_nghttp3": "false",
"node_shared_ngtcp2": "false", "node_shared_ngtcp2": "false",
"node_shared_openssl": "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_zlib": "false",
"node_shared_zstd": "false",
"node_tag": "", "node_tag": "",
"node_target_type": "executable", "node_target_type": "executable",
"node_use_amaro": "true",
"node_use_bundled_v8": "true", "node_use_bundled_v8": "true",
"node_use_node_code_cache": "true", "node_use_node_code_cache": "true",
"node_use_node_snapshot": "true", "node_use_node_snapshot": "true",
@@ -384,12 +456,14 @@
"node_without_node_options": "false", "node_without_node_options": "false",
"node_write_snapshot_as_array_literals": "false", "node_write_snapshot_as_array_literals": "false",
"openssl_is_fips": "false", "openssl_is_fips": "false",
"openssl_quic": "true", "openssl_quic": "false",
"ossfuzz": "false", "ossfuzz": "false",
"shlib_suffix": "so.115", "shlib_suffix": "so.127",
"single_executable_application": "true", "single_executable_application": "true",
"suppress_all_error_on_warn": "false",
"target_arch": "x64", "target_arch": "x64",
"ubsan": 0, "ubsan": 0,
"use_ccache_win": 0,
"use_prefix_to_find_headers": "false", "use_prefix_to_find_headers": "false",
"v8_enable_31bit_smis_on_64bit_arch": 0, "v8_enable_31bit_smis_on_64bit_arch": 0,
"v8_enable_extensible_ro_snapshot": 0, "v8_enable_extensible_ro_snapshot": 0,
@@ -402,29 +476,29 @@
"v8_enable_maglev": 0, "v8_enable_maglev": 0,
"v8_enable_object_print": 1, "v8_enable_object_print": 1,
"v8_enable_pointer_compression": 0, "v8_enable_pointer_compression": 0,
"v8_enable_sandbox": 0,
"v8_enable_shared_ro_heap": 1, "v8_enable_shared_ro_heap": 1,
"v8_enable_short_builtin_calls": 1, "v8_enable_short_builtin_calls": 1,
"v8_enable_v8_checks": 0, "v8_enable_wasm_simd256_revec": 1,
"v8_enable_webassembly": 1, "v8_enable_webassembly": 1,
"v8_no_strict_aliasing": 1,
"v8_optimized_debug": 1, "v8_optimized_debug": 1,
"v8_promise_internal_field_count": 1, "v8_promise_internal_field_count": 1,
"v8_random_seed": 0, "v8_random_seed": 0,
"v8_trace_maps": 0, "v8_trace_maps": 0,
"v8_use_siphash": 1, "v8_use_siphash": 1,
"want_separate_host_toolset": 0, "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", "python": "/usr/bin/python3",
"standalone_static_library": 1, "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", "userconfig": "/home/oier/.npmrc",
"local_prefix": "/home/oier/projects/fosil-group/pole-book/server", "local_prefix": "/home/oier/projects/fosil-group/pole-book/server",
"prefix": "/home/oier/.nvm/versions/node/v20.13.1", "prefix": "/home/oier/.nvm/versions/node/v22.15.0",
"npm_version": "10.5.2", "npm_version": "10.9.2",
"cache": "/home/oier/.npm", "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", "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/v20.13.1/etc/npmrc", "globalconfig": "/home/oier/.nvm/versions/node/v22.15.0/etc/npmrc",
"init_module": "/home/oier/.npm-init.js", "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 := \ CFLAGS_CC_Debug := \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 -std=gnu++17
INCS_Debug := \ INCS_Debug := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \ -I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \ -I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \ -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3 -I$(obj)/gen/sqlite3
DEFS_Release := \ DEFS_Release := \
@@ -157,16 +158,17 @@ CFLAGS_C_Release :=
CFLAGS_CC_Release := \ CFLAGS_CC_Release := \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 -std=gnu++17
INCS_Release := \ INCS_Release := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \ -I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \ -I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \ -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3 -I$(obj)/gen/sqlite3
OBJS := \ OBJS := \

View File

@@ -40,16 +40,17 @@ CFLAGS_C_Debug :=
CFLAGS_CC_Debug := \ CFLAGS_CC_Debug := \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 -std=gnu++17
INCS_Debug := \ INCS_Debug := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \ -I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \ -I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \ -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3 -I$(obj)/gen/sqlite3
DEFS_Release := \ DEFS_Release := \
@@ -85,16 +86,17 @@ CFLAGS_C_Release :=
CFLAGS_CC_Release := \ CFLAGS_CC_Release := \
-fno-rtti \ -fno-rtti \
-fno-exceptions \ -fno-exceptions \
-fno-strict-aliasing \
-std=gnu++17 -std=gnu++17
INCS_Release := \ INCS_Release := \
-I/home/oier/.cache/node-gyp/20.13.1/include/node \ -I/home/oier/.cache/node-gyp/22.15.0/include/node \
-I/home/oier/.cache/node-gyp/20.13.1/src \ -I/home/oier/.cache/node-gyp/22.15.0/src \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/config \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/config \
-I/home/oier/.cache/node-gyp/20.13.1/deps/openssl/openssl/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/openssl/openssl/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/uv/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/uv/include \
-I/home/oier/.cache/node-gyp/20.13.1/deps/zlib \ -I/home/oier/.cache/node-gyp/22.15.0/deps/zlib \
-I/home/oier/.cache/node-gyp/20.13.1/deps/v8/include \ -I/home/oier/.cache/node-gyp/22.15.0/deps/v8/include \
-I$(obj)/gen/sqlite3 -I$(obj)/gen/sqlite3
OBJS := \ 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. 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 [RFC 5861](https://tools.ietf.org/html/rfc5861), implementing `stale-if-error` and `stale-while-revalidate`. 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. 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. 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)) // (this is pseudocode, roll your own cache (lru-cache package works))
letsPretendThisIsSomeCache.set( letsPretendThisIsSomeCache.set(
request.url, request.url,
{ policy, response }, { policy, body: response.body }, // you only need to store the response body. CachePolicy holds the headers.
policy.timeToLive() policy.timeToLive()
); );
``` ```
```js ```js
// And later, when you receive a new request: // 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: // It's not enough that it exists in the cache, it has to match the new request, too:
if (policy && policy.satisfiesWithoutRevalidation(newRequest)) { if (policy && policy.satisfiesWithoutRevalidation(newRequest)) {
// OK, the previous response can be used to respond to the `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 have to be updated, e.g. to add Age and remove uncacheable headers.
response.headers = policy.responseHeaders(); return {
return response; 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. 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)` ### `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()`. 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. 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 ```js
cachedResponse.headers = cachePolicy.responseHeaders(cachedResponse); cachedResponse.headers = cachePolicy.responseHeaders();
``` ```
### `timeToLive()` ### `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()`. After that time (when `timeToLive() <= 0`) the response may still be usable in certain cases, e.g. if client can explicitly allows stale responses.
`stale-if-error` and `stale-while-revalidate` extend the time to live of the cache, that can still be used if stale.
### `toObject()`/`fromObject(json)` ### `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) ### 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. 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 ```js
updateRequest.headers = cachePolicy.revalidationHeaders(updateRequest); 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: 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. - `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. - `modified` — Boolean indicating whether the response body has changed, and you should use the new response body sent by the server.
- 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 the new response body, and you can replace the old cached response with the updated one.
- 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. - 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.
```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;
}
```
# Yo, FRESH # Yo, FRESH
@@ -174,6 +237,7 @@ if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
## Used by ## 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) - [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 ## Implemented
@@ -187,6 +251,7 @@ if (!oldPolicy.satisfiesWithoutRevalidation(newRequest)) {
- Filtering of hop-by-hop headers. - Filtering of hop-by-hop headers.
- Basic revalidation request - Basic revalidation request
- `stale-if-error` - `stale-if-error`
- `stale-while-revalidate`
## Unimplemented ## Unimplemented

View File

@@ -1,5 +1,22 @@
'use strict'; '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([ const statusCodeCacheableByDefault = new Set([
200, 200,
203, 203,
@@ -15,7 +32,11 @@ const statusCodeCacheableByDefault = new Set([
501, 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([ const understoodStatuses = new Set([
200, 200,
203, 203,
@@ -33,13 +54,21 @@ const understoodStatuses = new Set([
501, 501,
]); ]);
/**
* Set of HTTP error status codes.
* @type {Set<number>}
*/
const errorStatusCodes = new Set([ const errorStatusCodes = new Set([
500, 500,
502, 502,
503, 503,
504, 504,
]); ]);
/**
* Object representing hop-by-hop headers that should be removed.
* @type {Record<string, boolean>}
*/
const hopByHopHeaders = { const hopByHopHeaders = {
date: true, // included, because we add Age update Date date: true, // included, because we add Age update Date
connection: true, connection: true,
@@ -52,6 +81,10 @@ const hopByHopHeaders = {
upgrade: true, upgrade: true,
}; };
/**
* Headers that are excluded from revalidation update.
* @type {Record<string, boolean>}
*/
const excludedFromRevalidationUpdate = { const excludedFromRevalidationUpdate = {
// Since the old body is reused, it doesn't make sense to change properties of the body // Since the old body is reused, it doesn't make sense to change properties of the body
'content-length': true, 'content-length': true,
@@ -60,21 +93,37 @@ const excludedFromRevalidationUpdate = {
'content-range': true, '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) { function toNumberOrZero(s) {
const n = parseInt(s, 10); const n = parseInt(s, 10);
return isFinite(n) ? n : 0; 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) { function isErrorResponse(response) {
// consider undefined response as faulty // consider undefined response as faulty
if(!response) { if (!response) {
return true return true;
} }
return errorStatusCodes.has(response.status); 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) { function parseCacheControl(header) {
/** @type {Record<string, string|boolean>} */
const cc = {}; const cc = {};
if (!header) return cc; if (!header) return cc;
@@ -89,6 +138,11 @@ function parseCacheControl(header) {
return cc; 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) { function formatCacheControl(cc) {
let parts = []; let parts = [];
for (const k in cc) { for (const k in cc) {
@@ -102,6 +156,17 @@ function formatCacheControl(cc) {
} }
module.exports = class CachePolicy { 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( constructor(
req, req,
res, res,
@@ -123,29 +188,44 @@ module.exports = class CachePolicy {
} }
this._assertRequestHasHeaders(req); this._assertRequestHasHeaders(req);
/** @type {number} Timestamp when the response was received */
this._responseTime = this.now(); this._responseTime = this.now();
/** @type {boolean} Indicates if the cache is shared */
this._isShared = shared !== false; 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 = this._cacheHeuristic =
undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE
/** @type {number} Minimum TTL for immutable responses in ms */
this._immutableMinTtl = this._immutableMinTtl =
undefined !== immutableMinTimeToLive undefined !== immutableMinTimeToLive
? immutableMinTimeToLive ? immutableMinTimeToLive
: 24 * 3600 * 1000; : 24 * 3600 * 1000;
/** @type {number} HTTP status code */
this._status = 'status' in res ? res.status : 200; this._status = 'status' in res ? res.status : 200;
/** @type {Record<string, string>} Response headers */
this._resHeaders = res.headers; this._resHeaders = res.headers;
/** @type {Record<string, string|boolean>} Parsed Cache-Control directives from response */
this._rescc = parseCacheControl(res.headers['cache-control']); this._rescc = parseCacheControl(res.headers['cache-control']);
/** @type {string} HTTP method (e.g., GET, POST) */
this._method = 'method' in req ? req.method : 'GET'; this._method = 'method' in req ? req.method : 'GET';
/** @type {string} Request URL */
this._url = req.url; this._url = req.url;
/** @type {string} Host header from the request */
this._host = req.headers.host; this._host = req.headers.host;
/** @type {boolean} Whether the request does not include an Authorization header */
this._noAuthorization = !req.headers.authorization; 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 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']); this._reqcc = parseCacheControl(req.headers['cache-control']);
// Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching, // 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. // so there's no point stricly adhering to the blindly copy&pasted directives.
if ( if (
ignoreCargoCult && this._ignoreCargoCult &&
'pre-check' in this._rescc && 'pre-check' in this._rescc &&
'post-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() { now() {
return Date.now(); return Date.now();
} }
/**
* Determines if the response is storable in a cache.
* @returns {boolean} `false` if can never be cached.
*/
storable() { storable() {
// The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it. // The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.
return !!( return !!(
@@ -208,62 +296,160 @@ module.exports = class CachePolicy {
); );
} }
/**
* @returns {boolean} true if expiration is explicitly defined.
*/
_hasExplicitExpiration() { _hasExplicitExpiration() {
// 4.2.1 Calculating Freshness Lifetime // 4.2.1 Calculating Freshness Lifetime
return ( return !!(
(this._isShared && this._rescc['s-maxage']) || (this._isShared && this._rescc['s-maxage']) ||
this._rescc['max-age'] || this._rescc['max-age'] ||
this._resHeaders.expires this._resHeaders.expires
); );
} }
/**
* @param {HttpRequest} req - a request
* @throws {Error} if the headers are missing.
*/
_assertRequestHasHeaders(req) { _assertRequestHasHeaders(req) {
if (!req || !req.headers) { if (!req || !req.headers) {
throw Error('Request headers missing'); 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) { 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); 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: // 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, // 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 // unless the stored response is successfully validated (Section 4.3), and
const requestCC = parseCacheControl(req.headers['cache-control']); const requestCC = parseCacheControl(req.headers['cache-control']);
if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) { 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']) { if (requestCC['max-age'] && this.age() > toNumberOrZero(requestCC['max-age'])) {
return false; return this._evaluateRequestMissResult(req);
} }
if ( if (requestCC['min-fresh'] && this.maxAge() - this.age() < toNumberOrZero(requestCC['min-fresh'])) {
requestCC['min-fresh'] && return this._evaluateRequestMissResult(req);
this.timeToLive() < 1000 * requestCC['min-fresh']
) {
return false;
} }
// the stored response is either: // the stored response is either:
// fresh, or allowed to be served stale // fresh, or allowed to be served stale
if (this.stale()) { if (this.stale()) {
const allowsStale = // If a value is present, then the client is willing to accept a response that has
requestCC['max-stale'] && // exceeded its freshness lifetime by no more than the specified number of seconds
!this._rescc['must-revalidate'] && const allowsStaleWithoutRevalidation = 'max-stale' in requestCC &&
(true === requestCC['max-stale'] || (true === requestCC['max-stale'] || requestCC['max-stale'] > this.age() - this.maxAge());
requestCC['max-stale'] > this.age() - this.maxAge());
if (!allowsStale) { if (allowsStaleWithoutRevalidation) {
return false; 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) { _requestMatches(req, allowHeadMethod) {
// The presented effective request URI and that of the stored response match, and // The presented effective request URI and that of the stored response match, and
return ( return !!(
(!this._url || this._url === req.url) && (!this._url || this._url === req.url) &&
this._host === req.headers.host && this._host === req.headers.host &&
// the request method associated with the stored response allows it to be used for the presented request, and // 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() { _allowsStoringAuthenticated() {
// following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage. // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
return ( return !!(
this._rescc['must-revalidate'] || this._rescc['must-revalidate'] ||
this._rescc.public || this._rescc.public ||
this._rescc['s-maxage'] 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) { _varyMatches(req) {
if (!this._resHeaders.vary) { if (!this._resHeaders.vary) {
return true; return true;
@@ -304,7 +499,13 @@ module.exports = class CachePolicy {
return true; 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) { _copyWithoutHopByHopHeaders(inHeaders) {
/** @type {Record<string, string>} */
const headers = {}; const headers = {};
for (const name in inHeaders) { for (const name in inHeaders) {
if (hopByHopHeaders[name]) continue; if (hopByHopHeaders[name]) continue;
@@ -330,6 +531,11 @@ module.exports = class CachePolicy {
return headers; 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() { responseHeaders() {
const headers = this._copyWithoutHopByHopHeaders(this._resHeaders); const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);
const age = this.age(); 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 * Returns the Date header value from the response or the current time if invalid.
* @return timestamp * @returns {number} Timestamp (in milliseconds) representing the Date header or response time.
*/ */
date() { date() {
const serverDate = Date.parse(this._resHeaders.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. * Value of the Age header, in seconds, updated for the current time.
* May be fractional. * May be fractional.
* * @returns {number} The age in seconds.
* @return Number
*/ */
age() { age() {
let age = this._ageValue(); let age = this._ageValue();
@@ -375,16 +580,21 @@ module.exports = class CachePolicy {
return age + residentTime; return age + residentTime;
} }
/**
* @returns {number} The Age header value as a number.
*/
_ageValue() { _ageValue() {
return toNumberOrZero(this._resHeaders.age); 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()`. * 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() { maxAge() {
if (!this.storable() || this._rescc['no-cache']) { if (!this.storable() || this._rescc['no-cache']) {
@@ -446,29 +656,57 @@ module.exports = class CachePolicy {
return defaultMinTtl; 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() { timeToLive() {
const age = this.maxAge() - this.age(); const age = this.maxAge() - this.age();
const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']); const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);
const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']); 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() { stale() {
return this.maxAge() <= this.age(); return this.maxAge() <= this.age();
} }
/**
* @returns {boolean} `true` if `stale-if-error` condition allows use of a stale response.
*/
_useStaleIfError() { _useStaleIfError() {
return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age(); 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() { 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) { static fromObject(obj) {
return new this(undefined, undefined, { _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) { _fromObject(obj) {
if (this._responseTime) throw Error('Reinitialized'); if (this._responseTime) throw Error('Reinitialized');
if (!obj || obj.v !== 1) throw Error('Invalid serialization'); if (!obj || obj.v !== 1) throw Error('Invalid serialization');
@@ -478,6 +716,7 @@ module.exports = class CachePolicy {
this._cacheHeuristic = obj.ch; this._cacheHeuristic = obj.ch;
this._immutableMinTtl = this._immutableMinTtl =
obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000; obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;
this._ignoreCargoCult = !!obj.icc;
this._status = obj.st; this._status = obj.st;
this._resHeaders = obj.resh; this._resHeaders = obj.resh;
this._rescc = obj.rescc; this._rescc = obj.rescc;
@@ -489,6 +728,10 @@ module.exports = class CachePolicy {
this._reqcc = obj.reqcc; this._reqcc = obj.reqcc;
} }
/**
* Serializes the `CachePolicy` instance into a JSON-serializable object.
* @returns {Object} The serialized object.
*/
toObject() { toObject() {
return { return {
v: 1, v: 1,
@@ -496,6 +739,7 @@ module.exports = class CachePolicy {
sh: this._isShared, sh: this._isShared,
ch: this._cacheHeuristic, ch: this._cacheHeuristic,
imm: this._immutableMinTtl, imm: this._immutableMinTtl,
icc: this._ignoreCargoCult,
st: this._status, st: this._status,
resh: this._resHeaders, resh: this._resHeaders,
rescc: this._rescc, rescc: this._rescc,
@@ -514,6 +758,8 @@ module.exports = class CachePolicy {
* *
* Hop by hop headers are always stripped. * Hop by hop headers are always stripped.
* Revalidation headers may be added or removed, depending on request. * 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) { revalidationHeaders(incomingReq) {
this._assertRequestHasHeaders(incomingReq); this._assertRequestHasHeaders(incomingReq);
@@ -578,17 +824,22 @@ module.exports = class CachePolicy {
* Returns {policy, modified} where modified is a boolean indicating * Returns {policy, modified} where modified is a boolean indicating
* whether the response body has been modified, and old cached body can't be used. * 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) { revalidatedPolicy(request, response) {
this._assertRequestHasHeaders(request); this._assertRequestHasHeaders(request);
if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful
if (this._useStaleIfError() && isErrorResponse(response)) {
return { return {
modified: false, policy: this,
matches: false, modified: false,
policy: this, matches: true,
}; };
} }
if (!response || !response.headers) { if (!response || !response.headers) {
throw Error('Response headers missing'); 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) { if (!matches) {
return { 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 // 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 // but to reuse a cached body. We don't have a good way to tell clients to do
// error recovery in such case. // error recovery in such case.
@@ -662,11 +920,7 @@ module.exports = class CachePolicy {
headers, headers,
}); });
return { return {
policy: new this.constructor(request, newResponse, { policy: new this.constructor(request, newResponse, optionsCopy),
shared: this._isShared,
cacheHeuristic: this._cacheHeuristic,
immutableMinTimeToLive: this._immutableMinTtl,
}),
modified: false, modified: false,
matches: true, matches: true,
}; };

View File

@@ -1,18 +1,22 @@
{ {
"name": "http-cache-semantics", "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", "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", "main": "index.js",
"types": "index.js",
"scripts": { "scripts": {
"test": "mocha" "test": "mocha"
}, },
"files": [ "files": [
"index.js" "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", "license": "BSD-2-Clause",
"devDependencies": { "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": { "info": {
"singularName": "element", "singularName": "element",
"pluralName": "elements", "pluralName": "elements",
"displayName": "Element" "displayName": "Element",
"description": ""
}, },
"options": { "options": {
"draftAndPublish": true "draftAndPublish": true
@@ -20,14 +21,21 @@
"type": "text" "type": "text"
}, },
"Image": { "Image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [ "allowedTypes": [
"images", "images",
"files", "files",
"videos", "videos",
"audios" "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 { export interface ApiElementElement extends Struct.CollectionTypeSchema {
collectionName: 'elements'; collectionName: 'elements';
info: { info: {
description: '';
displayName: 'Element'; displayName: 'Element';
pluralName: 'elements'; pluralName: 'elements';
singularName: 'element'; singularName: 'element';
@@ -401,6 +402,9 @@ export interface ApiElementElement extends Struct.CollectionTypeSchema {
updatedAt: Schema.Attribute.DateTime; updatedAt: Schema.Attribute.DateTime;
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> & updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
Schema.Attribute.Private; Schema.Attribute.Private;
Url: Schema.Attribute.String &
Schema.Attribute.Required &
Schema.Attribute.Unique;
}; };
} }