@@ -853,6 +853,137 @@ Called immediately after a promise continuation executes. This may be after a
853
853
Called when the promise receives a resolution or rejection value. This may
854
854
occur synchronously in the case of ` Promise.resolve() ` or ` Promise.reject() ` .
855
855
856
+ ## Startup Snapshot API
857
+
858
+ <!-- YAML
859
+ added: REPLACEME
860
+ -->
861
+
862
+ > Stability: 1 - Experimental
863
+
864
+ The ` v8.startupSnapshot ` interface can be used to add serialization and
865
+ deserialization hooks for custom startup snapshots. Currently the startup
866
+ snapshots can only be built into the Node.js binary from source.
867
+
868
+ ``` console
869
+ $ cd /path/to/node
870
+ $ ./configure --node-snapshot-main=entry.js
871
+ $ make node
872
+ # This binary contains the result of the execution of entry.js
873
+ $ out/Release/node
874
+ ```
875
+
876
+ In the example above, ` entry.js ` can use methods from the ` v8.startupSnapshot `
877
+ interface to specify how to save information for custom objects in the snapshot
878
+ during serialization and how the information can be used to synchronize these
879
+ objects during deserialization of the snapshot. For example, if the ` entry.js `
880
+ contains the following script:
881
+
882
+ ``` cjs
883
+ ' use strict' ;
884
+
885
+ const fs = require (' fs' );
886
+ const zlib = require (' zlib' );
887
+ const path = require (' path' );
888
+ const assert = require (' assert' );
889
+
890
+ const {
891
+ isBuildingSnapshot ,
892
+ addSerializeCallback ,
893
+ addDeserializeCallback ,
894
+ setDeserializeMainFunction
895
+ } = require (' v8' ).startupSnapshot ;
896
+
897
+ const filePath = path .resolve (__dirname , ' ../x1024.txt' );
898
+ const storage = {};
899
+
900
+ assert (isBuildingSnapshot ());
901
+
902
+ addSerializeCallback (({ filePath }) => {
903
+ storage[filePath] = zlib .gzipSync (fs .readFileSync (filePath));
904
+ }, { filePath });
905
+
906
+ addDeserializeCallback (({ filePath }) => {
907
+ storage[filePath] = zlib .gunzipSync (storage[filePath]);
908
+ }, { filePath });
909
+
910
+ setDeserializeMainFunction (({ filePath }) => {
911
+ console .log (storage[filePath].toString ());
912
+ }, { filePath });
913
+ ```
914
+
915
+ The resulted binary will simply print the data deserialized from the snapshot
916
+ during start up:
917
+
918
+ ``` console
919
+ $ out/Release/node
920
+ # Prints content of ./test/fixtures/x1024.txt
921
+ ```
922
+
923
+ Currently the API is only available to a Node.js instance launched from the
924
+ default snapshot, that is, the application deserialized from a user-land
925
+ snapshot cannot use these APIs again.
926
+
927
+ ### ` v8.startupSnapshot.addSerializeCallback(callback[, data]) `
928
+
929
+ <!-- YAML
930
+ added: REPLACEME
931
+ -->
932
+
933
+ * ` callback ` {Function} Callback to be invoked before serialization.
934
+ * ` data ` {any} Optional data that will be passed to the ` callback ` when it
935
+ gets called.
936
+
937
+ Add a callback that will be called when the Node.js instance is about to
938
+ get serialized into a snapshot and exit. This can be used to release
939
+ resources that should not or cannot be serialized or to convert user data
940
+ into a form more suitable for serialization.
941
+
942
+ ### ` v8.startupSnapshot.addDeserializeCallback(callback[, data]) `
943
+
944
+ <!-- YAML
945
+ added: REPLACEME
946
+ -->
947
+
948
+ * ` callback ` {Function} Callback to be invoked after the snapshot is
949
+ deserialized.
950
+ * ` data ` {any} Optional data that will be passed to the ` callback ` when it
951
+ gets called.
952
+
953
+ Add a callback that will be called when the Node.js instance is deserialized
954
+ from a snapshot. The ` callback ` and the ` data ` (if provided) will be
955
+ serialized into the snapshot, they can be used to re-initialize the state
956
+ of the application or to re-acquire resources that the application needs
957
+ when the application is restarted from the snapshot.
958
+
959
+ ### ` v8.startupSnapshot.setDeserializeMainFunction(callback[, data]) `
960
+
961
+ <!-- YAML
962
+ added: REPLACEME
963
+ -->
964
+
965
+ * ` callback ` {Function} Callback to be invoked as the entry point after the
966
+ snapshot is deserialized.
967
+ * ` data ` {any} Optional data that will be passed to the ` callback ` when it
968
+ gets called.
969
+
970
+ This sets the entry point of the Node.js application when it is deserialized
971
+ from a snapshot. This can be called only once in the snapshot building
972
+ script. If called, the deserialized application no longer needs an additional
973
+ entry point script to start up and will simply invoke the callback along with
974
+ the deserialized data (if provided), otherwise an entry point script still
975
+ needs to be provided to the deserialized application.
976
+
977
+ ### ` v8.startupSnapshot.isBuildingSnapshot() `
978
+
979
+ <!-- YAML
980
+ added: REPLACEME
981
+ -->
982
+
983
+ * Returns: {boolean}
984
+
985
+ Returns true if the Node.js instance is run to build a snapshot.
986
+
856
987
[ HTML structured clone algorithm ] : https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
857
988
[ Hook Callbacks ] : #hook-callbacks
858
989
[ V8 ] : https://developers.google.com/v8/
0 commit comments