//go:build wasm //:build wasm package httpproxy import ( "git.smesh.lol/smesh/web/common/jsbridge/callback" "unsafe" ) // === Consumer-side === //:wasmimport bridge httpproxy_request func wasmRequest(reqID int32, urlPtr *byte, urlLen int32, urlCap int32, priority int32) //:wasmimport bridge httpproxy_request_cancel func wasmRequestCancel(reqID int32) type fetchHandler struct { onOK func(string, string) onFail func(int32, string) } var pendingFetches = map[int32]fetchHandler{} func Request(reqID int32, url string, priority int32, onOK func(blobURL, contentType string), onFail func(status int32, errMsg string)) { pendingFetches[reqID] = fetchHandler{onOK: onOK, onFail: onFail} wasmRequest(reqID, unsafe.StringData(url), int32(len(url)), int32(len(url)), priority) } func RequestCancel(reqID int32) { delete(pendingFetches, reqID) wasmRequestCancel(reqID) } // __httpproxy_result_ok is the wasm export the supervisor calls when a // fetch succeeds. blobURL and contentType are the result strings. // //:wasmexport __httpproxy_result_ok func httpproxyResultOK(reqID int32, blobPtr *byte, blobLen int32, ctPtr *byte, ctLen int32) { h, ok := pendingFetches[reqID] if !ok { return } delete(pendingFetches, reqID) blobURL := "" if blobLen > 0 { blobURL = unsafe.String(blobPtr, blobLen) } contentType := "" if ctLen > 0 { contentType = unsafe.String(ctPtr, ctLen) } h.onOK(blobURL, contentType) } // __httpproxy_result_fail is the wasm export the supervisor calls when a // fetch fails. status is the upstream HTTP status (0 if no response). // //:wasmexport __httpproxy_result_fail func httpproxyResultFail(reqID int32, status int32, errPtr *byte, errLen int32) { h, ok := pendingFetches[reqID] if !ok { return } delete(pendingFetches, reqID) errMsg := "" if errLen > 0 { errMsg = unsafe.String(errPtr, errLen) } h.onFail(status, errMsg) } // === Worker-internal === //:wasmimport bridge httpproxy_on_message func wasmOnMessage(cbID int32) //:wasmimport bridge httpproxy_post func wasmPost(ptr *byte, length int32, cap int32) //:wasmimport bridge httpproxy_fetch func wasmFetch(reqID int32, urlPtr *byte, urlLen int32, urlCap int32) //:wasmimport bridge httpproxy_cancel func wasmCancel(reqID int32) //:wasmimport bridge httpproxy_revoke_blob func wasmRevokeBlob(ptr *byte, length int32, cap int32) func OnMessage(fn func(msg string)) { wasmOnMessage(callback.RegisterS(fn)) } func Post(msg string) { wasmPost(unsafe.StringData(msg), int32(len(msg)), int32(len(msg))) } func Fetch(reqID int32, url string) { wasmFetch(reqID, unsafe.StringData(url), int32(len(url)), int32(len(url))) } func Cancel(reqID int32) { wasmCancel(reqID) } func RevokeBlob(url string) { wasmRevokeBlob(unsafe.StringData(url), int32(len(url)), int32(len(url))) }