pocketpy/modules/libhv/index.html
2025-09-23 06:50:35 +00:00

487 lines
38 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" class="h-full">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="turbo-cache-control" content="no-cache" data-turbo-track="reload" data-track-token="3.11.0.811925382131">
<!-- See retype.com -->
<meta name="generator" content="Retype 3.11.0">
<!-- Primary Meta Tags -->
<title>libhv | Portable Python 3.x Interpreter in Modern C</title>
<meta name="title" content="libhv | Portable Python 3.x Interpreter in Modern C">
<meta name="description" content="This module is optional. Set option PK_BUILD_MODULE_LIBHV to ON in your CMakeLists.txt to enable it.">
<!-- Canonical -->
<link rel="canonical" href="https://pocketpy.dev/modules/libhv/">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://pocketpy.dev/modules/libhv/">
<meta property="og:title" content="libhv | Portable Python 3.x Interpreter in Modern C">
<meta property="og:description" content="This module is optional. Set option PK_BUILD_MODULE_LIBHV to ON in your CMakeLists.txt to enable it.">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://pocketpy.dev/modules/libhv/">
<meta property="twitter:title" content="libhv | Portable Python 3.x Interpreter in Modern C">
<meta property="twitter:description" content="This module is optional. Set option PK_BUILD_MODULE_LIBHV to ON in your CMakeLists.txt to enable it.">
<script data-cfasync="false">(function(){var cl=document.documentElement.classList,ls=localStorage.getItem("retype_scheme"),hd=cl.contains("dark"),hl=cl.contains("light"),wm=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;if(ls==="dark"||(!ls&&wm&&!hd&&!hl)){cl.remove("light");cl.add("dark")}else if(ls==="light"||(!ls&&!wm&&!hd&&!hl)){cl.remove("dark");cl.add("light")}})();</script>
<link href="../../static/logo.png" rel="icon">
<link href="../../resources/css/retype.css?v=3.11.0.811925382131" rel="stylesheet">
<script data-cfasync="false" src="../../resources/js/config.js?v=3.11.0.811925382131" data-turbo-eval="false" defer></script>
<script data-cfasync="false" src="../../resources/js/retype.js?v=3.11.0" data-turbo-eval="false" defer></script>
<script id="lunr-js" data-cfasync="false" src="../../resources/js/lunr.js?v=3.11.0.811925382131" data-turbo-eval="false" defer></script>
<script id="prism-js" data-cfasync="false" src="../../resources/js/prism.js?v=3.11.0.811925382131" defer></script>
</head>
<body>
<div id="retype-app" class="relative text-base antialiased text-base-text bg-base-bg font-body">
<div class="absolute bottom-0 left-0" style="top: 5rem; right: 50%"></div>
<header id="retype-header" class="sticky top-0 z-30 flex w-full h-16 bg-header-bg border-b border-header-border md:h-20">
<div class="container relative flex items-center justify-between pr-6 grow md:justify-start">
<!-- Mobile menu button skeleton -->
<button v-cloak class="skeleton retype-mobile-menu-button flex items-center justify-center shrink-0 overflow-hidden dark:text-white focus:outline-none rounded-full w-10 h-10 ml-3.5 md:hidden"><svg xmlns="http://www.w3.org/2000/svg" class="mb-px shrink-0" width="24" height="24" viewBox="0 0 24 24" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor"><path d="M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"></path></g></svg></button>
<div v-cloak id="retype-sidebar-left-toggle-button"></div>
<!-- Logo -->
<div class="flex items-center justify-between h-full py-2 md:w-75">
<div class="flex items-center px-2 md:px-6">
<a id="retype-branding-logo" href="../../" class="flex items-center leading-snug text-2xl">
<span class="w-10 mr-2 grow-0 shrink-0 overflow-hidden">
<img class="max-h-10 dark:hidden md:inline-block" src="../../static/logo.png">
<img class="max-h-10 hidden dark:inline-block" src="../../static/logo.png">
</span>
<span class="dark:text-white font-bold line-clamp-1 md:line-clamp-2">pocketpy</span>
</a><span id="retype-branding-label" class="inline-flex mt-1 px-2 py-1 ml-4 text-xs font-medium leading-none items-center rounded-md bg-branding-label-bg text-branding-label-text ring-1 ring-branding-label-border ring-inset md:inline-block">v2.1.2</span>
</div>
<span class="hidden h-8 border-r md:inline-block border-base-border"></span>
</div>
<div class="flex justify-between md:grow">
<!-- Top Nav -->
<nav id="retype-header-nav" class="hidden md:flex">
<ul class="flex flex-col mb-4 md:pl-16 md:mb-0 md:flex-row md:items-center">
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
</g>
</svg>
<span>Home</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
</g>
</svg>
<span>Live Demo</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
</g>
</svg>
<span>Live Examples</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"/>
</g>
</svg>
<span>Github</span>
</a>
</li>
<li class="mr-6">
<a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
</g>
</svg>
<span>Discord</span>
</a>
</li>
</ul>
</nav>
<!-- Header Right Skeleton -->
<div v-cloak class="flex justify-end grow skeleton">
<!-- Search input mock -->
<div class="relative hidden w-40 lg:block lg:max-w-sm lg:ml-auto">
<div class="absolute flex items-center justify-center h-full pl-3 dark:text-dark-300">
<svg xmlns="http://www.w3.org/2000/svg" class="icon-base" width="16" height="16" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 1px;"><g fill="currentColor" ><path d="M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z" ></path></g></svg>
</div>
<input class="w-full h-10 placeholder-search-placeholder transition-colors duration-200 ease-in bg-search-bg border border-transparent rounded md:text-sm hover:border-search-border-hover focus:outline-none focus:border-search-border-focus" style="padding: 0.625rem 0.75rem 0.625rem 2rem" type="text" placeholder="Search">
</div>
<!-- Mobile search button -->
<div class="flex items-center justify-center w-10 h-10 lg:hidden">
<svg xmlns="http://www.w3.org/2000/svg" class="shrink-0 icon-base" width="20" height="20" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor" ><path d="M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z" ></path></g></svg>
</div>
<!-- Dark mode switch placeholder -->
<div class="w-10 h-10 lg:ml-2"></div>
<!-- History button -->
<div class="flex items-center justify-center w-10 h-10" style="margin-right: -0.625rem;">
<svg xmlns="http://www.w3.org/2000/svg" class="shrink-0 icon-base" width="22" height="22" viewBox="0 0 24 24" aria-labelledby="icon" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor" ><g ><path d="M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"></path><path d="M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"></path></g></g></svg>
</div>
</div>
<div v-cloak class="flex justify-end grow">
<div id="retype-mobile-search-button"></div>
<doc-search-desktop></doc-search-desktop>
<doc-theme-switch class="lg:ml-2"></doc-theme-switch>
<doc-history></doc-history>
</div>
</div>
</div>
</header>
<div id="retype-container" class="container relative flex bg-white">
<!-- Sidebar Skeleton -->
<div v-cloak class="fixed flex flex-col shrink-0 duration-300 ease-in-out bg-sidebar-left-bg border-sidebar-left-border sidebar top-20 w-75 border-r h-screen md:sticky transition-transform skeleton">
<div class="flex items-center h-16 px-6">
<input class="w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-filter-bg border border-filter-border rounded shadow-none text-sm focus:outline-none focus:border-filter-border-focus" type="text" placeholder="Filter">
</div>
<div class="pl-6 mt-1 mb-4">
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
</div>
<div class="shrink-0 mt-auto bg-transparent dark:border-base-border">
<a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
<span class="text-xs whitespace-nowrap">Powered by</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
</a>
</div>
</div>
<!-- Sidebar component -->
<doc-sidebar v-cloak>
<template #sidebar-footer>
<div class="shrink-0 mt-auto border-t md:bg-transparent md:border-none dark:border-base-border">
<div class="py-3 px-6 md:hidden border-b dark:border-base-border">
<nav>
<ul class="flex flex-wrap justify-center items-center">
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
</g>
</svg>
<span>Home</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
</g>
</svg>
<span>Live Demo</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
</g>
</svg>
<span>Live Examples</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M12 1C5.923 1 1 5.923 1 12c0 4.867 3.149 8.979 7.521 10.436.55.096.756-.233.756-.522 0-.262-.013-1.128-.013-2.049-2.764.509-3.479-.674-3.699-1.292-.124-.317-.66-1.293-1.127-1.554-.385-.207-.936-.715-.014-.729.866-.014 1.485.797 1.691 1.128.99 1.663 2.571 1.196 3.204.907.096-.715.385-1.196.701-1.471-2.448-.275-5.005-1.224-5.005-5.432 0-1.196.426-2.186 1.128-2.956-.111-.275-.496-1.402.11-2.915 0 0 .921-.288 3.024 1.128a10.193 10.193 0 0 1 2.75-.371c.936 0 1.871.123 2.75.371 2.104-1.43 3.025-1.128 3.025-1.128.605 1.513.221 2.64.111 2.915.701.77 1.127 1.747 1.127 2.956 0 4.222-2.571 5.157-5.019 5.432.399.344.743 1.004.743 2.035 0 1.471-.014 2.654-.014 3.025 0 .289.206.632.756.522C19.851 20.979 23 16.854 23 12c0-6.077-4.922-11-11-11Z"/>
</g>
</svg>
<span>Github</span>
</a>
</li>
<li class="mr-6">
<a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text-weight hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor">
<path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
</g>
</svg>
<span>Discord</span>
</a>
</li>
</ul>
</nav>
</div>
<a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
<span class="text-xs whitespace-nowrap">Powered by</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
</a>
</div>
</template>
</doc-sidebar>
<div class="grow min-w-0 bg-body-bg">
<!-- Render "toolbar" template here on api pages --><!-- Render page content -->
<div class="flex">
<div id="retype-main" class="min-w-0 p-4 grow md:px-16">
<main class="relative pb-12 lg:pt-2">
<div class="retype-markdown" id="retype-content">
<!-- Rendered if sidebar right is enabled -->
<div id="retype-sidebar-right-toggle"></div>
<!-- Page content -->
<doc-anchor-target id="libhv" class="break-words">
<h1>
<doc-anchor-trigger class="header-anchor-trigger" to="#libhv">#</doc-anchor-trigger>
<span>libhv</span>
</h1>
</doc-anchor-target>
<div class="flex mb-6">
<div class="shrink-0 w-1.5 rounded-tl-lg rounded-bl-lg bg-callout-primary"></div>
<div class="flex w-full py-4 border border-l-0 rounded-tr-lg rounded-br-lg doc-callout bg-callout-base-bg border-callout-base-border" role="alert">
<div class="flex items-center ml-4 h-7">
<svg xmlns="http://www.w3.org/2000/svg" class="mb-px text-callout-primary" width="22" height="22" viewBox="0 0 24 24" role="presentation">
<g fill="currentColor"><g>
<path d="M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"></path>
<path d="M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"></path>
<path fill="none" d="M0 0h24v24H0z"></path>
</g></g>
</svg>
</div>
<div class="pr-5 ml-3 w-full">
<p>This module is optional. Set option <code v-pre>PK_BUILD_MODULE_LIBHV</code> to <code v-pre>ON</code> in your <code v-pre>CMakeLists.txt</code> to enable it.</p>
</div>
</div>
</div>
<p><code v-pre>libhv</code> is a git submodule located at <code v-pre>3rd/libhv/libhv</code>. If you cannot find it, please run the following command to initialize the submodule:</p>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-bash"><code v-pre class="language-bash">git submodule update --init --recursive</code></pre>
</doc-codeblock></div>
<p>Simple bindings for <a href="https://github.com/ithewei/libhv">libhv</a>, which provides cross platform implementation of the following:</p>
<ul>
<li>HTTP server</li>
<li>HTTP client</li>
<li>WebSocket server</li>
<li>WebSocket client</li>
</ul>
<doc-anchor-target id="source-code">
<h4>
<doc-anchor-trigger class="header-anchor-trigger" to="#source-code">#</doc-anchor-trigger>
<span>Source code</span>
</h4>
</doc-anchor-target>
<div class="codeblock-wrapper"><doc-codeblock>
<pre translate="no" class="language-python"><code v-pre class="language-python">from typing import Literal, Generator, Callable, Union
WsChannelId = int
HttpStatusCode = int
HttpHeaders = dict[str, str]
ErrorCode = int
class Future[T]:
@property
def completed(self) -&gt; bool: ...
def cancel(self) -&gt; None: ...
def __iter__(self) -&gt; Generator[T, None, None]: ...
class HttpResponse(Future['HttpResponse']):
@property
def status_code(self) -&gt; int: ...
@property
def headers(self) -&gt; dict[str, str]: ...
@property
def text(self) -&gt; str: ...
@property
def content(self) -&gt; bytes: ...
def json(self): ...
class HttpClient:
def get(self, url: str, /, params=None, headers=None, timeout=10) -&gt; HttpResponse: ...
def post(self, url: str, /, params=None, headers=None, data=None, json=None, timeout=10) -&gt; HttpResponse: ...
def put(self, url: str, /, params=None, headers=None, data=None, json=None, timeout=10) -&gt; HttpResponse: ...
def delete(self, url: str, /, params=None, headers=None, timeout=10) -&gt; HttpResponse: ...
class HttpRequest:
@property
def method(self) -&gt; Literal['GET', 'POST', 'PUT', 'DELETE']: ...
@property
def path(self) -&gt; str: ...
@property
def url(self) -&gt; str: ...
@property
def headers(self) -&gt; HttpHeaders: ...
@property
def data(self) -&gt; str | bytes: ...
class HttpServer:
def __init__(self, host: str, port: int, /) -&gt; None: ...
def start(self) -&gt; ErrorCode: ...
def stop(self) -&gt; ErrorCode: ...
def dispatch[T](self, fn: Callable[
[HttpRequest],
T | tuple[T, HttpStatusCode] | tuple[T, HttpStatusCode, HttpHeaders]
], /) -&gt; bool:
&quot;&quot;&quot;Dispatch one HTTP request through `fn`. `fn` should return one of the following:
+ object
+ (object, status_code)
+ (object, status_code, headers)
Return `True` if dispatched, otherwise `False`.
&quot;&quot;&quot;
def ws_set_ping_interval(self, milliseconds: int, /) -&gt; None:
&quot;&quot;&quot;Set WebSocket ping interval in milliseconds.&quot;&quot;&quot;
def ws_close(self, channel: WsChannelId, /) -&gt; ErrorCode:
&quot;&quot;&quot;Close WebSocket channel.&quot;&quot;&quot;
def ws_send(self, channel: WsChannelId, data: str, /) -&gt; int:
&quot;&quot;&quot;Send WebSocket message through `channel`.&quot;&quot;&quot;
def ws_recv(self) -&gt; Union[
tuple[Literal['onopen'], tuple[WsChannelId, HttpRequest]],
tuple[Literal['onmessage'], tuple[WsChannelId, str]],
tuple[Literal['onclose'], WsChannelId],
None
]:
&quot;&quot;&quot;Receive one WebSocket message.
Return one of the following or `None` if nothing to receive.
+ `&quot;onopen&quot;`: (channel, request)
+ `&quot;onclose&quot;`: channel
+ `&quot;onmessage&quot;`: (channel, body)
&quot;&quot;&quot;
class WebSocketClient:
def open(self, url: str, headers=None, /) -&gt; ErrorCode: ...
def close(self) -&gt; ErrorCode: ...
def send(self, data: str, /) -&gt; int:
&quot;&quot;&quot;Send WebSocket message.&quot;&quot;&quot;
def recv(self) -&gt; Union[
tuple[Literal['onopen'], None],
tuple[Literal['onclose'], None],
tuple[Literal['onmessage'], str],
None
]:
&quot;&quot;&quot;Receive one WebSocket message.
Return one of the following or `None` if nothing to receive.
+ `&quot;onopen&quot;`: `None`
+ `&quot;onclose&quot;`: `None`
+ `&quot;onmessage&quot;`: body
&quot;&quot;&quot;
def strerror(errno: ErrorCode, /) -&gt; str:
&quot;&quot;&quot;Get error message by errno via `hv_strerror`.&quot;&quot;&quot;
</code></pre>
</doc-codeblock></div>
<!-- Required only on API pages -->
<doc-toolbar-member-filter-no-results></doc-toolbar-member-filter-no-results>
</div>
<footer id="retype-content-footer" class="clear-both">
<nav id="retype-nextprev" class="print:hidden flex mt-14">
<div class="w-1/2">
<a class="px-5 py-4 h-full flex items-center break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-l-lg transition-colors duration-150 relative hover:z-5" href="../../modules/json/">
<svg xmlns="http://www.w3.org/2000/svg" class="mr-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
<span>
<span class="block text-xs font-normal text-base-text-muted">Previous</span>
<span class="block mt-1">json</span>
</span>
</a>
</div>
<div class="w-1/2">
<a class="px-5 py-4 -mx-px h-full flex items-center justify-end break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-r-lg transition-colors duration-150 relative hover:z-5" href="../../modules/lz4/">
<span>
<span class="block text-xs font-normal text-right text-base-text-muted">Next</span>
<span class="block mt-1">lz4</span>
</span>
<svg xmlns="http://www.w3.org/2000/svg" class="ml-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
</a>
</div>
</nav>
</footer>
</main>
<div id="retype-page-footer" class="print:border-none border-t border-base-border pt-6 mb-8">
<footer class="flex flex-wrap items-center justify-between print:justify-center">
<div id="retype-footer-links" class="print:hidden">
<ul class="flex flex-wrap items-center text-sm">
</ul>
</div>
<div id="retype-copyright" class="print:justify-center py-2 text-footer-text font-footer-link-weight text-sm leading-relaxed"><p>© Copyright 2025 - <a href="https://github.com/blueloveTH">blueloveTH</a> - All rights reserved.</p></div>
</footer>
</div>
</div>
<!-- Rendered if sidebar right is enabled -->
<!-- Sidebar right skeleton-->
<div v-cloak class="fixed top-0 bottom-0 right-0 translate-x-full bg-sidebar-right-bg border-sidebar-right-border lg:sticky lg:border-l lg:shrink-0 lg:pt-6 lg:transform-none sm:w-1/2 lg:w-64 lg:z-0 md:w-104 sidebar-right skeleton">
<div class="pl-5">
<div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
<div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
</div>
</div>
<!-- User should be able to hide sidebar right -->
<doc-sidebar-right v-cloak></doc-sidebar-right>
</div>
</div>
</div>
<doc-search-mobile></doc-search-mobile>
<doc-back-to-top></doc-back-to-top>
</div>
<div id="retype-overlay-target"></div>
<script data-cfasync="false">window.__DOCS__ = { "title": "libhv", level: 2, icon: "file", hasPrism: true, hasMermaid: false, hasMath: false, tocDepth: 23 }</script>
</body>
</html>