fix: 'common' version
This commit is contained in:
+6
-5
@@ -234,7 +234,7 @@ async function handlePrimaryButtonClick() {
|
|||||||
|
|
||||||
let [file, buffer] = await filereader().catch(e => alert('(ERROR) ' + new String(e ?? 'Unable to read data')));
|
let [file, buffer] = await filereader().catch(e => alert('(ERROR) ' + new String(e ?? 'Unable to read data')));
|
||||||
writable = await handle.createWritable().catch(() => null);
|
writable = await handle.createWritable().catch(() => null);
|
||||||
major = await Rpc2.invoke('ready', file.name, new Uint8Array(buffer).toBase64());
|
major = await Rpc2.invoke('loads', { params: [file.name, new Uint8Array(buffer).toBase64()] });
|
||||||
$.get('#fileLabel').innerText = file.name;
|
$.get('#fileLabel').innerText = file.name;
|
||||||
$.get('#fromLabel').innerText = parameters.account;
|
$.get('#fromLabel').innerText = parameters.account;
|
||||||
$.all('.columns').forEach(e => e.dispatchEvent(new Event('change')));
|
$.all('.columns').forEach(e => e.dispatchEvent(new Event('change')));
|
||||||
@@ -268,7 +268,7 @@ async function handlePrimaryButtonClick() {
|
|||||||
options.start += $('#offset').valueAsNumber * $('#chunksize').valueAsNumber;
|
options.start += $('#offset').valueAsNumber * $('#chunksize').valueAsNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Rpc2.invoke('begin', options, parameters);
|
await Rpc2.invoke('begin', { params: [options, parameters] });
|
||||||
break;
|
break;
|
||||||
case 'RUNNING':
|
case 'RUNNING':
|
||||||
await Rpc2.invoke('pause');
|
await Rpc2.invoke('pause');
|
||||||
@@ -323,7 +323,7 @@ $.set('#nospam', 'change', (e) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$.set('#region', 'change', async (e) => {
|
$.set('#region', 'change', async (e) => {
|
||||||
unique = await Rpc2.invoke('unique', e.target.value).catch(() => new Object());
|
unique = await Rpc2.invoke('unique', { params: [e.target.value] }).catch(() => new Object());
|
||||||
$('#groupby').dispatchEvent(new Event('change'));
|
$('#groupby').dispatchEvent(new Event('change'));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -402,7 +402,7 @@ for (let element of $.all('.params')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (await new Promise(o => setTimeout(o, 1000, true))) {
|
while (await new Promise(o => setTimeout(o, 1000, true))) {
|
||||||
let history = await Rpc2.invoke('history').catch(() => []);
|
let history = await Rpc2.invoke('logs').catch(() => []);
|
||||||
let logs = Array.from(history);
|
let logs = Array.from(history);
|
||||||
|
|
||||||
for (let record of logs) {
|
for (let record of logs) {
|
||||||
@@ -433,7 +433,7 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
|
|||||||
case 'CLOSING':
|
case 'CLOSING':
|
||||||
if (writable) try {
|
if (writable) try {
|
||||||
$.all('#actions > button').forEach(e => e.disabled = true);
|
$.all('#actions > button').forEach(e => e.disabled = true);
|
||||||
let data = await filereader().then(([_, b]) => Rpc2.invoke('merge', new Uint8Array(b).toBase64()));
|
let data = await filereader().then(([_, b]) => Rpc2.invoke('merge', { params: [new Uint8Array(b).toBase64()] }));
|
||||||
await writable.write(Uint8Array.fromBase64(data));
|
await writable.write(Uint8Array.fromBase64(data));
|
||||||
await writable.close();
|
await writable.close();
|
||||||
await Rpc2.notify('close');
|
await Rpc2.notify('close');
|
||||||
@@ -464,6 +464,7 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
|
|||||||
let rate = done / uptime;
|
let rate = done / uptime;
|
||||||
let remaining = rate > 0 ? Math.floor((total - count) / rate) : 0;
|
let remaining = rate > 0 ? Math.floor((total - count) / rate) : 0;
|
||||||
$('#remainingLabel').innerText = remaining > 0 ? `${Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en')} (${(rate * 60).toFixed(2)}/min)` : '';
|
$('#remainingLabel').innerText = remaining > 0 ? `${Temporal.Duration.from({ seconds: remaining }).round({ largestUnit: 'hours' }).toLocaleString('en')} (${(rate * 60).toFixed(2)}/min)` : '';
|
||||||
|
await Rpc2.notify('acknowledge');
|
||||||
break;
|
break;
|
||||||
case 'STANDBY':
|
case 'STANDBY':
|
||||||
$('#send > span.text').innerText = 'Resume';
|
$('#send > span.text').innerText = 'Resume';
|
||||||
|
|||||||
@@ -99,10 +99,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
sp.set('begin', begin)
|
sp.add(begin, pause, resume, unique)
|
||||||
sp.set('pause', pause)
|
|
||||||
sp.set('resume', resume)
|
|
||||||
sp.set('unique', unique)
|
|
||||||
sp.set('status', lambda: status.name)
|
sp.set('status', lambda: status.name)
|
||||||
sp.set('uptime', lambda: timer.delta())
|
sp.set('uptime', lambda: timer.delta())
|
||||||
|
|
||||||
@@ -237,26 +234,29 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
cls.timer.clear()
|
cls.timer.clear()
|
||||||
cls.timer.start()
|
cls.timer.start()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def perform(cls):
|
def perform(cls):
|
||||||
if cls.timer.delta() > parameters['timeout']: raise cls
|
if cls.timer.delta() > parameters['timeout']: raise cls
|
||||||
sleep(0.2); return True
|
sleep(0.2); return True
|
||||||
|
|
||||||
|
class Acknowledge(Action):
|
||||||
|
@classmethod
|
||||||
|
def prepare(cls):
|
||||||
|
return status == Status.RUNNING
|
||||||
|
|
||||||
class Cancel(Action):
|
class Cancel(Action):
|
||||||
@classmethod
|
@classmethod
|
||||||
def prepare(cls):
|
def prepare(cls):
|
||||||
nonlocal status
|
nonlocal status
|
||||||
status = Status.RUNNING
|
status = Status.RUNNING
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def perform(cls):
|
def perform(cls):
|
||||||
nonlocal status
|
|
||||||
status = Status.READY
|
|
||||||
driver.switch_to.window(driver.window_handles[0])
|
driver.switch_to.window(driver.window_handles[0])
|
||||||
raise cls
|
raise cls
|
||||||
|
|
||||||
class Close(Action):
|
class Close(Action):
|
||||||
@classmethod
|
@classmethod
|
||||||
def prepare(cls):
|
def prepare(cls):
|
||||||
@@ -266,23 +266,16 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def prepare(cls):
|
def prepare(cls):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def perform(cls):
|
def perform(cls):
|
||||||
driver.switch_to.window(driver.current_window_handle)
|
driver.switch_to.window(driver.current_window_handle)
|
||||||
raise cls
|
raise cls
|
||||||
|
|
||||||
flow = ActionFlow()
|
flow = ActionFlow()
|
||||||
flow.append(Wait)
|
flow.stage(Wait, Acknowledge, Timeout, Cancel, Close, Skip)
|
||||||
flow.append(Timeout)
|
sp.add(pairs=[ (k.lower(), v) for k, v in flow ])
|
||||||
flow.append(Cancel)
|
|
||||||
flow.append(Close)
|
|
||||||
flow.append(Skip)
|
|
||||||
|
|
||||||
sp.set('actions', lambda: flow.capabilities())
|
sp.set('actions', lambda: flow.capabilities())
|
||||||
sp.set('cancel', lambda: flow.queue(Cancel))
|
|
||||||
sp.set('close', lambda: flow.queue(Close))
|
|
||||||
sp.set('skip', lambda: flow.queue(Skip))
|
|
||||||
|
|
||||||
def loads(name: str, b64: str):
|
def loads(name: str, b64: str):
|
||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
@@ -307,7 +300,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
flow.allow(Cancel)
|
flow.allow(Cancel)
|
||||||
status = Status.READY
|
status = Status.READY
|
||||||
return limit
|
return limit
|
||||||
|
|
||||||
def merge(b64: str):
|
def merge(b64: str):
|
||||||
from base64 import b64decode, b64encode
|
from base64 import b64decode, b64encode
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
@@ -317,7 +310,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
index = headers.index(column.sent)
|
index = headers.index(column.sent)
|
||||||
buffer = BytesIO(data)
|
buffer = BytesIO(data)
|
||||||
target = load_workbook(buffer)
|
target = load_workbook(buffer)
|
||||||
|
|
||||||
for row in range(options.get('start'), limit + 1):
|
for row in range(options.get('start'), limit + 1):
|
||||||
c1 = wb.active.cell(row, index + 1)
|
c1 = wb.active.cell(row, index + 1)
|
||||||
c2 = target.active.cell(row, index + 1)
|
c2 = target.active.cell(row, index + 1)
|
||||||
@@ -330,8 +323,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
result = b64encode(io.getbuffer()).decode('ascii')
|
result = b64encode(io.getbuffer()).decode('ascii')
|
||||||
return result
|
return result
|
||||||
|
|
||||||
sp.set('ready', loads)
|
sp.add(loads, merge)
|
||||||
sp.set('merge', merge)
|
|
||||||
sp.set('progress', lambda: progress)
|
sp.set('progress', lambda: progress)
|
||||||
|
|
||||||
def save():
|
def save():
|
||||||
@@ -382,10 +374,10 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
driver.switch_to.window(driver.window_handles[0])
|
driver.switch_to.window(driver.window_handles[0])
|
||||||
continue
|
continue
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error('Error while loading data', exc_info=e)
|
|
||||||
status = Status.IDLE
|
status = Status.IDLE
|
||||||
|
logger.error('Error while loading data', exc_info=e)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
index = 2
|
index = 2
|
||||||
attempts = 0
|
attempts = 0
|
||||||
tz = ZoneInfo(locale.timezone)
|
tz = ZoneInfo(locale.timezone)
|
||||||
@@ -439,8 +431,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
logger.debug('Unable to close off email compose windows', exc_info=e)
|
logger.debug('Unable to close off email compose windows', exc_info=e)
|
||||||
break
|
break
|
||||||
|
|
||||||
flow.allow(Cancel)
|
flow.allow(Skip, Cancel)
|
||||||
flow.allow(Skip)
|
|
||||||
flow.react(Wait)
|
flow.react(Wait)
|
||||||
progress['email'] = str(email)
|
progress['email'] = str(email)
|
||||||
logger.info('[%d/%d] Sending to %s', index-1, limit-1, email)
|
logger.info('[%d/%d] Sending to %s', index-1, limit-1, email)
|
||||||
@@ -522,7 +513,6 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
flow.react(Wait)
|
flow.react(Wait)
|
||||||
click("div.io-ox-mail-compose-window button[data-action='send']")
|
click("div.io-ox-mail-compose-window button[data-action='send']")
|
||||||
except Cancel:
|
except Cancel:
|
||||||
status = Status.IDLE
|
|
||||||
break
|
break
|
||||||
except (Next, Skip) as e:
|
except (Next, Skip) as e:
|
||||||
progress[e.__class__.__name__.lower()] += 1
|
progress[e.__class__.__name__.lower()] += 1
|
||||||
@@ -554,11 +544,21 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
status = Status.STANDBY
|
status = Status.STANDBY
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
logger.info('Waiting for client to acknowledge...')
|
||||||
|
flow.deter(Cancel, Skip, Wait)
|
||||||
|
flow.allow(Acknowledge)
|
||||||
|
flow.react(Timeout)
|
||||||
|
except Acknowledge:
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
logger.error('RPC communication failed', exc_info=e)
|
||||||
|
sp.pop('exit')()
|
||||||
|
|
||||||
if options.get('writable'):
|
if options.get('writable'):
|
||||||
try:
|
try:
|
||||||
logger.info('Saving document...')
|
logger.info('Saving document...')
|
||||||
status = Status.CLOSING
|
status = Status.CLOSING
|
||||||
flow.allow(Wait, False)
|
|
||||||
flow.allow(Close)
|
flow.allow(Close)
|
||||||
flow.react(Timeout)
|
flow.react(Timeout)
|
||||||
except Close:
|
except Close:
|
||||||
@@ -567,10 +567,7 @@ def main(driver: Chrome, logger = logging.getLogger('main')):
|
|||||||
logger.warning('RPC communication failed', exc_info=e)
|
logger.warning('RPC communication failed', exc_info=e)
|
||||||
save()
|
save()
|
||||||
|
|
||||||
flow.allow(Timeout, False)
|
flow.deter(Acknowledge, Timeout, Close)
|
||||||
flow.allow(Close, False)
|
|
||||||
flow.allow(Cancel, False)
|
|
||||||
flow.allow(Skip, False)
|
|
||||||
driver.switch_to.window(driver.window_handles[0])
|
driver.switch_to.window(driver.window_handles[0])
|
||||||
status = Status.IDLE
|
status = Status.IDLE
|
||||||
logger.info('Done')
|
logger.info('Done')
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user