{"version":3,"file":"pyret.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/pyret.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};","const CPO = \"https://pyret-horizon.herokuapp.com/editor\";\n\nexport type State = {\n  definitionsAtLastRun: string;\n  interactionsSinceLastRun: string[];\n  editorContents: string;\n  replContents: string;\n  messageNumber?: number;\n};\n\nexport type API = {\n  sendReset: (state: State) => void;\n  currentState: () => State;\n  postMessage: (message: any) => void;\n  getFrame: () => HTMLIFrameElement;\n  setInteractions: (text: string) => void;\n  runDefinitions: () => void;\n  runInteractionResult: () => Promise<any>;\n  onChange: (callback: (msg: any) => void) => void;\n  clearInteractions: () => void;\n};\n\nexport type ReadFileOpts = { encoding?: string } | \"utf8\";\nexport type RPCFunctions = {\n  fs?: {\n    writeFile?: (p: string, buffer: Buffer) => Promise<void>;\n    readFile?: (p: string, opts: ReadFileOpts) => Promise<string | Uint8Array>;\n    stat?: (\n      p: string,\n    ) => Promise<{ mtime: number; ctime: number; size: number; native: any }>;\n    createDir?: (p: string) => Promise<void>;\n  };\n  path?: {\n    join?: (...paths: string[]) => string;\n    resolve?: (p: string) => string;\n    basename?: (p: string) => string;\n    dirname?: (p: string) => string;\n    extname?: (p: string) => string;\n    relative?: (from: string, to: string) => string;\n    \"is-absolute\"?: (p: string) => boolean;\n  };\n  process?: {\n    cwd?: () => string;\n  };\n};\n\nexport type EmbedConfig = {\n  container: HTMLElement;\n  src?: string;\n  id?: string;\n  state?: State;\n  rpc?: RPCFunctions;\n  options: {\n    footerStyle?: \"hide\" | \"normal\";\n    warnOnExit?: boolean;\n    hideDefinitions?: boolean;\n    hideInteractions?: boolean;\n  };\n};\n\nconst defaultOptions = {\n  footerStyle: \"hide\",\n  warnOnExit: false,\n  hideDefinitions: false,\n  hideInteractions: false,\n};\nconst defaultConfig = {\n  src: CPO,\n  state: false,\n  options: defaultOptions,\n};\n\ntype RPCResponse =\n  | { resultType: \"value\"; result: any }\n  | { resultType: \"exception\"; exception: any };\n\nfunction sendRpcResponse(\n  frame: HTMLIFrameElement,\n  data: { callbackId: string },\n  result: RPCResponse,\n) {\n  frame.contentWindow!.postMessage({\n    protocol: \"pyret-rpc\",\n    data: {\n      type: \"rpc-response\",\n      callbackId: data.callbackId,\n      ...result,\n    },\n  });\n}\n\nasync function receiveRPC(\n  frame: HTMLIFrameElement,\n  e: MessageEvent,\n  rpcs: RPCFunctions,\n): Promise<void> {\n  console.log(\"RPC:\", e.data);\n  const data = e.data.data;\n  const module = (rpcs as any)[data.module];\n  if (!(module as any)[data.method]) {\n    sendRpcResponse(frame, data, {\n      resultType: \"exception\",\n      exception: `Unknown method ${data.method}`,\n    });\n  } else {\n    try {\n      const result = await (module as any)[data.method](...data.args);\n      sendRpcResponse(frame, data, { resultType: \"value\", result });\n    } catch (exn) {\n      sendRpcResponse(frame, data, {\n        resultType: \"exception\",\n        exception: String(exn),\n      });\n    }\n    return;\n  }\n}\n\nexport function makeEmbedConfig(config: EmbedConfig): Promise<API> {\n  let mergedConfig = { ...defaultConfig, ...config };\n  let mergedOptions = { ...defaultConfig.options, ...config.options };\n  let { container, src } = mergedConfig;\n  let id = config.id || \"pyret-embed\" + Math.floor(Math.random() * 1000000);\n  const hasprop = (obj, prop) =>\n    Object.prototype.hasOwnProperty.call(obj, prop);\n  console.log(\"Pyret embed config:\", mergedConfig, mergedOptions);\n  const propIfTrue = (obj, prop) => {\n    if (obj[prop] === true) {\n      return `&${prop}=true`;\n    } else {\n      return \"\";\n    }\n  };\n  const propIfPresent = (obj, prop) => {\n    if (hasprop(obj, prop)) {\n      return `&${prop}=${obj[prop]}`;\n    } else {\n      return \"\";\n    }\n  };\n  const fragment = `${propIfPresent(mergedOptions, \"footerStyle\")}${propIfPresent(mergedOptions, \"warnOnExit\")}${propIfTrue(mergedOptions, \"hideDefinitions\")}${propIfTrue(mergedOptions, \"hideInteractions\")}`;\n  if (src.indexOf(\"#\") !== -1) {\n    src = src + \"&\" + fragment;\n  } else {\n    src = src + \"#\" + fragment;\n  }\n\n  let messageNumber = 0;\n  let currentState: State;\n  function sendReset(frame, state) {\n    if (!state) {\n      state = {\n        definitionsAtLastRun: \"\",\n        interactionsSinceLastRun: [],\n        editorContents: \"use context starter2024\",\n        replContents: \"\",\n      };\n    }\n    if (typeof state === \"object\") {\n      state.messageNumber = 0;\n    }\n    currentState = state;\n    const payload = {\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) {\n    frame.contentWindow!.postMessage(\n      {\n        type: \"gainControl\",\n      },\n      \"*\",\n    );\n  }\n\n  function setInteractions(frame: HTMLIFrameElement, text: string) {\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 = {\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) {\n    messageNumber += 1;\n    currentState = {\n      ...currentState,\n      messageNumber,\n      interactionsSinceLastRun: [],\n      definitionsAtLastRun: currentState.editorContents,\n    };\n    const payload = {\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) {\n    messageNumber += 1;\n    const payload = {\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\n  function runInteractionResult(frame: HTMLIFrameElement) {\n    const { promise, resolve, reject } = Promise.withResolvers<any>();\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 = {\n      protocol: \"pyret\",\n      data: {\n        type: \"runInteraction\",\n        reportAnswer: \"interaction\" + ++resultCounter,\n      },\n      state: currentState,\n    };\n    frame.contentWindow!.postMessage(payload, \"*\");\n    window.addEventListener(\"message\", (message) => {\n      if (message.data.protocol !== \"pyret\") {\n        return;\n      }\n      if (message.source !== frame.contentWindow) {\n        return;\n      }\n      const pyretMessage = message.data;\n      if (pyretMessage.data.type === \"interactionResult\") {\n        resolve(pyretMessage.data.textResult);\n      }\n    });\n    return promise;\n  }\n\n  function directPostMessage(frame: HTMLIFrameElement, message: any) {\n    frame.contentWindow.postMessage(message);\n  }\n\n  /* An issue we run into with iframes and scrolling is that CPO wants to scroll\n     interactions around sometimes. However, scrolling elements in the iframe\n     can scroll the outer page as well to focus it. We don't want that.\n     We can prevent this by making the iframe position: fixed, but that makes\n     sensible positioning hard. So we create a wrapper iframe that works in the\n     normal flow, and make the actual CPO iframe inside that.\n\n     Since CPO only knows how to postMessage to its immediate parent, we also\n     proxy all requests through the wrapper, and that's what the client sees.\n  */\n\n  const wrapper = document.createElement(\"iframe\");\n  wrapper.style = \"width: 100%; height: 100%; border: 0; display: block;\";\n\n  wrapper.srcdoc = `\n<html>\n<head>\n<style>\nhtml, body { height: 100%; }\nbody { margin: 0; padding: 0; }\n</style>\n<script>\nwindow.addEventListener('message', (e) => {\n  if (e.source === window.parent) {\n    const iframes = document.getElementsByTagName(\"iframe\");\n    iframes[0].contentWindow.postMessage(e.data, \"*\");\n  }\n  else {\n    window.parent.postMessage(e.data, \"*\");\n  }\n});\n</script>\n<body></body>\n</html>`;\n  container.appendChild(wrapper);\n  wrapper.addEventListener(\"load\", () => {\n    const wrapperBody = wrapper.contentDocument.body;\n\n    const inner = document.createElement(\"iframe\");\n    inner.src = src || CPO;\n    inner.style =\n      \"width: 100%; height: 100%; border: 0; display: block; position: fixed;\";\n    inner.width = \"100%\";\n    inner.id = id;\n    inner.frameBorder = \"0\";\n\n    wrapperBody.appendChild(inner);\n  });\n  const frame = wrapper;\n  frame.id = id;\n\n  const { promise, resolve, reject } = Promise.withResolvers<API>();\n  setTimeout(\n    () => reject(new Error(\"Timeout waiting for Pyret to load\")),\n    60000,\n  );\n\n  const onChangeCallbacks = [];\n\n  window.addEventListener(\"message\", (message) => {\n    if (message.data.protocol === \"pyret-rpc\") {\n      receiveRPC(frame, message, mergedConfig.rpc || {}).catch((exn) => {\n        console.error(\"Error in RPC handler:\", exn);\n      });\n      return;\n    }\n    if (message.data.protocol !== \"pyret\") {\n      return;\n    }\n    if (message.source !== frame.contentWindow) {\n      return;\n    }\n    const pyretMessage = message.data;\n    const typ = pyretMessage.data.type;\n    if (typ === \"pyret-init\") {\n      gainControl(frame);\n      if (mergedConfig.state) {\n        sendReset(frame, mergedConfig.state);\n      }\n      const api = makeEmbedAPI(frame);\n      (frame as any).pyretEmbed = api;\n      resolve(api);\n    } else if (typ === \"changeRepl\" || typ === \"change\") {\n      onChangeCallbacks.forEach((cb) => cb(pyretMessage));\n      currentState = pyretMessage.state;\n    } else {\n      currentState = pyretMessage.state;\n    }\n  });\n  function makeEmbedAPI(frame) {\n    return {\n      sendReset: (state: State) => 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: (msg: any) => void) =>\n        onChangeCallbacks.push(callback),\n      clearInteractions: () => clearInteractions(frame),\n      currentState: () => currentState,\n    };\n  }\n  return promise;\n}\n\nexport function makeEmbed(\n  id: string,\n  container: HTMLElement,\n  src?: string,\n): Promise<API> {\n  const config: EmbedConfig = {\n    container,\n    id,\n    options: {},\n  };\n  if (src) {\n    config.src = src;\n  }\n  return makeEmbedConfig(config);\n}\n"],"names":["Object","e","Symbol","CPO","defaultConfig","sendRpcResponse","frame","data","result","receiveRPC","rpcs","console","module","exn","String","makeEmbedConfig","config","currentState","mergedConfig","mergedOptions","container","src","id","Math","propIfTrue","obj","prop","propIfPresent","fragment","messageNumber","sendReset","state","payload","JSON","resultCounter","wrapper","document","wrapperBody","inner","promise","resolve","reject","Promise","setTimeout","Error","onChangeCallbacks","window","message","pyretMessage","typ","api","text","setInteractions","runDefinitions","runInteractionResult","newInteractions","callback","clearInteractions","cb","makeEmbed"],"mappings":"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"}