forked from cory/tildefriends
ssb.js is now entirely in C. Usual disclaimers about it not being amazingly well tested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4111 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
@ -342,7 +342,6 @@ async function getProcessBlob(blobId, key, options) {
|
||||
});
|
||||
}
|
||||
};
|
||||
delete imports.ssb.addRpc;
|
||||
|
||||
if (process.credentials &&
|
||||
process.credentials.session &&
|
||||
|
164
core/ssb.js
164
core/ssb.js
@ -1,164 +0,0 @@
|
||||
"use strict";
|
||||
var g_database = new Database('core');
|
||||
const k_use_create_history_stream = false;
|
||||
|
||||
function get_latest_sequence_for_author(author) {
|
||||
var sequence = 0;
|
||||
ssb.sqlStream(
|
||||
'SELECT MAX(sequence) AS sequence FROM messages WHERE author = ?1',
|
||||
[author],
|
||||
function(row) {
|
||||
if (row.sequence) {
|
||||
sequence = row.sequence;
|
||||
}
|
||||
});
|
||||
return sequence;
|
||||
}
|
||||
|
||||
function storeMessage(message) {
|
||||
var payload = message.message.value ? message.message.value : message.message;
|
||||
if (typeof(payload) == 'object') {
|
||||
ssb.storeMessage(payload);
|
||||
}
|
||||
}
|
||||
|
||||
ssb.addEventListener('connections', function on_connections_changed(change, connection) {
|
||||
if (change == 'add') {
|
||||
var sequence = get_latest_sequence_for_author(connection.id);
|
||||
if (k_use_create_history_stream) {
|
||||
connection.send_json({'name': ['createHistoryStream'], 'type': 'source', 'args': [{'id': connection.id, 'seq': sequence, 'live': true, 'keys': false}]}, storeMessage);
|
||||
var identities = ssb.getAllIdentities();
|
||||
let ids = ssb.followingDeep(identities, 2);
|
||||
for (let id of ids) {
|
||||
if (identities.indexOf(id) != -1) {
|
||||
continue;
|
||||
}
|
||||
var sequence = get_latest_sequence_for_author(id);
|
||||
connection.send_json({'name': ['createHistoryStream'], 'type': 'source', 'args': [{'id': id, 'seq': sequence, 'live': true, 'keys': false}]}, storeMessage);
|
||||
}
|
||||
} else {
|
||||
if (connection.is_client) {
|
||||
connection.send_json({"name": ["ebt", "replicate"], "args": [{"version": 3, "format": "classic"}], "type": "duplex"}, ebtReplicateClient);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function ebtReplicateSendClock(request, have) {
|
||||
var identities = ssb.getAllIdentities();
|
||||
var message = {};
|
||||
var last_sent = request.connection.sent_clock || {};
|
||||
var ids = ssb.followingDeep(identities, 2).concat([request.connection.id]);
|
||||
if (!Object.keys(last_sent).length) {
|
||||
for (let id of ids) {
|
||||
message[id] = get_latest_sequence_for_author(id);
|
||||
}
|
||||
}
|
||||
for (let id of Object.keys(have)) {
|
||||
if (message[id] === undefined) {
|
||||
var sequence = get_latest_sequence_for_author(id);
|
||||
message[id] = sequence ? sequence : -1;
|
||||
}
|
||||
}
|
||||
|
||||
var to_send = {}
|
||||
var offset = Math.floor(Math.random() * ids.length);
|
||||
for (var i = 0; i < ids.length; i++) {
|
||||
var id = ids[(i + offset) % ids.length];
|
||||
if (last_sent[id] === undefined || message[id] > last_sent[id]) {
|
||||
last_sent[id] = to_send[id] = message[id] === -1 ? -1 : message[id] << 1;
|
||||
}
|
||||
if (Object.keys(to_send).length >= 32) {
|
||||
request.send_json(to_send);
|
||||
to_send = {};
|
||||
}
|
||||
}
|
||||
request.connection.sent_clock = last_sent;
|
||||
|
||||
if (Object.keys(to_send).length) {
|
||||
request.send_json(to_send);
|
||||
}
|
||||
}
|
||||
|
||||
function formatMessage(row) {
|
||||
if (row.sequence_before_author) {
|
||||
return {
|
||||
previous: row.previous,
|
||||
sequence: row.sequence,
|
||||
author: row.author,
|
||||
timestamp: row.timestamp,
|
||||
hash: row.hash,
|
||||
content: JSON.parse(row.content),
|
||||
signature: row.signature,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
previous: row.previous,
|
||||
author: row.author,
|
||||
sequence: row.sequence,
|
||||
timestamp: row.timestamp,
|
||||
hash: row.hash,
|
||||
content: JSON.parse(row.content),
|
||||
signature: row.signature,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function ebtReplicateRegisterMessageCallback(request) {
|
||||
ssb.addEventListener('message', function(message_id) {
|
||||
if (request.connection.send_clock) {
|
||||
ssb.sqlStream(
|
||||
'SELECT previous, author, id, sequence, timestamp, hash, content, signature FROM messages WHERE id = ?1',
|
||||
[message_id],
|
||||
function (row) {
|
||||
if (request.connection.send_clock[row.author] < row.sequence) {
|
||||
request.send_json(formatMessage(row));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function ebtReplicateCommon(request) {
|
||||
if (request.message.author) {
|
||||
storeMessage(request);
|
||||
} else {
|
||||
ebtReplicateSendClock(request, request.message);
|
||||
|
||||
if (!request.connection.send_clock) {
|
||||
request.connection.send_clock = {};
|
||||
}
|
||||
for (let id of Object.keys(request.message)) {
|
||||
if (request.message[id] >= 0 && (request.message[id] & 1) == 0) {
|
||||
request.connection.send_clock[id] = request.message[id] >> 1;
|
||||
ssb.sqlStream(
|
||||
'SELECT previous, author, id, sequence, timestamp, hash, content, signature FROM messages WHERE author = ?1 AND sequence >= ?2 ORDER BY sequence',
|
||||
[id, request.message[id] >> 1],
|
||||
function (row) {
|
||||
request.send_json(formatMessage(row));
|
||||
request.connection.send_clock[id] = row.sequence;
|
||||
});
|
||||
} else {
|
||||
delete request.connection.send_clock[id];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ebtReplicateClient(request) {
|
||||
if (request.message?.name !== 'Error') {
|
||||
if (!request.connection.message_registered) {
|
||||
ebtReplicateRegisterMessageCallback(request);
|
||||
request.connection.message_registered = true;
|
||||
}
|
||||
ebtReplicateCommon(request);
|
||||
}
|
||||
}
|
||||
|
||||
function ebtReplicateServer(request) {
|
||||
ebtReplicateRegisterMessageCallback(request);
|
||||
ebtReplicateSendClock(request, {});
|
||||
request.more(ebtReplicateCommon);
|
||||
}
|
||||
|
||||
ssb.addRpc(['ebt', 'replicate'], ebtReplicateServer);
|
Reference in New Issue
Block a user