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 67c062fc2b..29e4cb3a9d 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 62ee07bf7b..a7444b3766 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 fd98aef671..b95a8c8d05 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 3f24b7f414..1ea87e495f 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 fc24a0ef17..208fbc8a50 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 d887ad1ef0..f9981c9a2e 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 d6f6580441..bc792ccab6 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 2bd780f766..63d22062bb 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 802e4ae2e5..3f38442289 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 aff4375e06..a0c9c7fa34 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 07ddcf1606..ed226724d5 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: +