handlerBlockPackage.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. export default async function (
  2. { data, id },
  3. { targetHandle: prevTarget, prevBlockData }
  4. ) {
  5. if (!this.engine.packagesCache[id]) {
  6. this.engine.packagesCache[id] = { extracted: false, nodes: {} };
  7. }
  8. const pkgCache = this.engine.packagesCache[id];
  9. const { 1: targetId } = prevTarget.split('input-');
  10. const addBlockPrefix = (itemId) => `${id}__${itemId}`;
  11. const hasCache = pkgCache.nodes[targetId];
  12. if (hasCache)
  13. return {
  14. data: prevBlockData,
  15. nextBlockId: [{ id: hasCache }],
  16. };
  17. const input = data.inputs.find((item) => item.id === targetId);
  18. if (!input) {
  19. throw new Error('Input not found');
  20. }
  21. const block = data.data.nodes.find((node) => node.id === input.blockId);
  22. pkgCache.nodes[targetId] = addBlockPrefix(block.id);
  23. const connections = {};
  24. if (!pkgCache.extracted) {
  25. const outputsMap = new Set();
  26. data.inputs.forEach((item) => {
  27. connections[addBlockPrefix(item.id)] = [
  28. {
  29. id: addBlockPrefix(item.blockId),
  30. targetId: `${addBlockPrefix(block.id)}-input-1`,
  31. },
  32. ];
  33. });
  34. data.outputs.forEach((output) => {
  35. outputsMap.add(output.handleId);
  36. const connection =
  37. this.engine.connectionsMap[`${id}-output-${output.id}`];
  38. if (!connection) return;
  39. connections[addBlockPrefix(output.handleId)] = [...connection.values()];
  40. });
  41. data.data.nodes.forEach((node) => {
  42. const newNodeId = addBlockPrefix(node.id);
  43. this.engine.blocks[newNodeId] = { ...node, id: newNodeId };
  44. });
  45. if (!block) {
  46. throw new Error(`Can't find block for this input`);
  47. }
  48. data.data.edges.forEach(({ sourceHandle, target, targetHandle }) => {
  49. if (outputsMap.has(sourceHandle)) return;
  50. const nodeSourceHandle = addBlockPrefix(sourceHandle);
  51. if (!connections[nodeSourceHandle])
  52. connections[nodeSourceHandle] = new Map();
  53. const connectionId = addBlockPrefix(target);
  54. connections[nodeSourceHandle].set(connectionId, {
  55. id: connectionId,
  56. sourceHandle: nodeSourceHandle,
  57. targetHandle: addBlockPrefix(targetHandle),
  58. });
  59. });
  60. pkgCache.extracted = true;
  61. }
  62. Object.assign(this.engine.connectionsMap, connections);
  63. return {
  64. data: prevBlockData,
  65. nextBlockId: [{ id: addBlockPrefix(block.id) }],
  66. };
  67. }