mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 00:20:08 +01:00
The API is now available to user-land run-time snapshots. So update the example. This also makes the intention of the examples a bit clearer and test it in our test suite. PR-URL: https://github.com/nodejs/node/pull/47468 Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('node:fs');
|
|
const zlib = require('node:zlib');
|
|
const path = require('node:path');
|
|
const assert = require('node:assert');
|
|
|
|
const v8 = require('node:v8');
|
|
|
|
class BookShelf {
|
|
storage = new Map();
|
|
|
|
// Reading a series of files from directory and store them into storage.
|
|
constructor(directory, books) {
|
|
for (const book of books) {
|
|
this.storage.set(book, fs.readFileSync(path.join(directory, book)));
|
|
};
|
|
}
|
|
|
|
static compressAll(shelf) {
|
|
for (const [ book, content ] of shelf.storage) {
|
|
shelf.storage.set(book, zlib.gzipSync(content));
|
|
}
|
|
}
|
|
|
|
static decompressAll(shelf) {
|
|
for (const [ book, content ] of shelf.storage) {
|
|
shelf.storage.set(book, zlib.gunzipSync(content));
|
|
}
|
|
}
|
|
}
|
|
|
|
// __dirname here is where the snapshot script is placed
|
|
// during snapshot building time.
|
|
const shelf = new BookShelf(__dirname, [
|
|
'book1.en_US.txt',
|
|
'book1.es_ES.txt',
|
|
'book2.zh_CN.txt',
|
|
]);
|
|
|
|
assert(v8.startupSnapshot.isBuildingSnapshot());
|
|
|
|
// On snapshot serialization, compress the books to reduce size.
|
|
v8.startupSnapshot.addSerializeCallback(BookShelf.compressAll, shelf);
|
|
// On snapshot deserialization, decompress the books.
|
|
v8.startupSnapshot.addDeserializeCallback(BookShelf.decompressAll, shelf);
|
|
v8.startupSnapshot.setDeserializeMainFunction((shelf) => {
|
|
// process.env and process.argv are refreshed during snapshot
|
|
// deserialization.
|
|
const lang = process.env.BOOK_LANG || 'en_US';
|
|
const book = process.argv[1];
|
|
const name = `${book}.${lang}.txt`;
|
|
console.error('Reading', name);
|
|
console.log(shelf.storage.get(name).toString());
|
|
}, shelf);
|
|
|
|
assert.throws(() => v8.startupSnapshot.setDeserializeMainFunction(() => {
|
|
assert.fail('unreachable duplicated main function');
|
|
}), {
|
|
code: 'ERR_DUPLICATE_STARTUP_SNAPSHOT_MAIN_FUNCTION',
|
|
});
|