diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f39c7b5 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +DATABASE_URL=postgres://postgres:postgres@localhost:5432/test \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index f0d2429..fd0ac9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1685,6 +1685,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_derive" version = "1.0.160" @@ -2409,6 +2420,7 @@ dependencies = [ "console_error_panic_hook", "js-sys", "serde", + "serde-wasm-bindgen", "serde_derive", "serde_json", "wasm-bindgen", diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..46c747f --- /dev/null +++ b/Readme.md @@ -0,0 +1,90 @@ +# rust-wasm + +这是一个简单的示例,展示了如何使用 Rust 和 WebAssembly 一起构建 Web 应用程序。 + +## 安装 + +你需要安装 Rust 开发工具。你可以通过运行以下命令来完成: + +```sh +curl https://sh.rustup.rs -sSf | sh +``` + +## 运行数据库 + +```sh +cd db +docker-compose up -d +``` + +现在你通过 `localhost:5432` 上访问数据库,用户名为 `postgres`,密码为 `postgres`。 + +你还可以在浏览器上访问 `localhost:8081`,用户名为 `postgres`,密码为 `postgres`。 + +## 运行 webservice 和 webapp + +首先,你应该设置 `DATABASE_URL` 环境变量,包含数据库凭据,如下所示:`postgres://postgres:postgres@localhost:5432/postgres` +,放在项目根目录的 .env 文件中。 + +其次,你应该设置 `HOST_PORT` 环境变量,包含主机机器的 IP 地址和端口,如下所示:`http://localhost:8080`,放在 webapp 根目录的 +.env 文件中。 + +要运行 webservice,你可以运行: + +```sh +cd webservice +cargo run +``` + +现在你可以打开另一个终端并运行 webapp。要运行 webapp,你可以运行: + +```sh +cd webapp +cargo run +``` + +## 运行 WebAssembly + +要运行 WebAssembly,首先你需要安装 `wasm-pack` 工具: + +```sh +cargo install wasm-pack +``` + +然后,你可以运行以下命令: + +```sh +cd wasm-client +wasm-pack build +``` + +安装 npm 依赖: + +```sh +cd wasm-client/www +npm install +``` + +运行 WebAssembly 应用: + +```sh +npm run start +``` + +## 构建 + +构建 webservices 和 webapp: + +```sh +cargo build --bin teacher-service --release +cargo build --bin svr --release +``` + +构建 WebAssembly 应用: + +```sh +cd wasm-pack +wasm-pack build --release +cd www +npm run build +``` diff --git a/build/dist/0.bootstrap.js b/build/dist/0.bootstrap.js new file mode 100644 index 0000000..656a73b --- /dev/null +++ b/build/dist/0.bootstrap.js @@ -0,0 +1,72 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],{ + +/***/ "../pkg/wasm_client.js": +/*!*****************************!*\ + !*** ../pkg/wasm_client.js ***! + \*****************************/ +/*! exports provided: __wbg_set_wasm, greet, main, add_course, __wbindgen_object_drop_ref, __wbindgen_json_serialize, __wbg_alert_4ae9046a7b381592, __wbg_confirm_32a42ee18f5f89fc, __wbg_log_5b41f0cd6a54e579, __wbindgen_string_get, __wbindgen_cb_drop, __wbindgen_string_new, __wbindgen_is_object, __wbindgen_is_undefined, __wbindgen_in, __wbindgen_error_new, __wbindgen_jsval_loose_eq, __wbindgen_boolean_get, __wbindgen_number_get, __wbindgen_object_clone_ref, __wbg_getwithrefkey_15c62c2b8546208d, __wbg_instanceof_Window_e266f02eee43b570, __wbg_document_950215a728589a2d, __wbg_location_797a1856892cc2de, __wbg_fetch_465e8cb61a0f43ea, __wbg_createElement_e2a0e21263eb5416, __wbg_getElementById_eb93a47327bb5585, __wbg_instanceof_Response_fb3a4df648c1859b, __wbg_json_b9414eb18cb751d0, __wbg_headers_ab5251d2727ac41e, __wbg_newwithstrandinit_c45f0dc6da26fd03, __wbg_addEventListener_615d4590d38da1c9, __wbg_setAttribute_79c9562d32d05e66, __wbg_settextContent_19dc6a6146112f16, __wbg_appendChild_b8199dc1655c852d, __wbg_reload_cab7edb34a2ce684, __wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb, __wbg_set_a5d34c36a1a4ebd1, __wbg_get_27fe3dac1c4d0224, __wbg_length_e498fbc24f9c1d4f, __wbindgen_is_function, __wbg_newnoargs_2b8b6bd7753c76ba, __wbg_next_b7d530c04fd8b217, __wbg_next_88560ec06a094dea, __wbg_done_1ebec03bbd919843, __wbg_value_6ac8da5cc5b3efda, __wbg_iterator_55f114446221aa5a, __wbg_get_baf4855f9a986186, __wbg_call_95d1ea488d03e4e8, __wbg_new_f9876326328f45ed, __wbg_self_e7c1f827057f6584, __wbg_window_a09ec664e14b1b81, __wbg_globalThis_87cbb8506fecf3a9, __wbg_global_c85a9259e621f3db, __wbg_isArray_39d28997bf6b96b4, __wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065, __wbg_call_9495de66fdbe016b, __wbg_isSafeInteger_8c4789029e885159, __wbg_new_9d3a9ce4282a18a8, __wbg_resolve_fd40f858d9db1a04, __wbg_then_ec5db6d509eb475f, __wbg_then_f753623316e2873a, __wbg_buffer_cf65c07de34b9a08, __wbg_new_537b7341ce90bb31, __wbg_set_17499e8aa4003ebd, __wbg_length_27a2afe8ab42b09f, __wbg_instanceof_Uint8Array_01cebe79ca606cca, __wbg_set_6aa458a4ebdb65cb, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_memory, __wbindgen_closure_wrapper178, __wbindgen_closure_wrapper661 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _wasm_client_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wasm_client_bg.wasm */ \"../pkg/wasm_client_bg.wasm\");\n/* harmony import */ var _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wasm_client_bg.js */ \"../pkg/wasm_client_bg.js\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_wasm\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_set_wasm\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"greet\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"greet\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"main\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"add_course\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"add_course\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_drop_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_json_serialize\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_alert_4ae9046a7b381592\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_alert_4ae9046a7b381592\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_confirm_32a42ee18f5f89fc\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_confirm_32a42ee18f5f89fc\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_log_5b41f0cd6a54e579\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_log_5b41f0cd6a54e579\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_drop\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_cb_drop\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_string_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_object\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_object\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_undefined\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_in\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_in\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_error_new\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_error_new\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_jsval_loose_eq\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_jsval_loose_eq\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_boolean_get\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_boolean_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_number_get\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_object_clone_ref\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getwithrefkey_15c62c2b8546208d\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_getwithrefkey_15c62c2b8546208d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_e266f02eee43b570\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_Window_e266f02eee43b570\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_950215a728589a2d\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_document_950215a728589a2d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_location_797a1856892cc2de\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_location_797a1856892cc2de\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_fetch_465e8cb61a0f43ea\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_fetch_465e8cb61a0f43ea\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_e2a0e21263eb5416\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_createElement_e2a0e21263eb5416\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getElementById_eb93a47327bb5585\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_getElementById_eb93a47327bb5585\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Response_fb3a4df648c1859b\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_Response_fb3a4df648c1859b\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_json_b9414eb18cb751d0\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_json_b9414eb18cb751d0\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_headers_ab5251d2727ac41e\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_headers_ab5251d2727ac41e\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newwithstrandinit_c45f0dc6da26fd03\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_newwithstrandinit_c45f0dc6da26fd03\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_addEventListener_615d4590d38da1c9\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_addEventListener_615d4590d38da1c9\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setAttribute_79c9562d32d05e66\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_setAttribute_79c9562d32d05e66\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_settextContent_19dc6a6146112f16\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_settextContent_19dc6a6146112f16\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_b8199dc1655c852d\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_appendChild_b8199dc1655c852d\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_reload_cab7edb34a2ce684\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_reload_cab7edb34a2ce684\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_a5d34c36a1a4ebd1\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_set_a5d34c36a1a4ebd1\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_get_27fe3dac1c4d0224\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_get_27fe3dac1c4d0224\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_length_e498fbc24f9c1d4f\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_length_e498fbc24f9c1d4f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_function\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_is_function\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_2b8b6bd7753c76ba\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_newnoargs_2b8b6bd7753c76ba\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_next_b7d530c04fd8b217\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_next_b7d530c04fd8b217\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_next_88560ec06a094dea\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_next_88560ec06a094dea\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_done_1ebec03bbd919843\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_done_1ebec03bbd919843\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_value_6ac8da5cc5b3efda\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_value_6ac8da5cc5b3efda\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_iterator_55f114446221aa5a\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_iterator_55f114446221aa5a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_get_baf4855f9a986186\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_get_baf4855f9a986186\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_95d1ea488d03e4e8\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_95d1ea488d03e4e8\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_f9876326328f45ed\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_new_f9876326328f45ed\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_e7c1f827057f6584\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_self_e7c1f827057f6584\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_a09ec664e14b1b81\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_window_a09ec664e14b1b81\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_87cbb8506fecf3a9\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_globalThis_87cbb8506fecf3a9\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_c85a9259e621f3db\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_global_c85a9259e621f3db\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_isArray_39d28997bf6b96b4\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_isArray_39d28997bf6b96b4\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_9495de66fdbe016b\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_call_9495de66fdbe016b\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_isSafeInteger_8c4789029e885159\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_isSafeInteger_8c4789029e885159\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_9d3a9ce4282a18a8\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_new_9d3a9ce4282a18a8\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_resolve_fd40f858d9db1a04\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_resolve_fd40f858d9db1a04\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_then_ec5db6d509eb475f\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_then_ec5db6d509eb475f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_then_f753623316e2873a\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_then_f753623316e2873a\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_buffer_cf65c07de34b9a08\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_buffer_cf65c07de34b9a08\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_537b7341ce90bb31\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_new_537b7341ce90bb31\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_17499e8aa4003ebd\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_set_17499e8aa4003ebd\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_length_27a2afe8ab42b09f\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_length_27a2afe8ab42b09f\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Uint8Array_01cebe79ca606cca\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_instanceof_Uint8Array_01cebe79ca606cca\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_6aa458a4ebdb65cb\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_set_6aa458a4ebdb65cb\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_debug_string\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_throw\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_rethrow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_memory\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_memory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper178\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper178\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper661\", function() { return _wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbindgen_closure_wrapper661\"]; });\n\n\n\nObject(_wasm_client_bg_js__WEBPACK_IMPORTED_MODULE_1__[\"__wbg_set_wasm\"])(_wasm_client_bg_wasm__WEBPACK_IMPORTED_MODULE_0__);\n\n\n_wasm_client_bg_wasm__WEBPACK_IMPORTED_MODULE_0__[\"__wbindgen_start\"]();\n\n\n//# sourceURL=webpack:///../pkg/wasm_client.js?"); + +/***/ }), + +/***/ "../pkg/wasm_client_bg.js": +/*!********************************!*\ + !*** ../pkg/wasm_client_bg.js ***! + \********************************/ +/*! exports provided: __wbg_set_wasm, greet, main, add_course, __wbindgen_object_drop_ref, __wbindgen_json_serialize, __wbg_alert_4ae9046a7b381592, __wbg_confirm_32a42ee18f5f89fc, __wbg_log_5b41f0cd6a54e579, __wbindgen_string_get, __wbindgen_cb_drop, __wbindgen_string_new, __wbindgen_is_object, __wbindgen_is_undefined, __wbindgen_in, __wbindgen_error_new, __wbindgen_jsval_loose_eq, __wbindgen_boolean_get, __wbindgen_number_get, __wbindgen_object_clone_ref, __wbg_getwithrefkey_15c62c2b8546208d, __wbg_instanceof_Window_e266f02eee43b570, __wbg_document_950215a728589a2d, __wbg_location_797a1856892cc2de, __wbg_fetch_465e8cb61a0f43ea, __wbg_createElement_e2a0e21263eb5416, __wbg_getElementById_eb93a47327bb5585, __wbg_instanceof_Response_fb3a4df648c1859b, __wbg_json_b9414eb18cb751d0, __wbg_headers_ab5251d2727ac41e, __wbg_newwithstrandinit_c45f0dc6da26fd03, __wbg_addEventListener_615d4590d38da1c9, __wbg_setAttribute_79c9562d32d05e66, __wbg_settextContent_19dc6a6146112f16, __wbg_appendChild_b8199dc1655c852d, __wbg_reload_cab7edb34a2ce684, __wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb, __wbg_set_a5d34c36a1a4ebd1, __wbg_get_27fe3dac1c4d0224, __wbg_length_e498fbc24f9c1d4f, __wbindgen_is_function, __wbg_newnoargs_2b8b6bd7753c76ba, __wbg_next_b7d530c04fd8b217, __wbg_next_88560ec06a094dea, __wbg_done_1ebec03bbd919843, __wbg_value_6ac8da5cc5b3efda, __wbg_iterator_55f114446221aa5a, __wbg_get_baf4855f9a986186, __wbg_call_95d1ea488d03e4e8, __wbg_new_f9876326328f45ed, __wbg_self_e7c1f827057f6584, __wbg_window_a09ec664e14b1b81, __wbg_globalThis_87cbb8506fecf3a9, __wbg_global_c85a9259e621f3db, __wbg_isArray_39d28997bf6b96b4, __wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065, __wbg_call_9495de66fdbe016b, __wbg_isSafeInteger_8c4789029e885159, __wbg_new_9d3a9ce4282a18a8, __wbg_resolve_fd40f858d9db1a04, __wbg_then_ec5db6d509eb475f, __wbg_then_f753623316e2873a, __wbg_buffer_cf65c07de34b9a08, __wbg_new_537b7341ce90bb31, __wbg_set_17499e8aa4003ebd, __wbg_length_27a2afe8ab42b09f, __wbg_instanceof_Uint8Array_01cebe79ca606cca, __wbg_set_6aa458a4ebdb65cb, __wbindgen_debug_string, __wbindgen_throw, __wbindgen_rethrow, __wbindgen_memory, __wbindgen_closure_wrapper178, __wbindgen_closure_wrapper661 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(module, global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_wasm\", function() { return __wbg_set_wasm; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"greet\", function() { return greet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"main\", function() { return main; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"add_course\", function() { return add_course; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_drop_ref\", function() { return __wbindgen_object_drop_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_json_serialize\", function() { return __wbindgen_json_serialize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_alert_4ae9046a7b381592\", function() { return __wbg_alert_4ae9046a7b381592; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_confirm_32a42ee18f5f89fc\", function() { return __wbg_confirm_32a42ee18f5f89fc; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_log_5b41f0cd6a54e579\", function() { return __wbg_log_5b41f0cd6a54e579; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_get\", function() { return __wbindgen_string_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_cb_drop\", function() { return __wbindgen_cb_drop; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_string_new\", function() { return __wbindgen_string_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_object\", function() { return __wbindgen_is_object; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_undefined\", function() { return __wbindgen_is_undefined; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_in\", function() { return __wbindgen_in; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_error_new\", function() { return __wbindgen_error_new; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_jsval_loose_eq\", function() { return __wbindgen_jsval_loose_eq; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_boolean_get\", function() { return __wbindgen_boolean_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_number_get\", function() { return __wbindgen_number_get; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_object_clone_ref\", function() { return __wbindgen_object_clone_ref; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getwithrefkey_15c62c2b8546208d\", function() { return __wbg_getwithrefkey_15c62c2b8546208d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Window_e266f02eee43b570\", function() { return __wbg_instanceof_Window_e266f02eee43b570; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_document_950215a728589a2d\", function() { return __wbg_document_950215a728589a2d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_location_797a1856892cc2de\", function() { return __wbg_location_797a1856892cc2de; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_fetch_465e8cb61a0f43ea\", function() { return __wbg_fetch_465e8cb61a0f43ea; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_createElement_e2a0e21263eb5416\", function() { return __wbg_createElement_e2a0e21263eb5416; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_getElementById_eb93a47327bb5585\", function() { return __wbg_getElementById_eb93a47327bb5585; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Response_fb3a4df648c1859b\", function() { return __wbg_instanceof_Response_fb3a4df648c1859b; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_json_b9414eb18cb751d0\", function() { return __wbg_json_b9414eb18cb751d0; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_headers_ab5251d2727ac41e\", function() { return __wbg_headers_ab5251d2727ac41e; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newwithstrandinit_c45f0dc6da26fd03\", function() { return __wbg_newwithstrandinit_c45f0dc6da26fd03; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_addEventListener_615d4590d38da1c9\", function() { return __wbg_addEventListener_615d4590d38da1c9; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_setAttribute_79c9562d32d05e66\", function() { return __wbg_setAttribute_79c9562d32d05e66; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_settextContent_19dc6a6146112f16\", function() { return __wbg_settextContent_19dc6a6146112f16; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_appendChild_b8199dc1655c852d\", function() { return __wbg_appendChild_b8199dc1655c852d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_reload_cab7edb34a2ce684\", function() { return __wbg_reload_cab7edb34a2ce684; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb\", function() { return __wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_a5d34c36a1a4ebd1\", function() { return __wbg_set_a5d34c36a1a4ebd1; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_get_27fe3dac1c4d0224\", function() { return __wbg_get_27fe3dac1c4d0224; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_length_e498fbc24f9c1d4f\", function() { return __wbg_length_e498fbc24f9c1d4f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_is_function\", function() { return __wbindgen_is_function; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_newnoargs_2b8b6bd7753c76ba\", function() { return __wbg_newnoargs_2b8b6bd7753c76ba; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_next_b7d530c04fd8b217\", function() { return __wbg_next_b7d530c04fd8b217; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_next_88560ec06a094dea\", function() { return __wbg_next_88560ec06a094dea; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_done_1ebec03bbd919843\", function() { return __wbg_done_1ebec03bbd919843; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_value_6ac8da5cc5b3efda\", function() { return __wbg_value_6ac8da5cc5b3efda; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_iterator_55f114446221aa5a\", function() { return __wbg_iterator_55f114446221aa5a; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_get_baf4855f9a986186\", function() { return __wbg_get_baf4855f9a986186; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_95d1ea488d03e4e8\", function() { return __wbg_call_95d1ea488d03e4e8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_f9876326328f45ed\", function() { return __wbg_new_f9876326328f45ed; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_self_e7c1f827057f6584\", function() { return __wbg_self_e7c1f827057f6584; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_window_a09ec664e14b1b81\", function() { return __wbg_window_a09ec664e14b1b81; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_globalThis_87cbb8506fecf3a9\", function() { return __wbg_globalThis_87cbb8506fecf3a9; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_global_c85a9259e621f3db\", function() { return __wbg_global_c85a9259e621f3db; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_isArray_39d28997bf6b96b4\", function() { return __wbg_isArray_39d28997bf6b96b4; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065\", function() { return __wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_call_9495de66fdbe016b\", function() { return __wbg_call_9495de66fdbe016b; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_isSafeInteger_8c4789029e885159\", function() { return __wbg_isSafeInteger_8c4789029e885159; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_9d3a9ce4282a18a8\", function() { return __wbg_new_9d3a9ce4282a18a8; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_resolve_fd40f858d9db1a04\", function() { return __wbg_resolve_fd40f858d9db1a04; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_then_ec5db6d509eb475f\", function() { return __wbg_then_ec5db6d509eb475f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_then_f753623316e2873a\", function() { return __wbg_then_f753623316e2873a; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_buffer_cf65c07de34b9a08\", function() { return __wbg_buffer_cf65c07de34b9a08; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_new_537b7341ce90bb31\", function() { return __wbg_new_537b7341ce90bb31; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_17499e8aa4003ebd\", function() { return __wbg_set_17499e8aa4003ebd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_length_27a2afe8ab42b09f\", function() { return __wbg_length_27a2afe8ab42b09f; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_instanceof_Uint8Array_01cebe79ca606cca\", function() { return __wbg_instanceof_Uint8Array_01cebe79ca606cca; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbg_set_6aa458a4ebdb65cb\", function() { return __wbg_set_6aa458a4ebdb65cb; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_debug_string\", function() { return __wbindgen_debug_string; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_throw\", function() { return __wbindgen_throw; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_rethrow\", function() { return __wbindgen_rethrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_memory\", function() { return __wbindgen_memory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper178\", function() { return __wbindgen_closure_wrapper178; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"__wbindgen_closure_wrapper661\", function() { return __wbindgen_closure_wrapper661; });\nlet wasm;\nfunction __wbg_set_wasm(val) {\n wasm = val;\n}\n\n\nconst heap = new Array(128).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 132) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet cachedUint8Memory0 = null;\n\nfunction getUint8Memory0() {\n if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {\n cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8Memory0;\n}\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedInt32Memory0 = null;\n\nfunction getInt32Memory0() {\n if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) {\n cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);\n }\n return cachedInt32Memory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nlet cachedFloat64Memory0 = null;\n\nfunction getFloat64Memory0() {\n if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) {\n cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer);\n }\n return cachedFloat64Memory0;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction makeClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n try {\n return f(state.a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n wasm.__wbindgen_export_2.get(state.dtor)(state.a, state.b);\n state.a = 0;\n\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_38(arg0, arg1, arg2) {\n wasm._dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hcc34fa8d6bbe3c68(arg0, arg1, addHeapObject(arg2));\n}\n\nfunction makeMutClosure(arg0, arg1, dtor, f) {\n const state = { a: arg0, b: arg1, cnt: 1, dtor };\n const real = (...args) => {\n // First up with a closure we increment the internal reference\n // count. This ensures that the Rust closure environment won't\n // be deallocated while we're invoking it.\n state.cnt++;\n const a = state.a;\n state.a = 0;\n try {\n return f(a, state.b, ...args);\n } finally {\n if (--state.cnt === 0) {\n wasm.__wbindgen_export_2.get(state.dtor)(a, state.b);\n\n } else {\n state.a = a;\n }\n }\n };\n real.original = state;\n\n return real;\n}\nfunction __wbg_adapter_41(arg0, arg1, arg2) {\n wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__heb4b17b584954f9d(arg0, arg1, addHeapObject(arg2));\n}\n\n/**\n*/\nfunction greet() {\n wasm.greet();\n}\n\n/**\n* @returns {Promise}\n*/\nfunction main() {\n wasm.main();\n}\n\n/**\n* @param {string} name\n* @param {string} description\n* @returns {Promise>}\n*/\nfunction add_course(name, description) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(description, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.add_course(ptr0, len0, ptr1, len1);\n return takeObject(ret);\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_exn_store(addHeapObject(e));\n }\n}\nfunction __wbg_adapter_115(arg0, arg1, arg2, arg3) {\n wasm.wasm_bindgen__convert__closures__invoke2_mut__hca7c618469c814fc(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));\n}\n\nfunction __wbindgen_object_drop_ref(arg0) {\n takeObject(arg0);\n};\n\nfunction __wbindgen_json_serialize(arg0, arg1) {\n const obj = getObject(arg1);\n const ret = JSON.stringify(obj === undefined ? null : obj);\n const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbg_alert_4ae9046a7b381592(arg0, arg1) {\n alert(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbg_confirm_32a42ee18f5f89fc(arg0, arg1) {\n const ret = confirm(getStringFromWasm0(arg0, arg1));\n return ret;\n};\n\nfunction __wbg_log_5b41f0cd6a54e579(arg0, arg1) {\n console.log(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_string_get(arg0, arg1) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_cb_drop(arg0) {\n const obj = takeObject(arg0).original;\n if (obj.cnt-- == 1) {\n obj.a = 0;\n return true;\n }\n const ret = false;\n return ret;\n};\n\nfunction __wbindgen_string_new(arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_is_object(arg0) {\n const val = getObject(arg0);\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n};\n\nfunction __wbindgen_is_undefined(arg0) {\n const ret = getObject(arg0) === undefined;\n return ret;\n};\n\nfunction __wbindgen_in(arg0, arg1) {\n const ret = getObject(arg0) in getObject(arg1);\n return ret;\n};\n\nfunction __wbindgen_error_new(arg0, arg1) {\n const ret = new Error(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_jsval_loose_eq(arg0, arg1) {\n const ret = getObject(arg0) == getObject(arg1);\n return ret;\n};\n\nfunction __wbindgen_boolean_get(arg0) {\n const v = getObject(arg0);\n const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2;\n return ret;\n};\n\nfunction __wbindgen_number_get(arg0, arg1) {\n const obj = getObject(arg1);\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;\n getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);\n};\n\nfunction __wbindgen_object_clone_ref(arg0) {\n const ret = getObject(arg0);\n return addHeapObject(ret);\n};\n\nfunction __wbg_getwithrefkey_15c62c2b8546208d(arg0, arg1) {\n const ret = getObject(arg0)[getObject(arg1)];\n return addHeapObject(ret);\n};\n\nfunction __wbg_instanceof_Window_e266f02eee43b570(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Window;\n } catch {\n result = false;\n }\n const ret = result;\n return ret;\n};\n\nfunction __wbg_document_950215a728589a2d(arg0) {\n const ret = getObject(arg0).document;\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nfunction __wbg_location_797a1856892cc2de(arg0) {\n const ret = getObject(arg0).location;\n return addHeapObject(ret);\n};\n\nfunction __wbg_fetch_465e8cb61a0f43ea(arg0, arg1) {\n const ret = getObject(arg0).fetch(getObject(arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbg_createElement_e2a0e21263eb5416() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_getElementById_eb93a47327bb5585(arg0, arg1, arg2) {\n const ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));\n return isLikeNone(ret) ? 0 : addHeapObject(ret);\n};\n\nfunction __wbg_instanceof_Response_fb3a4df648c1859b(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Response;\n } catch {\n result = false;\n }\n const ret = result;\n return ret;\n};\n\nfunction __wbg_json_b9414eb18cb751d0() { return handleError(function (arg0) {\n const ret = getObject(arg0).json();\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_headers_ab5251d2727ac41e(arg0) {\n const ret = getObject(arg0).headers;\n return addHeapObject(ret);\n};\n\nfunction __wbg_newwithstrandinit_c45f0dc6da26fd03() { return handleError(function (arg0, arg1, arg2) {\n const ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_addEventListener_615d4590d38da1c9() { return handleError(function (arg0, arg1, arg2, arg3) {\n getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3));\n}, arguments) };\n\nfunction __wbg_setAttribute_79c9562d32d05e66() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));\n}, arguments) };\n\nfunction __wbg_settextContent_19dc6a6146112f16(arg0, arg1, arg2) {\n getObject(arg0).textContent = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2);\n};\n\nfunction __wbg_appendChild_b8199dc1655c852d() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).appendChild(getObject(arg1));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_reload_cab7edb34a2ce684() { return handleError(function (arg0) {\n getObject(arg0).reload();\n}, arguments) };\n\nfunction __wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof HTMLButtonElement;\n } catch {\n result = false;\n }\n const ret = result;\n return ret;\n};\n\nfunction __wbg_set_a5d34c36a1a4ebd1() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n getObject(arg0).set(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));\n}, arguments) };\n\nfunction __wbg_get_27fe3dac1c4d0224(arg0, arg1) {\n const ret = getObject(arg0)[arg1 >>> 0];\n return addHeapObject(ret);\n};\n\nfunction __wbg_length_e498fbc24f9c1d4f(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n};\n\nfunction __wbindgen_is_function(arg0) {\n const ret = typeof(getObject(arg0)) === 'function';\n return ret;\n};\n\nfunction __wbg_newnoargs_2b8b6bd7753c76ba(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbg_next_b7d530c04fd8b217(arg0) {\n const ret = getObject(arg0).next;\n return addHeapObject(ret);\n};\n\nfunction __wbg_next_88560ec06a094dea() { return handleError(function (arg0) {\n const ret = getObject(arg0).next();\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_done_1ebec03bbd919843(arg0) {\n const ret = getObject(arg0).done;\n return ret;\n};\n\nfunction __wbg_value_6ac8da5cc5b3efda(arg0) {\n const ret = getObject(arg0).value;\n return addHeapObject(ret);\n};\n\nfunction __wbg_iterator_55f114446221aa5a() {\n const ret = Symbol.iterator;\n return addHeapObject(ret);\n};\n\nfunction __wbg_get_baf4855f9a986186() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(getObject(arg0), getObject(arg1));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_call_95d1ea488d03e4e8() { return handleError(function (arg0, arg1) {\n const ret = getObject(arg0).call(getObject(arg1));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_new_f9876326328f45ed() {\n const ret = new Object();\n return addHeapObject(ret);\n};\n\nfunction __wbg_self_e7c1f827057f6584() { return handleError(function () {\n const ret = self.self;\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_window_a09ec664e14b1b81() { return handleError(function () {\n const ret = window.window;\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_globalThis_87cbb8506fecf3a9() { return handleError(function () {\n const ret = globalThis.globalThis;\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_global_c85a9259e621f3db() { return handleError(function () {\n const ret = global.global;\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_isArray_39d28997bf6b96b4(arg0) {\n const ret = Array.isArray(getObject(arg0));\n return ret;\n};\n\nfunction __wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof ArrayBuffer;\n } catch {\n result = false;\n }\n const ret = result;\n return ret;\n};\n\nfunction __wbg_call_9495de66fdbe016b() { return handleError(function (arg0, arg1, arg2) {\n const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n}, arguments) };\n\nfunction __wbg_isSafeInteger_8c4789029e885159(arg0) {\n const ret = Number.isSafeInteger(getObject(arg0));\n return ret;\n};\n\nfunction __wbg_new_9d3a9ce4282a18a8(arg0, arg1) {\n try {\n var state0 = {a: arg0, b: arg1};\n var cb0 = (arg0, arg1) => {\n const a = state0.a;\n state0.a = 0;\n try {\n return __wbg_adapter_115(a, state0.b, arg0, arg1);\n } finally {\n state0.a = a;\n }\n };\n const ret = new Promise(cb0);\n return addHeapObject(ret);\n } finally {\n state0.a = state0.b = 0;\n }\n};\n\nfunction __wbg_resolve_fd40f858d9db1a04(arg0) {\n const ret = Promise.resolve(getObject(arg0));\n return addHeapObject(ret);\n};\n\nfunction __wbg_then_ec5db6d509eb475f(arg0, arg1) {\n const ret = getObject(arg0).then(getObject(arg1));\n return addHeapObject(ret);\n};\n\nfunction __wbg_then_f753623316e2873a(arg0, arg1, arg2) {\n const ret = getObject(arg0).then(getObject(arg1), getObject(arg2));\n return addHeapObject(ret);\n};\n\nfunction __wbg_buffer_cf65c07de34b9a08(arg0) {\n const ret = getObject(arg0).buffer;\n return addHeapObject(ret);\n};\n\nfunction __wbg_new_537b7341ce90bb31(arg0) {\n const ret = new Uint8Array(getObject(arg0));\n return addHeapObject(ret);\n};\n\nfunction __wbg_set_17499e8aa4003ebd(arg0, arg1, arg2) {\n getObject(arg0).set(getObject(arg1), arg2 >>> 0);\n};\n\nfunction __wbg_length_27a2afe8ab42b09f(arg0) {\n const ret = getObject(arg0).length;\n return ret;\n};\n\nfunction __wbg_instanceof_Uint8Array_01cebe79ca606cca(arg0) {\n let result;\n try {\n result = getObject(arg0) instanceof Uint8Array;\n } catch {\n result = false;\n }\n const ret = result;\n return ret;\n};\n\nfunction __wbg_set_6aa458a4ebdb65cb() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2));\n return ret;\n}, arguments) };\n\nfunction __wbindgen_debug_string(arg0, arg1) {\n const ret = debugString(getObject(arg1));\n const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n};\n\nfunction __wbindgen_throw(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n};\n\nfunction __wbindgen_rethrow(arg0) {\n throw takeObject(arg0);\n};\n\nfunction __wbindgen_memory() {\n const ret = wasm.memory;\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_closure_wrapper178(arg0, arg1, arg2) {\n const ret = makeClosure(arg0, arg1, 55, __wbg_adapter_38);\n return addHeapObject(ret);\n};\n\nfunction __wbindgen_closure_wrapper661(arg0, arg1, arg2) {\n const ret = makeMutClosure(arg0, arg1, 131, __wbg_adapter_41);\n return addHeapObject(ret);\n};\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../www/node_modules/webpack/buildin/harmony-module.js */ \"./node_modules/webpack/buildin/harmony-module.js\")(module), __webpack_require__(/*! ./../www/node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///../pkg/wasm_client_bg.js?"); + +/***/ }), + +/***/ "../pkg/wasm_client_bg.wasm": +/*!**********************************!*\ + !*** ../pkg/wasm_client_bg.wasm ***! + \**********************************/ +/*! exports provided: memory, main, greet, add_course, __wbindgen_malloc, __wbindgen_realloc, __wbindgen_export_2, _dyn_core__ops__function__Fn__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hcc34fa8d6bbe3c68, _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__heb4b17b584954f9d, __wbindgen_exn_store, wasm_bindgen__convert__closures__invoke2_mut__hca7c618469c814fc, __wbindgen_start */ +/***/ (function(module, exports, __webpack_require__) { + +eval("\"use strict\";\n// Instantiate WebAssembly module\nvar wasmExports = __webpack_require__.w[module.i];\n__webpack_require__.r(exports);\n// export exports from WebAssembly module\nfor(var name in wasmExports) if(name != \"__webpack_init__\") exports[name] = wasmExports[name];\n// exec imports from WebAssembly module (for esm order)\n/* harmony import */ var m0 = __webpack_require__(/*! ./wasm_client_bg.js */ \"../pkg/wasm_client_bg.js\");\n\n\n// exec wasm module\nwasmExports[\"__webpack_init__\"]()\n\n//# sourceURL=webpack:///../pkg/wasm_client_bg.wasm?"); + +/***/ }), + +/***/ "./index.js": +/*!******************!*\ + !*** ./index.js ***! + \******************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var wasm_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! wasm-client */ \"../pkg/wasm_client.js\");\n\n\nconst myForm = document.getElementById('form')\nmyForm.addEventListener('submit', function (e) {\n e.preventDefault()\n const name = document.getElementById('name').value\n const desc = document.querySelector('#description').value\n\n wasm_client__WEBPACK_IMPORTED_MODULE_0__[\"add_course\"](name, desc).then((json) => {\n alert('添加成功')\n window.location.reload()\n })\n})\n\n\n//# sourceURL=webpack:///./index.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/harmony-module.js": +/*!*******************************************!*\ + !*** (webpack)/buildin/harmony-module.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/harmony-module.js?"); + +/***/ }) + +}]); \ No newline at end of file diff --git a/build/dist/8be0f8e4c2e0004a6c12.module.wasm b/build/dist/8be0f8e4c2e0004a6c12.module.wasm new file mode 100644 index 0000000..9d8a7b4 Binary files /dev/null and b/build/dist/8be0f8e4c2e0004a6c12.module.wasm differ diff --git a/build/dist/bootstrap.js b/build/dist/bootstrap.js new file mode 100644 index 0000000..8a0102a --- /dev/null +++ b/build/dist/bootstrap.js @@ -0,0 +1,474 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ }; +/******/ +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ +/******/ +/******/ // script path function +/******/ function jsonpScriptSrc(chunkId) { +/******/ return __webpack_require__.p + "" + chunkId + ".bootstrap.js" +/******/ } +/******/ +/******/ // object to store loaded and loading wasm modules +/******/ var installedWasmModules = {}; +/******/ +/******/ function promiseResolve() { return Promise.resolve(); } +/******/ +/******/ var wasmImportObjects = { +/******/ "../pkg/wasm_client_bg.wasm": function() { +/******/ return { +/******/ "./wasm_client_bg.js": { +/******/ "__wbindgen_object_drop_ref": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_object_drop_ref"](p0i32); +/******/ }, +/******/ "__wbindgen_json_serialize": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_json_serialize"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_alert_4ae9046a7b381592": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_alert_4ae9046a7b381592"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_confirm_32a42ee18f5f89fc": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_confirm_32a42ee18f5f89fc"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_log_5b41f0cd6a54e579": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_log_5b41f0cd6a54e579"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_string_get": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_string_get"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_cb_drop": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_cb_drop"](p0i32); +/******/ }, +/******/ "__wbindgen_string_new": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_string_new"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_is_object": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_is_object"](p0i32); +/******/ }, +/******/ "__wbindgen_is_undefined": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_is_undefined"](p0i32); +/******/ }, +/******/ "__wbindgen_in": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_in"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_error_new": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_error_new"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_jsval_loose_eq": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_jsval_loose_eq"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_boolean_get": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_boolean_get"](p0i32); +/******/ }, +/******/ "__wbindgen_number_get": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_number_get"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_object_clone_ref": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_object_clone_ref"](p0i32); +/******/ }, +/******/ "__wbg_getwithrefkey_15c62c2b8546208d": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_getwithrefkey_15c62c2b8546208d"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_instanceof_Window_e266f02eee43b570": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_instanceof_Window_e266f02eee43b570"](p0i32); +/******/ }, +/******/ "__wbg_document_950215a728589a2d": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_document_950215a728589a2d"](p0i32); +/******/ }, +/******/ "__wbg_location_797a1856892cc2de": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_location_797a1856892cc2de"](p0i32); +/******/ }, +/******/ "__wbg_fetch_465e8cb61a0f43ea": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_fetch_465e8cb61a0f43ea"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_createElement_e2a0e21263eb5416": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_createElement_e2a0e21263eb5416"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_getElementById_eb93a47327bb5585": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_getElementById_eb93a47327bb5585"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_instanceof_Response_fb3a4df648c1859b": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_instanceof_Response_fb3a4df648c1859b"](p0i32); +/******/ }, +/******/ "__wbg_json_b9414eb18cb751d0": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_json_b9414eb18cb751d0"](p0i32); +/******/ }, +/******/ "__wbg_headers_ab5251d2727ac41e": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_headers_ab5251d2727ac41e"](p0i32); +/******/ }, +/******/ "__wbg_newwithstrandinit_c45f0dc6da26fd03": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_newwithstrandinit_c45f0dc6da26fd03"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_addEventListener_615d4590d38da1c9": function(p0i32,p1i32,p2i32,p3i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_addEventListener_615d4590d38da1c9"](p0i32,p1i32,p2i32,p3i32); +/******/ }, +/******/ "__wbg_setAttribute_79c9562d32d05e66": function(p0i32,p1i32,p2i32,p3i32,p4i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_setAttribute_79c9562d32d05e66"](p0i32,p1i32,p2i32,p3i32,p4i32); +/******/ }, +/******/ "__wbg_settextContent_19dc6a6146112f16": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_settextContent_19dc6a6146112f16"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_appendChild_b8199dc1655c852d": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_appendChild_b8199dc1655c852d"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_reload_cab7edb34a2ce684": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_reload_cab7edb34a2ce684"](p0i32); +/******/ }, +/******/ "__wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_instanceof_HtmlButtonElement_7046caffb25a7bfb"](p0i32); +/******/ }, +/******/ "__wbg_set_a5d34c36a1a4ebd1": function(p0i32,p1i32,p2i32,p3i32,p4i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_set_a5d34c36a1a4ebd1"](p0i32,p1i32,p2i32,p3i32,p4i32); +/******/ }, +/******/ "__wbg_get_27fe3dac1c4d0224": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_get_27fe3dac1c4d0224"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_length_e498fbc24f9c1d4f": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_length_e498fbc24f9c1d4f"](p0i32); +/******/ }, +/******/ "__wbindgen_is_function": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_is_function"](p0i32); +/******/ }, +/******/ "__wbg_newnoargs_2b8b6bd7753c76ba": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_newnoargs_2b8b6bd7753c76ba"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_next_b7d530c04fd8b217": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_next_b7d530c04fd8b217"](p0i32); +/******/ }, +/******/ "__wbg_next_88560ec06a094dea": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_next_88560ec06a094dea"](p0i32); +/******/ }, +/******/ "__wbg_done_1ebec03bbd919843": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_done_1ebec03bbd919843"](p0i32); +/******/ }, +/******/ "__wbg_value_6ac8da5cc5b3efda": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_value_6ac8da5cc5b3efda"](p0i32); +/******/ }, +/******/ "__wbg_iterator_55f114446221aa5a": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_iterator_55f114446221aa5a"](); +/******/ }, +/******/ "__wbg_get_baf4855f9a986186": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_get_baf4855f9a986186"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_call_95d1ea488d03e4e8": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_call_95d1ea488d03e4e8"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_new_f9876326328f45ed": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_new_f9876326328f45ed"](); +/******/ }, +/******/ "__wbg_self_e7c1f827057f6584": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_self_e7c1f827057f6584"](); +/******/ }, +/******/ "__wbg_window_a09ec664e14b1b81": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_window_a09ec664e14b1b81"](); +/******/ }, +/******/ "__wbg_globalThis_87cbb8506fecf3a9": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_globalThis_87cbb8506fecf3a9"](); +/******/ }, +/******/ "__wbg_global_c85a9259e621f3db": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_global_c85a9259e621f3db"](); +/******/ }, +/******/ "__wbg_isArray_39d28997bf6b96b4": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_isArray_39d28997bf6b96b4"](p0i32); +/******/ }, +/******/ "__wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_instanceof_ArrayBuffer_a69f02ee4c4f5065"](p0i32); +/******/ }, +/******/ "__wbg_call_9495de66fdbe016b": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_call_9495de66fdbe016b"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_isSafeInteger_8c4789029e885159": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_isSafeInteger_8c4789029e885159"](p0i32); +/******/ }, +/******/ "__wbg_new_9d3a9ce4282a18a8": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_new_9d3a9ce4282a18a8"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_resolve_fd40f858d9db1a04": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_resolve_fd40f858d9db1a04"](p0i32); +/******/ }, +/******/ "__wbg_then_ec5db6d509eb475f": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_then_ec5db6d509eb475f"](p0i32,p1i32); +/******/ }, +/******/ "__wbg_then_f753623316e2873a": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_then_f753623316e2873a"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_buffer_cf65c07de34b9a08": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_buffer_cf65c07de34b9a08"](p0i32); +/******/ }, +/******/ "__wbg_new_537b7341ce90bb31": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_new_537b7341ce90bb31"](p0i32); +/******/ }, +/******/ "__wbg_set_17499e8aa4003ebd": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_set_17499e8aa4003ebd"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbg_length_27a2afe8ab42b09f": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_length_27a2afe8ab42b09f"](p0i32); +/******/ }, +/******/ "__wbg_instanceof_Uint8Array_01cebe79ca606cca": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_instanceof_Uint8Array_01cebe79ca606cca"](p0i32); +/******/ }, +/******/ "__wbg_set_6aa458a4ebdb65cb": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbg_set_6aa458a4ebdb65cb"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbindgen_debug_string": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_debug_string"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_throw": function(p0i32,p1i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_throw"](p0i32,p1i32); +/******/ }, +/******/ "__wbindgen_rethrow": function(p0i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_rethrow"](p0i32); +/******/ }, +/******/ "__wbindgen_memory": function() { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_memory"](); +/******/ }, +/******/ "__wbindgen_closure_wrapper178": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_closure_wrapper178"](p0i32,p1i32,p2i32); +/******/ }, +/******/ "__wbindgen_closure_wrapper661": function(p0i32,p1i32,p2i32) { +/******/ return installedModules["../pkg/wasm_client_bg.js"].exports["__wbindgen_closure_wrapper661"](p0i32,p1i32,p2i32); +/******/ } +/******/ } +/******/ }; +/******/ }, +/******/ }; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId) { +/******/ var promises = []; +/******/ +/******/ +/******/ // JSONP chunk loading for javascript +/******/ +/******/ var installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise(function(resolve, reject) { +/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; +/******/ }); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var script = document.createElement('script'); +/******/ var onScriptComplete; +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.src = jsonpScriptSrc(chunkId); +/******/ +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ onScriptComplete = function (event) { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var chunk = installedChunks[chunkId]; +/******/ if(chunk !== 0) { +/******/ if(chunk) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ chunk[1](error); +/******/ } +/******/ installedChunks[chunkId] = undefined; +/******/ } +/******/ }; +/******/ var timeout = setTimeout(function(){ +/******/ onScriptComplete({ type: 'timeout', target: script }); +/******/ }, 120000); +/******/ script.onerror = script.onload = onScriptComplete; +/******/ document.head.appendChild(script); +/******/ } +/******/ } +/******/ +/******/ // Fetch + compile chunk loading for webassembly +/******/ +/******/ var wasmModules = {"0":["../pkg/wasm_client_bg.wasm"]}[chunkId] || []; +/******/ +/******/ wasmModules.forEach(function(wasmModuleId) { +/******/ var installedWasmModuleData = installedWasmModules[wasmModuleId]; +/******/ +/******/ // a Promise means "currently loading" or "already loaded". +/******/ if(installedWasmModuleData) +/******/ promises.push(installedWasmModuleData); +/******/ else { +/******/ var importObject = wasmImportObjects[wasmModuleId](); +/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/wasm_client_bg.wasm":"8be0f8e4c2e0004a6c12"}[wasmModuleId] + ".module.wasm"); +/******/ var promise; +/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') { +/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) { +/******/ return WebAssembly.instantiate(items[0], items[1]); +/******/ }); +/******/ } else if(typeof WebAssembly.instantiateStreaming === 'function') { +/******/ promise = WebAssembly.instantiateStreaming(req, importObject); +/******/ } else { +/******/ var bytesPromise = req.then(function(x) { return x.arrayBuffer(); }); +/******/ promise = bytesPromise.then(function(bytes) { +/******/ return WebAssembly.instantiate(bytes, importObject); +/******/ }); +/******/ } +/******/ promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) { +/******/ return __webpack_require__.w[wasmModuleId] = (res.instance || res).exports; +/******/ })); +/******/ } +/******/ }); +/******/ return Promise.all(promises); +/******/ }; +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; +/******/ +/******/ // object with all WebAssembly.instance exports +/******/ __webpack_require__.w = {}; +/******/ +/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./bootstrap.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./bootstrap.js": +/*!**********************!*\ + !*** ./bootstrap.js ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("// A dependency graph that contains any wasm must all be imported\n// asynchronously. This `bootstrap.js` file does the single async import, so\n// that no one else needs to worry about it again.\n__webpack_require__.e(/*! import() */ 0).then(__webpack_require__.bind(null, /*! ./index.js */ \"./index.js\"))\n .catch(e => console.error(\"Error importing `index.js`:\", e));\n\n\n//# sourceURL=webpack:///./bootstrap.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/build/dist/index.html b/build/dist/index.html new file mode 100644 index 0000000..9c18453 --- /dev/null +++ b/build/dist/index.html @@ -0,0 +1,67 @@ + + + + + + Hello wasm-pack! + + + + + + + +
+
+
+
+
Course
+
+ +
+ + + + + + + + + + + +
IDNameTimeDescriptionOption
+
+
+
+
+
Add Course
+
+
+
+ + +
Please fill in course name
+
+
+ + +
+
+ +
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/build/svr b/build/svr new file mode 100755 index 0000000..a4b2180 Binary files /dev/null and b/build/svr differ diff --git a/build/teacher-service b/build/teacher-service new file mode 100755 index 0000000..52e3377 Binary files /dev/null and b/build/teacher-service differ diff --git a/db/db.sql b/db/db.sql deleted file mode 100644 index 90e860f..0000000 --- a/db/db.sql +++ /dev/null @@ -1,12 +0,0 @@ -drop table if exists course; - -create table course -( - id serial primary key, - teacher_id int not null, - name varchar(255) not null, - time timestamp default now() -); - -insert into course (id, teacher_id, name, time) values (1, 1, 'Math', '2022-01-01 00:00:00'); -insert into course (id, teacher_id, name, time) values (2, 1, 'English', '2022-01-02 00:00:00'); \ No newline at end of file diff --git a/db/docker-compose.yml b/db/docker-compose.yml new file mode 100644 index 0000000..8f39f0a --- /dev/null +++ b/db/docker-compose.yml @@ -0,0 +1,21 @@ +# Use postgres/example user/password credentials +version: '3.1' + +services: + db: + image: postgres:alpine + restart: always + ports: + - '5432:5432' + volumes: + - ./init.d:/docker-entrypoint-initdb.d + environment: + POSTGRES_PASSWORD: postgres + + adminer: + image: adminer + restart: always + links: + - db:db + ports: + - '8081:8080' diff --git a/db/init.d/courses.sql b/db/init.d/courses.sql new file mode 100644 index 0000000..4ebba6d --- /dev/null +++ b/db/init.d/courses.sql @@ -0,0 +1,29 @@ +set +timezone to 'Asia/Shanghai'; + +drop table if exists courses; + +create table courses +( + id serial primary key, + teacher_id INT not null, + name varchar(140) not null, + time TIMESTAMP default now(), + description varchar(2000), + format varchar(30), + structure varchar(200), + duration varchar(30), + price integer, + language varchar(30), + level varchar(30) +); + + +insert into courses (teacher_id, name) +values (1, + 'First course'); + + +insert into courses (teacher_id, name) +values (1, + 'Second course'); \ No newline at end of file diff --git a/db/init.d/teachers.sql b/db/init.d/teachers.sql new file mode 100644 index 0000000..669fd80 --- /dev/null +++ b/db/init.d/teachers.sql @@ -0,0 +1,16 @@ +set + timezone to 'Asia/Shanghai'; + +drop table if exists teachers; + +create table teachers +( + id serial primary key, + name varchar(100), + picture_url varchar(100), + profile varchar(2000) +); + +insert into teachers (name, picture_url, profile) +VALUES ('zhang san', 'https://abc.xyz', 'zhang san is a good teacher'), + ('li si', 'https://abc.xyz', 'zhang san is a good teacher'); \ No newline at end of file diff --git a/wasm-client/.gitignore b/wasm-client/.gitignore index 4e30131..7904dc7 100644 --- a/wasm-client/.gitignore +++ b/wasm-client/.gitignore @@ -3,4 +3,4 @@ Cargo.lock bin/ pkg/ -wasm-pack.log +wasm-pack.log \ No newline at end of file diff --git a/wasm-client/Cargo.toml b/wasm-client/Cargo.toml index 6372219..f4577b3 100644 --- a/wasm-client/Cargo.toml +++ b/wasm-client/Cargo.toml @@ -1,7 +1,6 @@ [package] name = "wasm-client" version = "0.1.0" -authors = ["Leeco "] edition = "2018" [lib] @@ -12,13 +11,29 @@ default = ["console_error_panic_hook"] [dependencies] chrono = { version = "0.4.19", features = ["serde"] } +js-sys = "0.3.45" serde = { version = "1.0.136", features = ["derive"] } -serde_json = "1.0.79" serde_derive = "1.0.136" -js-sys = "0.3.56" +serde-wasm-bindgen = "0.4" +serde_json = "1.0.79" wasm-bindgen = { version = "0.2.79", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4.29" -web-sys = { version = "0.3.56", features = ["Headers", "Request", "RequestInit", "RequestMode", "Response", "Window", "Document", "Element", "HtmlElement", "Node", "console", "HtmlButtonElement", "MouseEvent", "Location"] } +web-sys = { version = "0.3.56", features = [ + "Headers", + "Request", + "RequestInit", + "RequestMode", + "Response", + "Window", + "Document", + "Element", + "HtmlElement", + "Node", + "console", + "HtmlButtonElement", + "MouseEvent", + "Location", +] } # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires @@ -36,4 +51,4 @@ wasm-bindgen-test = "0.3.13" [profile.release] # Tell `rustc` to optimize for small code size. -opt-level = "s" +opt-level = "s" \ No newline at end of file diff --git a/wasm-client/src/lib.rs b/wasm-client/src/lib.rs index 7111e96..9e2604b 100644 --- a/wasm-client/src/lib.rs +++ b/wasm-client/src/lib.rs @@ -1,6 +1,8 @@ mod utils; use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::spawn_local; +use web_sys::HtmlButtonElement; // When the `wee_alloc` feature is enabled, use `wee_alloc` as the global // allocator. @@ -8,9 +10,11 @@ use wasm_bindgen::prelude::*; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; +// "C" is the ABI the wasm target uses #[wasm_bindgen] extern "C" { fn alert(s: &str); + fn confirm(s: &str) -> bool; #[wasm_bindgen(js_namespace = console)] @@ -25,68 +29,70 @@ pub fn greet() { pub mod errors; pub mod models; -use models::course::{delete_course, get_courses_by_teacher}; -use wasm_bindgen::JsCast; -use wasm_bindgen_futures::*; -use web_sys::{HtmlButtonElement}; +use crate::models::course::delete_course; +use models::course::Course; #[wasm_bindgen(start)] pub async fn main() -> Result<(), JsValue> { - let window = web_sys::window().expect("no global `window` exists"); - let document = window.document().expect("no global `document` exists"); + let window = web_sys::window().expect("no global window exists"); + let document = window.document().expect("should have a document exists"); - let left_tbody = document + let left_body = document .get_element_by_id("left-tbody") .expect("left div not exists"); - let courses = get_courses_by_teacher(1).await.unwrap(); - + let courses = models::course::get_courses_by_teacher(1).await.unwrap(); log(courses.len().to_string().as_str()); for c in courses.iter() { let tr = document.create_element("tr")?; tr.set_attribute("id", format!("tr-{}", c.id).as_str())?; + // course id let td = document.create_element("td")?; td.set_text_content(Some(format!("{}", c.id).as_str())); tr.append_child(&td)?; - + // course name let td = document.create_element("td")?; td.set_text_content(Some(c.name.as_str())); tr.append_child(&td)?; - + // course time let td = document.create_element("td")?; - td.set_text_content(Some(c.time.format("%Y-%m-%d").to_string().as_str())); + td.set_text_content(Some( + c.time.unwrap().format("%Y-%m-%d").to_string().as_str(), + )); tr.append_child(&td)?; - + // course description let td = document.create_element("td")?; - if let Some(desc) = c.description.clone() { + if let Some(desc) = &c.description.clone() { td.set_text_content(Some(desc.as_str())); } tr.append_child(&td)?; - + // append button let td = document.create_element("td")?; - let btn = document + let btn: HtmlButtonElement = document .create_element("button") .unwrap() .dyn_into::() .unwrap(); let cid = c.id; - let click_closure = Closure::wrap(Box::new(move |_e: web_sys::MouseEvent| { - let r = confirm(format!("确认删除 ID 为 {} 的课程吗?", cid).as_str()); + let click_closure = Closure::wrap(Box::new(move |_event: web_sys::MouseEvent| { + let r = confirm(format!("Are you sure to delete course {}?", cid).as_str()); match r { true => { - // 使闭包里能调用异步函数 spawn_local(delete_course(1, cid)); - alert("删除成功!"); + alert("deleted!"); + // reload web_sys::window().unwrap().location().reload().unwrap(); } _ => {} } }) as Box); + // convert to `Function` and pass to `addEventListener` btn.add_event_listener_with_callback("click", click_closure.as_ref().unchecked_ref())?; + // prevent memory leak click_closure.forget(); btn.set_attribute("class", "btn btn-danger btn-sm")?; @@ -94,7 +100,7 @@ pub async fn main() -> Result<(), JsValue> { td.append_child(&btn)?; tr.append_child(&td)?; - left_tbody.append_child(&tr)?; + left_body.append_child(&tr)?; } Ok(()) diff --git a/wasm-client/src/models/course.rs b/wasm-client/src/models/course.rs index e1bc8f0..fb96239 100644 --- a/wasm-client/src/models/course.rs +++ b/wasm-client/src/models/course.rs @@ -3,20 +3,20 @@ use chrono::NaiveDateTime; use serde::{Deserialize, Serialize}; use wasm_bindgen::JsCast; use wasm_bindgen_futures::JsFuture; -use web_sys::{ Request, RequestInit, RequestMode, Response}; +use web_sys::{Request, RequestInit, RequestMode, Response}; #[derive(Debug, Serialize, Deserialize)] pub struct Course { - pub id: i32, pub teacher_id: i32, + pub id: i32, pub name: String, - pub time: NaiveDateTime, + pub time: Option, pub description: Option, pub format: Option, pub structure: Option, pub duration: Option, - pub price: Option, + pub price: Option, pub language: Option, pub level: Option, } @@ -29,31 +29,26 @@ pub async fn get_courses_by_teacher(teacher_id: i32) -> Result, MyEr let url = format!("http://localhost:3000/courses/{}", teacher_id); let request = Request::new_with_str_and_init(&url, &opts)?; - request.headers().set("Accept", "application/json")?; - let window = web_sys::window() - .ok_or("no global `window` exists") - .unwrap(); + let window = web_sys::window().ok_or("no windows exists".to_string())?; let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?; assert!(resp_value.is_instance_of::()); let resp: Response = resp_value.dyn_into().unwrap(); - let json = JsFuture::from(resp.json()?).await?; - - let courses: Vec = json.into_serde().unwrap(); + let courses: Vec = serde_wasm_bindgen::from_value(json).unwrap_or(vec![]); Ok(courses) } -pub async fn delete_course(tercher_id: i32, course_id: i32) -> () { +pub async fn delete_course(teacher_id: i32, course_id: i32) -> () { let mut opts = RequestInit::new(); opts.method("DELETE"); opts.mode(RequestMode::Cors); - let url = format!("http://localhost:3000/courses/{}/{}", tercher_id, course_id); + let url = format!("http://localhost:3000/courses/{}/{}", teacher_id, course_id); let request = Request::new_with_str_and_init(&url, &opts).unwrap(); request.headers().set("Accept", "application/json").unwrap(); @@ -68,7 +63,7 @@ pub async fn delete_course(tercher_id: i32, course_id: i32) -> () { let resp: Response = resp_value.dyn_into().unwrap(); let json = JsFuture::from(resp.json().unwrap()).await.unwrap(); - let _course = json.into_serde::().unwrap(); + let _courses: Course = json.into_serde().unwrap(); } use js_sys::Promise; @@ -79,26 +74,29 @@ pub async fn add_course(name: String, description: String) -> Result()); let resp: Response = resp_value.dyn_into().unwrap(); - Ok(resp.json()?) } diff --git a/webservice/Cargo.toml b/webservice/Cargo.toml index 2bcfbe5..de7436c 100644 --- a/webservice/Cargo.toml +++ b/webservice/Cargo.toml @@ -14,7 +14,7 @@ dotenv = "0.15.0" serde = { version = "1.0.134", features = ["derive"] } chrono = { version = "0.4.19", features = ["serde"] } openssl = { version = "0.10.38", features = ["vendored"] } -sqlx = { version = "0.5.7", features = [ +sqlx = { version = "0.5.10", default_features = false, features = [ "postgres", "runtime-actix-rustls", "macros", diff --git a/webservice/src/bin/teacher-service.rs b/webservice/src/bin/teacher-service.rs index f54900f..d70c9fc 100644 --- a/webservice/src/bin/teacher-service.rs +++ b/webservice/src/bin/teacher-service.rs @@ -45,7 +45,7 @@ async fn main() -> io::Result<()> { let app = move || { let cors = Cors::default() - .allowed_origin("http://localhost:8081/") + .allowed_origin("http://localhost:8080/") .allowed_origin_fn(|origin, _req_head| { origin.as_bytes().starts_with(b"http://localhost") })