From cde68abec9d6924ffd3c8af9a4a5bfb41bc95c2e Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 10 Feb 2019 16:36:25 +0100 Subject: [PATCH] progress of tar import through WS --- src/public/javascripts/dialogs/import.js | 21 ++++++++++++++----- src/public/javascripts/services/messaging.js | 6 +++--- .../services/protected_session_holder.js | 2 +- src/public/javascripts/services/utils.js | 2 +- src/services/consistency_checks.js | 2 +- src/services/content_hash.js | 2 +- src/services/import/tar.js | 18 ++++++++++++++-- src/services/notes.js | 2 +- src/services/sync.js | 4 ++-- src/services/utils.js | 2 +- src/views/dialogs/import.ejs | 4 ++++ 11 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/public/javascripts/dialogs/import.js b/src/public/javascripts/dialogs/import.js index 67c062fc2..29e4cb3a9 100644 --- a/src/public/javascripts/dialogs/import.js +++ b/src/public/javascripts/dialogs/import.js @@ -2,13 +2,20 @@ import treeService from '../services/tree.js'; import treeUtils from "../services/tree_utils.js"; import server from "../services/server.js"; import infoService from "../services/info.js"; +import messagingService from "../services/messaging.js"; const $dialog = $("#import-dialog"); const $form = $("#import-form"); const $noteTitle = $dialog.find(".note-title"); const $fileUploadInput = $("#import-file-upload-input"); +const $importNoteCountWrapper = $("#import-note-count-wrapper"); +const $importNoteCount = $("#import-note-count"); async function showDialog() { + $importNoteCountWrapper.hide(); + $importNoteCount.text('0'); + $fileUploadInput.val(''); + glob.activeDialog = $dialog; const currentNode = treeService.getCurrentNode(); @@ -29,10 +36,6 @@ function importIntoNote(importNoteId) { const formData = new FormData(); formData.append('upload', $fileUploadInput[0].files[0]); - // this is done to reset the field otherwise triggering import same file again would not work - // https://github.com/zadam/trilium/issues/388 - $fileUploadInput.val(''); - $.ajax({ url: baseApiUrl + 'notes/' + importNoteId + '/import', headers: server.getHeaders(), @@ -46,7 +49,7 @@ function importIntoNote(importNoteId) { .done(async note => { $dialog.modal('hide'); - infoService.showMessage("Import finished successfully.") + infoService.showMessage("Import finished successfully."); await treeService.reload(); @@ -58,6 +61,14 @@ function importIntoNote(importNoteId) { }); } +messagingService.subscribeToMessages(message => { + if (message.type === 'importNoteCount') { + $importNoteCountWrapper.show(); + + $importNoteCount.text(message.count); + } +}); + export default { showDialog } \ No newline at end of file diff --git a/src/public/javascripts/services/messaging.js b/src/public/javascripts/services/messaging.js index 62ee07bf7..a7444b376 100644 --- a/src/public/javascripts/services/messaging.js +++ b/src/public/javascripts/services/messaging.js @@ -38,7 +38,7 @@ function handleMessage(event) { } if (message.type === 'sync') { - lastPingTs = new Date().getTime(); + lastPingTs = Date.now(); if (message.data.length > 0) { console.debug(utils.now(), "Sync data: ", message.data); @@ -81,10 +81,10 @@ setTimeout(() => { ws = connectWebSocket(); lastSyncId = glob.maxSyncIdAtLoad; - lastPingTs = new Date().getTime(); + lastPingTs = Date.now(); setInterval(async () => { - if (new Date().getTime() - lastPingTs > 30000) { + if (Date.now() - lastPingTs > 30000) { console.log("Lost connection to server"); } diff --git a/src/public/javascripts/services/protected_session_holder.js b/src/public/javascripts/services/protected_session_holder.js index fd98aef67..b95a8c8d0 100644 --- a/src/public/javascripts/services/protected_session_holder.js +++ b/src/public/javascripts/services/protected_session_holder.js @@ -8,7 +8,7 @@ let protectedSessionId = null; optionsInitService.optionsReady.then(options => protectedSessionTimeout = options.protectedSessionTimeout); setInterval(() => { - if (lastProtectedSessionOperationDate !== null && new Date().getTime() - lastProtectedSessionOperationDate.getTime() > protectedSessionTimeout * 1000) { + if (lastProtectedSessionOperationDate !== null && Date.now() - lastProtectedSessionOperationDate.getTime() > protectedSessionTimeout * 1000) { resetProtectedSession(); } }, 5000); diff --git a/src/public/javascripts/services/utils.js b/src/public/javascripts/services/utils.js index 3f24b7f41..1ea87e495 100644 --- a/src/public/javascripts/services/utils.js +++ b/src/public/javascripts/services/utils.js @@ -77,7 +77,7 @@ async function stopWatch(what, func) { const ret = await func(); - const tookMs = new Date().getTime() - start.getTime(); + const tookMs = Date.now() - start.getTime(); console.log(`${what} took ${tookMs}ms`); diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index fc24a0ef1..208fbc8a5 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -430,7 +430,7 @@ async function runChecks() { await runAllChecks(); - elapsedTimeMs = new Date().getTime() - startTime.getTime(); + elapsedTimeMs = Date.now() - startTime.getTime(); }); if (fixedIssues) { diff --git a/src/services/content_hash.js b/src/services/content_hash.js index d887ad1ef..f9981c9a2 100644 --- a/src/services/content_hash.js +++ b/src/services/content_hash.js @@ -42,7 +42,7 @@ async function getHashes() { links: await getHash(Link) }; - const elapseTimeMs = new Date().getTime() - startTime.getTime(); + const elapseTimeMs = Date.now() - startTime.getTime(); log.info(`Content hash computation took ${elapseTimeMs}ms`); diff --git a/src/services/import/tar.js b/src/services/import/tar.js index d6f658044..bc792ccab 100644 --- a/src/services/import/tar.js +++ b/src/services/import/tar.js @@ -6,6 +6,7 @@ const utils = require('../../services/utils'); const log = require('../../services/log'); const repository = require('../../services/repository'); const noteService = require('../../services/notes'); +const messagingService = require('../../services/messaging'); const Branch = require('../../entities/branch'); const tar = require('tar-stream'); const stream = require('stream'); @@ -13,7 +14,12 @@ const path = require('path'); const commonmark = require('commonmark'); const mimeTypes = require('mime-types'); +let importNoteCount; +let lastSentCountTs = Date.now(); + async function importTar(fileBuffer, importRootNote) { + importNoteCount = 0; + // maps from original noteId (in tar file) to newly generated noteId const noteIdMap = {}; const attributes = []; @@ -287,7 +293,7 @@ async function importTar(fileBuffer, importRootNote) { } } - /** @return path without leading or trailing slash and backslashes converted to forward ones*/ + /** @return {string} path without leading or trailing slash and backslashes converted to forward ones*/ function normalizeFilePath(filePath) { filePath = filePath.replace(/\\/g, "/"); @@ -314,7 +320,7 @@ async function importTar(fileBuffer, importRootNote) { // call next when you are done with this entry stream.on('end', async function() { - let filePath = normalizeFilePath(header.name); + const filePath = normalizeFilePath(header.name); const content = Buffer.concat(chunks); @@ -331,6 +337,14 @@ async function importTar(fileBuffer, importRootNote) { log.info("Ignoring tar import entry with type " + header.type); } + importNoteCount++; + + if (Date.now() - lastSentCountTs >= 1000) { + lastSentCountTs = Date.now(); + + messagingService.sendMessageToAllClients({ type: 'importNoteCount', count: importNoteCount }); + } + next(); // ready for next entry }); diff --git a/src/services/notes.js b/src/services/notes.js index 2bd780f76..63d22062b 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -397,7 +397,7 @@ async function deleteNote(branch) { } async function cleanupDeletedNotes() { - const cutoffDate = new Date(new Date().getTime() - 48 * 3600 * 1000); + const cutoffDate = new Date(Date.now() - 48 * 3600 * 1000); // it's better to not use repository for this because it will complain about saving protected notes // out of protected session diff --git a/src/services/sync.js b/src/services/sync.js index 802e4ae2e..3f3844228 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -132,7 +132,7 @@ async function pullSync(syncContext) { } log.info("Pulled " + rows.length + " changes from " + changesUri + " in " - + (new Date().getTime() - startDate.getTime()) + "ms"); + + (Date.now() - startDate.getTime()) + "ms"); for (const {sync, entity} of rows) { if (!sourceIdService.isLocalSourceId(sync.sourceId)) { @@ -194,7 +194,7 @@ async function pushSync(syncContext) { entities: syncRecords }); - log.info(`Pushing ${syncRecords.length} syncs in ` + (new Date().getTime() - startDate.getTime()) + "ms"); + log.info(`Pushing ${syncRecords.length} syncs in ` + (Date.now() - startDate.getTime()) + "ms"); lastSyncedPush = syncRecords[syncRecords.length - 1].sync.id; diff --git a/src/services/utils.js b/src/services/utils.js index aff4375e0..a0c9c7fa3 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -58,7 +58,7 @@ async function stopWatch(what, func) { const ret = await func(); - const tookMs = new Date().getTime() - start.getTime(); + const tookMs = Date.now() - start.getTime(); console.log(`${what} took ${tookMs}ms`); diff --git a/src/views/dialogs/import.ejs b/src/views/dialogs/import.ejs index 07ddcf160..ed226724d 100644 --- a/src/views/dialogs/import.ejs +++ b/src/views/dialogs/import.ejs @@ -27,6 +27,10 @@ Trilium .tar export files can contain executable scripts which may contain harmful behavior. Safe import will deactivate automatic execution of all imported scripts. Uncheck "Safe import" only if the imported tar archive is supposed to contain executable scripts and you completely trust the contents of the import file. + +
+ Imported notes: +