123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // Subs
- const channels = require('../channels')
- const map = new Map()
- function get (id, context) {
- return map.get(id)
- }
- function set (data, context) {
- const { id } = data
- let progress = get(id, context)
- if (!progress) {
- progress = data
- map.set(id, Object.assign({}, {
- status: null,
- error: null,
- info: null,
- args: null,
- progress: -1
- }, progress))
- } else {
- Object.assign(progress, data)
- }
- context.pubsub.publish(channels.PROGRESS_CHANGED, { progressChanged: progress })
- return progress
- }
- function remove (id, context) {
- context.pubsub.publish(channels.PROGRESS_REMOVED, { progressRemoved: id })
- return map.delete(id)
- }
- async function wrap (id, context, operation) {
- set({ id }, context)
- let result
- try {
- result = await operation(data => {
- set(Object.assign({ id }, data), context)
- })
- } catch (error) {
- console.error(error)
- set({ id, error: error.message }, context)
- }
- remove(id, context)
- return result
- }
- module.exports = {
- get,
- set,
- remove,
- wrap
- }
|