**Motivations:** - Complete documentation for dashboard, domains, ports and environment configuration - Add new services (ClamAV API, Watermark API) to the infrastructure - Enhance dashboard with new pages and improved functionality - Improve deployment scripts and service configurations **Root causes:** - Missing comprehensive documentation for infrastructure setup - Need for antivirus scanning service integration - Need for watermark service integration - Dashboard required additional pages and features **Correctifs:** - Added comprehensive documentation in docs/ (DASHBOARD.md, DOMAINS_AND_PORTS.md, ENVIRONMENT.md) - Updated systemd service files with proper environment variables - Enhanced nginx proxy configuration script - Updated maintenance documentation **Evolutions:** - Added new ClamAV API service (api-clamav) for file scanning - Added new Watermark API service (api-filigrane) for document watermarking - Enhanced signet-dashboard with new learn.html page - Improved dashboard UI with better styles and navigation - Enhanced app.js with new functionality and better error handling - Updated API documentation page with complete endpoint descriptions - Added deployment scripts for watermark and nginx configuration - Updated hash and UTXO lists with latest data - Enhanced server.js with new routes and improved Bitcoin RPC integration **Pages affectées:** - docs/DASHBOARD.md: New comprehensive dashboard documentation - docs/DOMAINS_AND_PORTS.md: New infrastructure domains and ports documentation - docs/ENVIRONMENT.md: New environment variables documentation - docs/MAINTENANCE.md: Updated maintenance procedures - docs/README.md: Updated main documentation - signet-dashboard/public/app.js: Enhanced with new features - signet-dashboard/public/styles.css: Improved styling - signet-dashboard/public/index.html: Enhanced main page - signet-dashboard/public/learn.html: New educational page - signet-dashboard/public/api-docs.html: Enhanced API documentation - signet-dashboard/public/hash-list.html: Updated hash list page - signet-dashboard/public/utxo-list.html: Updated UTXO list page - signet-dashboard/public/join-signet.html: Updated join signet page - signet-dashboard/src/server.js: Enhanced server with new routes - signet-dashboard/start.sh: Updated startup script - signet-dashboard/signet-dashboard.service: Updated systemd service - api-anchorage/anchorage-api.service: Updated systemd service - api-faucet/faucet-api.service: Updated systemd service - configure-nginx-proxy.sh: Enhanced nginx configuration script - add-watermark-certificate.sh: New watermark certificate script - deploy-watermark-nginx.sh: New deployment script - api-clamav/: New ClamAV API service - api-filigrane/: New Watermark API service - hash_list.txt, utxo_list.txt: Updated with latest data - anchor_count.txt: Updated anchor count
126 lines
3.0 KiB
JavaScript
126 lines
3.0 KiB
JavaScript
let iconv;
|
|
const stream = require('stream');
|
|
const DecodeStream = require('./DecodeStream');
|
|
try { iconv = require('iconv-lite'); } catch (error) {}
|
|
|
|
class EncodeStream extends stream.Readable {
|
|
constructor(bufferSize = 65536) {
|
|
super(...arguments);
|
|
this.buffer = Buffer.alloc(bufferSize);
|
|
this.bufferOffset = 0;
|
|
this.pos = 0;
|
|
}
|
|
|
|
// do nothing, required by node
|
|
_read() {}
|
|
|
|
ensure(bytes) {
|
|
if ((this.bufferOffset + bytes) > this.buffer.length) {
|
|
return this.flush();
|
|
}
|
|
}
|
|
|
|
flush() {
|
|
if (this.bufferOffset > 0) {
|
|
this.push(Buffer.from(this.buffer.slice(0, this.bufferOffset)));
|
|
return this.bufferOffset = 0;
|
|
}
|
|
}
|
|
|
|
writeBuffer(buffer) {
|
|
this.flush();
|
|
this.push(buffer);
|
|
return this.pos += buffer.length;
|
|
}
|
|
|
|
writeString(string, encoding = 'ascii') {
|
|
switch (encoding) {
|
|
case 'utf16le': case 'ucs2': case 'utf8': case 'ascii':
|
|
return this.writeBuffer(Buffer.from(string, encoding));
|
|
|
|
case 'utf16be':
|
|
var buf = Buffer.from(string, 'utf16le');
|
|
|
|
// swap the bytes
|
|
for (let i = 0, end = buf.length - 1; i < end; i += 2) {
|
|
const byte = buf[i];
|
|
buf[i] = buf[i + 1];
|
|
buf[i + 1] = byte;
|
|
}
|
|
|
|
return this.writeBuffer(buf);
|
|
|
|
default:
|
|
if (iconv) {
|
|
return this.writeBuffer(iconv.encode(string, encoding));
|
|
} else {
|
|
throw new Error('Install iconv-lite to enable additional string encodings.');
|
|
}
|
|
}
|
|
}
|
|
|
|
writeUInt24BE(val) {
|
|
this.ensure(3);
|
|
this.buffer[this.bufferOffset++] = (val >>> 16) & 0xff;
|
|
this.buffer[this.bufferOffset++] = (val >>> 8) & 0xff;
|
|
this.buffer[this.bufferOffset++] = val & 0xff;
|
|
return this.pos += 3;
|
|
}
|
|
|
|
writeUInt24LE(val) {
|
|
this.ensure(3);
|
|
this.buffer[this.bufferOffset++] = val & 0xff;
|
|
this.buffer[this.bufferOffset++] = (val >>> 8) & 0xff;
|
|
this.buffer[this.bufferOffset++] = (val >>> 16) & 0xff;
|
|
return this.pos += 3;
|
|
}
|
|
|
|
writeInt24BE(val) {
|
|
if (val >= 0) {
|
|
return this.writeUInt24BE(val);
|
|
} else {
|
|
return this.writeUInt24BE(val + 0xffffff + 1);
|
|
}
|
|
}
|
|
|
|
writeInt24LE(val) {
|
|
if (val >= 0) {
|
|
return this.writeUInt24LE(val);
|
|
} else {
|
|
return this.writeUInt24LE(val + 0xffffff + 1);
|
|
}
|
|
}
|
|
|
|
fill(val, length) {
|
|
if (length < this.buffer.length) {
|
|
this.ensure(length);
|
|
this.buffer.fill(val, this.bufferOffset, this.bufferOffset + length);
|
|
this.bufferOffset += length;
|
|
return this.pos += length;
|
|
} else {
|
|
const buf = Buffer.alloc(length);
|
|
buf.fill(val);
|
|
return this.writeBuffer(buf);
|
|
}
|
|
}
|
|
|
|
end() {
|
|
this.flush();
|
|
return this.push(null);
|
|
}
|
|
}
|
|
|
|
for (let key in Buffer.prototype) {
|
|
if (key.slice(0, 5) === 'write') {
|
|
const bytes = +DecodeStream.TYPES[key.replace(/write|[BL]E/g, '')];
|
|
EncodeStream.prototype[key] = function(value) {
|
|
this.ensure(bytes);
|
|
this.buffer[key](value, this.bufferOffset);
|
|
this.bufferOffset += bytes;
|
|
return this.pos += bytes;
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = EncodeStream;
|