69 lines
1.8 KiB
JavaScript
69 lines
1.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
"use strict";
|
|
|
|
loader.lazyRequireGetter(
|
|
this,
|
|
"generateUUID",
|
|
"resource://devtools/shared/generate-uuid.js",
|
|
true
|
|
);
|
|
loader.lazyRequireGetter(
|
|
this,
|
|
["entries", "executeSoon", "toObject"],
|
|
"resource://devtools/shared/DevToolsUtils.js",
|
|
true
|
|
);
|
|
|
|
const PROMISE = (exports.PROMISE = "@@dispatch/promise");
|
|
|
|
function promiseMiddleware({ dispatch }) {
|
|
return next => action => {
|
|
if (!(PROMISE in action)) {
|
|
return next(action);
|
|
}
|
|
// Return the promise so action creators can still compose if they
|
|
// want to.
|
|
return new Promise((resolve, reject) => {
|
|
const promiseInst = action[PROMISE];
|
|
const seqId = generateUUID().toString();
|
|
|
|
// Create a new action that doesn't have the promise field and has
|
|
// the `seqId` field that represents the sequence id
|
|
action = Object.assign(
|
|
toObject(entries(action).filter(pair => pair[0] !== PROMISE)),
|
|
{ seqId }
|
|
);
|
|
|
|
dispatch(Object.assign({}, action, { status: "start" }));
|
|
|
|
promiseInst.then(
|
|
value => {
|
|
executeSoon(() => {
|
|
dispatch(
|
|
Object.assign({}, action, {
|
|
status: "done",
|
|
value,
|
|
})
|
|
);
|
|
resolve(value);
|
|
});
|
|
},
|
|
error => {
|
|
executeSoon(() => {
|
|
dispatch(
|
|
Object.assign({}, action, {
|
|
status: "error",
|
|
error: error.message || error,
|
|
})
|
|
);
|
|
reject(error);
|
|
});
|
|
}
|
|
);
|
|
});
|
|
};
|
|
}
|
|
|
|
exports.promise = promiseMiddleware;
|