{"version":3,"file":"api.cjs","sources":["webpack://@ironm00n/pyret-embed/webpack/runtime/define_property_getters","webpack://@ironm00n/pyret-embed/webpack/runtime/has_own_property","webpack://@ironm00n/pyret-embed/webpack/runtime/make_namespace_object","webpack://@ironm00n/pyret-embed/./src/api.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n        if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n            Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n        }\n    }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","interface PyretState {\n  definitionsAtLastRun: string;\n  interactionsSinceLastRun: string[];\n  editorContents: string;\n  replContents: string;\n  messageNumber?: number;\n}\n\ninterface PyretMessage {\n  protocol: \"pyret\";\n  data: {\n    type: string;\n    state?: string | PyretState;\n    change?: {\n      from: { line: number; ch: number };\n      to: { line: number; ch: number };\n      text: string;\n    };\n    reportAnswer?: string;\n    textResult?: string;\n  };\n  state?: PyretState;\n}\n\ninterface EmbedAPI {\n  sendReset: (state?: PyretState) => void;\n  postMessage: (message: any) => void;\n  getFrame: () => HTMLIFrameElement;\n  setInteractions: (text: string) => void;\n  runDefinitions: () => void;\n  runInteractionResult: () => Promise<string>;\n  onChange: (callback: (message: PyretMessage) => void) => void;\n  clearInteractions: () => void;\n}\n\nconst CPO =\n  \"https://pyret-horizon.herokuapp.com/editor#controlled=true&footerStyle=hide&warnOnExit=false\";\n\nfunction makeEmbed(\n  id: string,\n  container: HTMLElement,\n  src?: string,\n): Promise<EmbedAPI> {\n  let messageNumber = 0;\n  let currentState: PyretState;\n\n  function sendReset(frame: HTMLIFrameElement, state?: PyretState): void {\n    if (!state) {\n      state = {\n        definitionsAtLastRun: \"\",\n        interactionsSinceLastRun: [],\n        editorContents: \"use context starter2024\",\n        replContents: \"\",\n      };\n    }\n    state.messageNumber = 0;\n    currentState = state;\n    const payload: PyretMessage = {\n      data: {\n        type: \"reset\",\n        state: typeof state === \"string\" ? state : JSON.stringify(state),\n      },\n      protocol: \"pyret\",\n    };\n    frame.contentWindow?.postMessage(payload, \"*\");\n  }\n\n  function gainControl(frame: HTMLIFrameElement): void {\n    frame.contentWindow?.postMessage(\n      {\n        type: \"gainControl\",\n      },\n      \"*\",\n    );\n  }\n\n  function setInteractions(frame: HTMLIFrameElement, text: string): void {\n    messageNumber += 1;\n    const change = {\n      from: { line: 0, ch: 0 },\n      to: { line: 0, ch: 0 },\n      text: text,\n    };\n    currentState = { ...currentState, messageNumber, replContents: text };\n    const payload: PyretMessage = {\n      protocol: \"pyret\",\n      data: {\n        type: \"changeRepl\",\n        change: change,\n      },\n      state: currentState,\n    };\n    frame.contentWindow?.postMessage(payload, \"*\");\n  }\n\n  function runDefinitions(frame: HTMLIFrameElement): void {\n    messageNumber += 1;\n    currentState = {\n      ...currentState,\n      messageNumber,\n      interactionsSinceLastRun: [],\n      definitionsAtLastRun: currentState.editorContents,\n    };\n    const payload: PyretMessage = {\n      protocol: \"pyret\",\n      data: {\n        type: \"run\",\n      },\n      state: currentState,\n    };\n    frame.contentWindow?.postMessage(payload, \"*\");\n  }\n\n  function clearInteractions(frame: HTMLIFrameElement): void {\n    messageNumber += 1;\n    const payload: PyretMessage = {\n      protocol: \"pyret\",\n      data: {\n        type: \"clearInteractions\",\n      },\n      state: currentState,\n    };\n    frame.contentWindow?.postMessage(payload, \"*\");\n  }\n\n  let resultCounter = 0;\n  function runInteractionResult(frame: HTMLIFrameElement): Promise<string> {\n    const { promise, resolve, reject } = Promise.withResolvers<string>();\n    messageNumber += 1;\n    const newInteractions = currentState.interactionsSinceLastRun.concat([\n      currentState.replContents,\n    ]);\n    currentState = {\n      ...currentState,\n      messageNumber: messageNumber,\n      interactionsSinceLastRun: newInteractions,\n      replContents: \"\",\n    };\n    const payload: PyretMessage = {\n      protocol: \"pyret\",\n      data: {\n        type: \"runInteraction\",\n        reportAnswer: \"interaction\" + ++resultCounter,\n      },\n      state: currentState,\n    };\n    frame.contentWindow?.postMessage(payload, \"*\");\n\n    const messageHandler = (message: MessageEvent) => {\n      if (message.data.protocol !== \"pyret\") {\n        return;\n      }\n      if (message.source !== frame.contentWindow) {\n        return;\n      }\n      const pyretMessage: PyretMessage = message.data;\n      if (pyretMessage.data.type === \"interactionResult\") {\n        window.removeEventListener(\"message\", messageHandler);\n        resolve(pyretMessage.data.textResult || \"\");\n      }\n    };\n\n    window.addEventListener(\"message\", messageHandler);\n    return promise;\n  }\n\n  function directPostMessage(frame: HTMLIFrameElement, message: any): void {\n    frame.contentWindow?.postMessage(message);\n  }\n\n  const frame = document.createElement(\"iframe\");\n  frame.id = id;\n  frame.src = src || CPO;\n  frame.style.cssText = \"width: 100%; height: 100%; border: 0; display: block;\";\n  frame.width = \"100\";\n  frame.setAttribute(\"frameBorder\", \"0\");\n  container.appendChild(frame);\n\n  const { promise, resolve, reject } = Promise.withResolvers<EmbedAPI>();\n  setTimeout(\n    () => reject(new Error(\"Timeout waiting for Pyret to load\")),\n    60000,\n  );\n\n  const onChangeCallbacks: Array<(message: PyretMessage) => void> = [];\n\n  const mainMessageHandler = (message: MessageEvent) => {\n    if (message.data.protocol !== \"pyret\") {\n      return;\n    }\n    if (message.source !== frame.contentWindow) {\n      return;\n    }\n    const pyretMessage: PyretMessage = message.data;\n    const typ = pyretMessage.data.type;\n\n    if (typ === \"pyret-init\") {\n      console.log(\"Sending gainControl\", pyretMessage);\n      gainControl(frame);\n      resolve(makeEmbedAPI(frame));\n    } else if (typ === \"changeRepl\" || typ === \"change\") {\n      onChangeCallbacks.forEach((cb) => cb(pyretMessage));\n      if (pyretMessage.state) {\n        currentState = pyretMessage.state as PyretState;\n      }\n    } else if (pyretMessage.state) {\n      currentState = pyretMessage.state as PyretState;\n    }\n  };\n\n  window.addEventListener(\"message\", mainMessageHandler);\n\n  function makeEmbedAPI(frame: HTMLIFrameElement): EmbedAPI {\n    return {\n      sendReset: (state?: PyretState) => sendReset(frame, state),\n      postMessage: (message: any) => directPostMessage(frame, message),\n      getFrame: () => frame,\n      setInteractions: (text: string) => setInteractions(frame, text),\n      runDefinitions: () => runDefinitions(frame),\n      runInteractionResult: async () => await runInteractionResult(frame),\n      onChange: (callback: (message: PyretMessage) => void) =>\n        onChangeCallbacks.push(callback),\n      clearInteractions: () => clearInteractions(frame),\n    };\n  }\n\n  return promise;\n}\n\nexport { makeEmbed, type EmbedAPI, type PyretState, type PyretMessage };\n"],"names":["e","Object","Symbol","makeEmbed","id","container","src","currentState","messageNumber","resultCounter","frame","document","promise","resolve","reject","Promise","setTimeout","Error","onChangeCallbacks","window","message","pyretMessage","typ","console","state","sendReset","payload","JSON","text","setInteractions","runDefinitions","runInteractionResult","newInteractions","messageHandler","callback","clearInteractions","cb"],"mappings":"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"}