Guía de migración de WebAssembly

Anuncios de baja de (P)NaCl

Dado el impulso de la compatibilidad con WebAssembly en varios navegadores, planeamos enfocar nuestros esfuerzos de código nativo en WebAssembly en el futuro y quitar la compatibilidad con PNaCl en el cuarto trimestre de 2019 (excepto para las apps de Chrome). Creemos que el ecosistema dinámico que rodea a WebAssembly lo hace más adecuado para las apps web nuevas y existentes de alto rendimiento, y que el uso de PNaCl es lo suficientemente bajo como para garantizar la baja.

A partir de Chrome 76, PNaCl en la Web abierta se trasladó a una prueba de origen, que es un mecanismo para que los desarrolladores web se registren y obtengan acceso a una función que no está activada de forma predeterminada. Por lo general, se trata de una función nueva propuesta, pero en este caso es una función que dejará de estar disponible. Un desarrollador puede registrarse en la consola de prueba de origen y reciben un token, que puede incorporarse en una página y habilitar la función sin que el usuario tenga que usar una marca. (para obtener más detalles, consulta la guía vinculada). La prueba está programada para durar hasta Chrome 78, aproximadamente hasta diciembre de 2019. Este cambio no afecta a NaCl o PNaCl en extensiones o Apps de Chrome, y al parámetro "enable-nacl" La función experimental de chrome://flags también se puede usar para habilitar PNaCl localmente para realizar pruebas (esta marca también conserva su función actual de habilitar NaCl “nativo” que no es de PNaCl en cualquier página).

Recientemente, también anunciamos que, en el 1ᵉʳ trimestre de 2018, se darán de baja las Apps de Chrome fuera de ChromeOS.

Migración de la cadena de herramientas

Para la mayoría de los casos de uso de (P)NaCl, recomendamos la transición del SDK de NaCl a Emscripten. Es probable que la migración sea bastante sencilla si tu aplicación es portátil a Linux, usa SDL o APIs de POSIX. Si bien la asistencia directa para las APIs de NaCl / Pepper no está disponible, intentamos enumerar los equivalentes de la API web. Para casos de portabilidad más complejos, comunícate con native-client-discuss@googlegroups.com

Migración de API

Aquí describimos el estado de los sustitutos de las plataformas web para cada uno de ellos de las APIs expuestas a (P)NaCl. Además, la tabla enumera la biblioteca o la opción en Emscripten que ofrece el sustituto más cercano.

Esperamos agregar compatibilidad con subprocesos de memoria compartida a WebAssembly en 2017. ya que los subprocesos son cruciales para hacer coincidir el uso más interesante de (P)NaCl diferentes. Los elementos de migración que suponen que los subprocesos futuros son compatibles se marcan a continuación. Si el control de flujo de tu aplicación depende en gran medida de las APIs de bloqueo, es posible que también debas admitir subprocesos para realizar una portabilidad conveniente.

Si bien tratamos de ser precisos en esta tabla, no hay dudas de que hay omisiones o errores. Si encuentras uno, comunícate con nosotros en native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear x SDL (parcial) GAP (parcial): AudioWorkletNode es APROXIMADAMENTE equivalente AudioWorkletSpec está listo, pero AudioDeviceClient puede ser una mejor opción para esta API. La comunidad aún está especificando AudioDeviceClient. Es posible que la worklet no sea el equivalente aproximado de esta API.
GetCurrentConfig SDL AudioContext.* (recupera la configuración pasada)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetTimestamp SDL AudioBufferSourceNode.start (parámetro) Se pasan en cada ocasión en lugar de adjuntarse al búfer.
SetTimestamp SDL AudioBufferSourceNode.start (parámetro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio solo usa números de punto flotante de 32 bits, mientras que PPAPI usa números enteros de 16 bits. En teoría, la PPAPI admite varios tamaños de muestreo. En la práctica, solo admite muestras de 16 bits. Lamentablemente, los desarrolladores solicitaron tamaños de muestra de 16 bits para ahorrar en el uso de memoria. La próxima versión de la especificación de Web Audio implementará la compatibilidad con muestras de 16 bits. Se podría implementar una optimización para AudioBuffer similar a la de Firefox usando un búfer de 16 bits para el audio que proviene de decodeAudioData.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
CreateStereo16Bit GAP GAP: solo se admiten muestras de número de punto flotante de 32 bits La próxima versión de la especificación de Web Audio implementará la compatibilidad con muestras de 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (de la construcción predeterminada) De forma predeterminada, un AudioContext tendrá la tasa de muestreo preferida que coincida con la tasa de muestreo real del dispositivo de audio de hardware.
RecommendSampleFrameCount GAP GAP: Se controlaría con el AudioDeviceClient planificado. Hay un problema abierto para permitir un tamaño especificado por el usuario, pero aún se está definiendo. Lo más probable es que esto se maneje mejor con AudioDeviceClient, que puede indicarte cuál sería el tamaño adecuado para el hardware determinado.

PPB_Console

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Registro utime console.log/warn/error/...
LogWithSource GAP GAP Se considera que la API de Console es un reemplazo lo suficientemente completo, a menos que se presenten casos de uso específicos de los desarrolladores para la funcionalidad que proporciona LogWithSource. Los mapas de origen de Herramientas para desarrolladores se pueden usar para depurar JavaScript transpilado en su idioma fuente original.

PPB_Core

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
getTime utime Fecha().getTime() nueva
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== no definido
CallOnMainThread GAP Worker.postMessage y Atomics.wait Se puede crear una sincronización equivalente.

PPB_FileIO

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) window.chooseFileSystemEntries() Crear y abrir se usan de manera diferente, pero las piezas tienen el mismo poder.
Abrir FS (parcial) window.chooseFileSystemEntries()
Consulta FS (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial): Blob.type también se puede usar para verificar el tipo de MIME. No se pueden determinar el tipo de sistema de archivos, la hora de creación y la hora del último acceso con la API de Native File System.
Pantalla táctil FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
Leer FS (parcial) Blob.slice().arrayBuffer()
Escribir FS (parcial) FileSystemWriter.write()
SetLength FS (parcial) FileSystemWriter.truncate()
Flush GAP (parcial) GAP (parcial): Los archivos se borran cuando se llama a FileSystemWrite.close(). El diseño está pensado, ya que los archivos de la API de Native File System están expuestos al SO. Por lo tanto, se debe realizar una verificación de la Navegación segura antes de que se muestren los datos al SO.
Cerrar FS (parcial) FileSystemWriter.close() No cancela las operaciones pendientes, pero borra los datos escritos hasta el momento en el disco.
ReadToArray GAP Blob.slice().arrayBuffer() o Blob.arrayBuffer() Permite varias lecturas de subrangos en paralelo.

PPB_FileRef

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (parcial) FileSystem.type
GetName FS (parcial) File.name
GetPath FS (parcial) GAP (parcial): Con la API de Native File System, la ruta de acceso relativa de un archivo se puede determinar a partir de la referencia a un directorio que contiene el archivo con FileSystemHandle.resolve(FileSystemHandle). No se puede determinar la ruta de acceso absoluta de un archivo, y el usuario debe otorgar permiso para acceder al directorio que contiene el archivo.
GetParent FS (parcial) GAP (parcial): con la API de Native File System, se puede determinar la ruta de acceso relativa de un archivo a partir de la referencia a un directorio que contenga el archivo mediante FileSystemHandle.resolve(FileSystemHandle) El usuario debe otorgar permiso para acceder al directorio que contiene el archivo.
MakeDirectory FS (parcial) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Pantalla táctil FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true}) Se puede modificar el tiempo de modificación mediante la escritura.
Borrar FS (parcial) FileSystemDirectoryHandle.removeEntry() A diferencia de la PPAPI, los directorios no tienen que estar vacíos.
Cambiar nombre FS (parcial) GAP (parcial): con la API de Native File System, el archivo se puede escribir con el nuevo nombre utilizando una combinación de FileSystemFileHandle.getFile() para el nombre nuevo y FileSystemFileHandle.createWriter().write() con el contenido del archivo anterior. Luego, usa FileSystemDirectoryHandle.removeEntry() para borrar el archivo anterior. No existe una API directa que haga esto en un solo paso en la API de Native File System.
Consulta GAP (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial): Blob.type también se puede usar para verificar el tipo de MIME. No se pueden determinar el tipo de sistema de archivos, la hora de creación y la hora del último acceso con la API de Native File System.
ReadDirectoryEntries FS (parcial) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) window.requestFileSystem La API de JS hace ambas cosas en un solo paso
Abrir GAP window.requestFileSystem La API de JS hace ambas acciones en un solo paso.
GetType GAP FileSystem.type

PPB_Fullscreen

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Muestra SDL Gamepad.* El objeto Gamepad expone una marca de tiempo relativa a navigationStart. Se actualiza cuando se reciben datos del hardware: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL Canvas.getContext('2d')
Describe SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Desplazamiento GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parcial): Se puede implementar dibujando el lienzo sobre sí mismo, con un desplazamiento, usandodrawImage y, luego, rellenando el resto.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Sin equivalente directo GAP (parcial) - Siempre hay una limpieza implícita al final del código de dibujo. esto es poco probable cambiar. Sin embargo, la combinación de OffscreenCanvas y ImageBitmapRenderingContext proporciona una funcionalidad similar.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parcial): la exposición de OpenGL ES 3.0 de WebGL 2.0 y Emscripten admite búferes de fotogramas multimuestras definidos por el usuario, en los que se pueden establecer todos los parámetros configurables a través de PPAPI.
Crear SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Sin equivalente directo GAP (parcial): Siempre hay una limpieza implícita al final del código de dibujo, y es poco probable que cambie. Sin embargo, la combinación de OffscreenCanvas y ImageBitmapRenderingContext proporciona una funcionalidad similar.

PPB_ImageData

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetNativeImageDataFormat SDL ImageData exige el orden RGBA
IsImageDataFormatSupported SDL ImageData impone el orden RGBA
Crear SDL CanvasRenderingContext2d.createImageData
Describir SDL ImageData nunca tiene un stride.
Mapa SDL ImageData.data
Dejar de asignar SDL ImageData.data

PPB_InputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
RequestInputEvents SDL Sin equivalente directo La falta de esta función probablemente sea menos relevante, ya que JS/Wasm se ejecuta en el subproceso principal y puede filtrar eventos de forma más económica sin incurrir en un recorrido de ida y vuelta entre procesos.
RequestFilteringInputEvents SDL mouse* tecla* rueda* toque* composición* eventos
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendientes de la clase de evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL "dblclick" frente a "mousedown" Eventos
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP: deltaMode contiene esta información, pero de forma incompleta. Hay un debate sobre la implementación de una API de WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017.
GetScrollByPage GAP GAP: deltaMode contiene esta información, pero de forma incompleta. Hay un debate sobre la implementación de una API de WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017.

PPB_KeyboardInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (para averiguarlo por tu cuenta)

PPB_IMEInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP: Sin equivalente directo Estos datos se pueden recuperar desde CompositionEvent.data.
GetSegmentOffset GAP GAP: Sin equivalente directo
GetTargetSegment GAP GAP: Sin equivalente directo
GetSelection GAP GAP: Sin equivalente directo

PPB_Instance

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
BindGraphics SDL Canvas.getContext (no sucede ya que la vinculación es automática).
IsFullFrame GAP GAP: No hay equivalentes a los controladores de tipos MIME. Las aplicaciones de NaCl se pueden registrar para manejar un tipo de MIME concreto y poseer todo el documento.
DidCreate N/A <Element>[key] El acceso general al DOM te permite extraer atributos de etiqueta.
DidDestroy N/A N/A No activado para NaCl
DidChangeView N/A "Cambio de tamaño" del elemento Evento
DidChangeFocus N/A Eventos "focus", "focusin" y "focusout" del elemento
HandleDocumentLoad N/A GAP: No hay forma de registrarse como controlador de tipo MIME. Los módulos de NaCl a través de apps y una entrada de manifiesto se pueden configurar para controlar tipos mime específicos.

PPB_MediaStreamAudioTrack

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Configurar GAP getUserMedia() Las restricciones de getUserMedia() pueden proporcionar los valores de configuración que se usarán en MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: Sin equivalente
RecycleBuffer GAP GAP: Sin equivalente
Cerrar GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP Captura de lienzo Canvas Capture permite introducir fotogramas de video de forma programática.
Configurar GAP applyConstraints(), getUserMedia() GAP (parcial): El alcance de las configuraciones disponibles en la API web puede diferir de la PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP: no equivale a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream no se puede precargar, por lo que nunca se almacenará en búfer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: no equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: Sin equivalente
RecycleFrame GAP GAP: Sin equivalente
Cerrar GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP: Sin equivalente
PutFrame GAP GAP: Sin equivalente

PPB_MessageLoop

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear N/A En su mayoría, los trabajadores obtienen un bucle de eventos implícito.
GetForMainThread N/A En general, los trabajadores obtienen un bucle de eventos implícito.
GetCurrent N/A En general, los trabajadores obtienen un bucle de eventos implícito.
AttachToCurrentThread N/A En general, los trabajadores obtienen un bucle de eventos implícito.
Ejecutar N/A La mayoría es discutible, los trabajadores obtienen un bucle de eventos implícitos.
PostWork N/A En general, los trabajadores obtienen un bucle de eventos implícito.
PostQuit N/A En su mayoría, los trabajadores obtienen un bucle de eventos implícito.

PPB_Messaging

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
SetCursor SDL Element.style.cursor Se admite el mismo conjunto de cursores de archivo. Puedes usar cursores personalizados con url(..). Los cursores personalizados dinámicos se pueden hacer con URI de datos. CSS3 admite la especificación del hotspot.

PPB_MouseLock

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Varios métodos OpenGLES Cerca de WebGL 1.0 en funcionalidad.
x OffscreenCanvas

PPB_TextInputController

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
SetTextInputType GAP GAP: Posiblemente se completó con la API de Input Method Editor. A algunos desarrolladores les gustaría poder dar pistas de esta manera o, preferentemente, la capacidad de interceptar y mostrar eventos o resultados de IME intercalados dentro de un lienzo.
UpdateCaretPosition GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/

PPB_URLLoader

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind new XMLHttpRequest();
Abrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: Sin equivalente XMLHTTPRequest
GetUploadProgress embind XMLHttpRequest "progreso" Evento
GAP FetchObserver Aún no se especifica ni se implementa; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest "progreso" Evento
GAP FetchObserver Aún no se especifica ni se implementa; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Recuperar respuesta.*
ReadResponseBody embind XMLHttpRequest.response
embind Cuerpo.* (La respuesta es un cuerpo)
FinishStreamingToFile embind GAP: Sin equivalente directo XMLHttpRequest y Fetch suponen la transmisión a la memoria, en lugar de directamente a un almacenamiento.
Cerrar embind XMLHttpRequest.abort
GAP API de Fetch: AbortSignal y AbortController

PPB_URLRequestInfo

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind XMLHttpRequest
embind Solicitud de recuperación
SetProperty GAP GAP: No hay un equivalente directo para XMLHttpRequest. XMLHttpRequest no proporciona formas directas de limitar por solicitud los siguientes redireccionamientos, transmitir a un archivo, establecer URL de referencia o políticas de credenciales.
embind Solicitud.*
AppendDataToBody embind XMLHttpRequest.send GAP: Ambas deben tener el cuerpo completo, en lugar de un fragmento.
embind recuperar(.., opciones:cuerpo)
AppendFileToBody GAP transmisión de carga de fetch() https://www.chromestatus.com/features/5274139738767360
N/A <form> También puedes leer con FileReader y subir, pero eso es más como AppendDataToBody.

PPB_URLResponseInfo

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetProperty embind XMLHttpRequest.getAllResponseHeaders + otros
embind Recuperar respuesta.*
GetBodyAsFileRef embind Recuperar respuesta (cuerpo) .blob() Supone que la capa de almacenamiento optimiza la transferencia.

PPB_Var

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Obtener embind Arreglo[i]
Establecer embind Arreglo[i] = x
GetLength embind Array.length
SetLength embind Longitud de la matriz = n

PPB_VarArrayBuffer

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind nuevo ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mapa GAP GAP: Sin equivalente directo Los módulos Asm.js / Wasm no pueden asignar regiones de un ArrayBuffer que no sean su montón de memoria lineal único. Es posible que, en el futuro, varios recuerdos o la asignación de memoria mejoren esta situación.
Dejar de asignar GAP GAP: Sin equivalente directo

PPB_VarDictionary

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind {}
Obtener embind <Object>[i]
Establecer embind <Object>[i] = x
Borrar embind borrar <Object>[i]
HasKey embind x en <Object>
GetKeys embind for (k in <Object>) {} No tiene un equivalente literal, pero se puede compilar.

PPB_VideoDecoder

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP GAP: se controlaría con la API de WebCodecs propuesta mediante el uso de VideoDecoder(). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inicialización GAP GAP: Se controlaría con la API de WebCodecs propuesta mediante los parámetros de inicialización de VideoDecoder() (VideoDecoderInitParameters). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP: se controlaría con la API de WebCodecs propuesta mediante ReadableStream.pipeThrough(VideoDecoder). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP GAP: se controlaría con la API de WebCodecs propuesta mediante ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP GAP: Se controlaría con la API de WebCodecs propuesta. El diseño actual reciclará automáticamente las imágenes y mantendrá el proceso de decodificación en curso. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP: Se controlaría con la API de WebCodecs propuesta. Se llamará a la API Flush(), sin embargo, aún se está analizando cómo se secuenciará en relación con las llamadas de decodificación. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Restablecer GAP GAP: Se controlaría con la API propuesta de WebCodecs destruyendo la instancia de VideoDecoder y creando una nueva. Esto no será tan eficiente como un método de restablecimiento dedicado, pero todavía se está analizando la semántica de una API de Reset(). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP GAP: se controlaría con la API de WebCodecs propuesta a través de VideoEncoder().
GetSupportedProfiles GAP GAP (parcial): navigator.mediaCapabilities.encodingInfo() Los perfiles compatibles se deben verificar uno por uno.
Inicialización GAP GAP: Se controlaría con la API propuesta de WebCodecs usando los parámetros de inicialización de VideoEncoder().
GetFramesRequired GAP GAP: Sin equivalente Es poco probable que se exponga el grupo de marcos que usa internamente la API de Web Codecs.
GetFrameCodedSize GAP GAP: Sin equivalente Es poco probable que se exponga el grupo de fotogramas que usa internamente la API de Web Codecs.
GetVideoFrame GAP GAP: Se controlaría con la API propuesta de WebCodecs mediante ReadableStream.pipeThrough(VideoEncoder). Esto codificaría directamente los datos en la transmisión Readable, en lugar de tomar un solo fotograma para completarlos con datos antes de la codificación.
Codifica GAP GAP: se controlaría con la API propuesta de WebCodecs mediante ReadableStream.pipeThrough(VideoEncoder).
GetBitstreamBuffer GAP GAP: Se controlaría con la API de WebCodecs propuesta. El diseño actual pasará automáticamente por el búfer de flujo de bits codificado que se canaliza. Actualmente, la API de WebCodecs supone que el búfer de flujo de bits se puede copiar en lugar de agruparse, por lo que no será necesario reciclarlo.
RecycleBitstreamBuffer GAP GAP: Se controlará con la API propuesta de WebCodecs. El diseño actual reciclará automáticamente el búfer para mantener activo el proceso de codificación. Es poco probable que esto cambie en el futuro, ya que las implicaciones de rendimiento son menores.
RequestEncodingParametersChange GAP GAP: se administraría mediante la API de Web Codecs propuesta. Algunos parámetros se podrán cambiar sobre la marcha, mientras que otros requerirán que se elimine el codificador.
Cerrar GAP GAP: se controlaría con la API de WebCodecs propuesta mediante el uso de VideoEncoder.Close().

PPB_VideoFrame

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetTimestamp GAP GAP: Se controlará con la API propuesta de WebCodecs.
SetTimestamp GAP GAP: Se controlará con la API propuesta de WebCodecs.
GetFormat GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetSize GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetDataBuffer GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetDataBufferSize GAP GAP: Se controlaría con la API de WebCodecs propuesta.

PPB_View

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Se refiere al documento en lugar de a un solo elemento.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Element>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP WebSocket.WebSocket
Conectar GAP WebSocket.WebSocket(url, ...) Evento "open" de WebSocket
Cerrar GAP WebSocket.close
ReceiveMessage GAP Evento "message" de WebSocket Evento "error" de WebSocket Evento "close" de WebSocket
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Gráficos3DContexto perdido SDL Evento "webglcontextlost" del lienzo

PPP_InputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
DidCreate N/A &lt;Element&gt;[key] El acceso general al DOM te permite extraer atributos de etiqueta.
DidDestroy N/A N/A No activado para NaCl
DidChangeView N/A "Cambio de tamaño" del elemento Evento
DidChangeFocus N/A Eventos "focus", "focusin" y "focusout" del elemento
HandleDocumentLoad N/A GAP: No hay forma de registrarse como controlador de tipo MIME. Módulos de NaCl a través de aplicaciones + una entrada de manifiesto pueden configurarse para manejar determinados tipos de MIME.

PPP_MessageHandler

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleMessage embind Evento "message" de MessagePort Evento "message" de Window
HandleBlockingMessage N/A GAP: Sin equivalente directo Se puede realizar una sincronización similar fuera del subproceso principal con Atomics.wait. Esto se agregó para admitir la emulación de APIs de complementos síncronas.

PPP_Messaging

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleMessage embind Evento "message" de MessagePort Evento "message" de Window

PPP_MouseLock

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
MouseLockLost SDL Eventos "pointerlockchange" y "pointerlockerror" del elemento

IRT

PPB_Audio

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear x SDL (parcial) GAP (parcial): AudioWorkletNode es APROXIMADAMENTE equivalente AudioWorkletSpec está listo, pero AudioDeviceClient puede ser una mejor opción para esta API. La comunidad aún está especificando AudioDeviceClient. Es posible que la worklet no sea el equivalente aproximado de esta API.
GetCurrentConfig SDL AudioContext.* (recupera la configuración pasada)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetTimestamp SDL AudioBufferSourceNode.start (parámetro) Se pasan en cada ocasión en lugar de adjuntarse al búfer.
SetTimestamp SDL AudioBufferSourceNode.start (parámetro)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio solo usa números de punto flotante de 32 bits, mientras que PPAPI usa números enteros de 16 bits. En teoría, la PPAPI admite varios tamaños de muestreo. En la práctica, solo admite muestras de 16 bits. Lamentablemente, los desarrolladores solicitaron tamaños de muestra de 16 bits para ahorrar en el uso de memoria. La próxima versión de la especificación de Web Audio implementará la compatibilidad con muestras de 16 bits. Se podría implementar una optimización para AudioBuffer similar a la de Firefox usando un búfer de 16 bits para el audio que proviene de decodeAudioData.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
CreateStereo16Bit GAP GAP: solo se admiten muestras de número de punto flotante de 32 bits La próxima versión de la especificación de Web Audio implementará la compatibilidad con muestras de 16 bits.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (de la construcción predeterminada) De forma predeterminada, un AudioContext tendrá la tasa de muestreo preferida que coincida con la tasa de muestreo real del dispositivo de audio de hardware.
RecommendSampleFrameCount GAP GAP: Se controlaría con el AudioDeviceClient planificado. Hay un problema abierto para permitir un tamaño especificado por el usuario, pero aún se está definiendo. Lo más probable es que esto se maneje mejor con AudioDeviceClient, que puede indicarte cuál sería el tamaño adecuado para el hardware determinado.

PPB_Console

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Registro utime console.log/warn/error/...
LogWithSource GAP GAP Se considera que la API de Console es un reemplazo lo suficientemente completo, a menos que se presenten casos de uso específicos de los desarrolladores para la funcionalidad que proporciona LogWithSource. Los mapas de origen de Herramientas para desarrolladores se pueden usar para depurar JavaScript transpilado en su idioma fuente original.

PPB_Core

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
getTime utime Fecha().getTime() nueva
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== no definido
CallOnMainThread GAP Worker.postMessage y Atomics.wait Se puede crear una sincronización equivalente.

PPB_FileIO

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) window.chooseFileSystemEntries() Crear y abrir se usan de manera diferente, pero las piezas tienen el mismo poder.
Abrir FS (parcial) window.chooseFileSystemEntries()
Consulta FS (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial): Blob.type también se puede usar para verificar el tipo de MIME. No se pueden determinar el tipo de sistema de archivos, la hora de creación y la hora del último acceso con la API de Native File System.
Pantalla táctil FS (parcial) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
Leer FS (parcial) Blob.slice().arrayBuffer()
Escribir FS (parcial) FileSystemWriter.write()
SetLength FS (parcial) FileSystemWriter.truncate()
Flush GAP (parcial) GAP (parcial): Los archivos se borran cuando se llama a FileSystemWrite.close(). El diseño está pensado, ya que los archivos de la API de Native File System están expuestos al SO. Por lo tanto, se debe realizar una verificación de la Navegación segura antes de que se muestren los datos al SO.
Cerrar FS (parcial) FileSystemWriter.close() No cancela las operaciones pendientes, pero borra los datos escritos hasta el momento en el disco.
ReadToArray GAP Blob.slice().arrayBuffer() o Blob.arrayBuffer() Permite varias lecturas de subrangos en paralelo.

PPB_FileRef

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (parcial) FileSystem.type
GetName FS (parcial) File.name
GetPath FS (parcial) GAP (parcial): Con la API de Native File System, la ruta de acceso relativa de un archivo se puede determinar a partir de la referencia a un directorio que contiene el archivo con FileSystemHandle.resolve(FileSystemHandle). No se puede determinar la ruta de acceso absoluta de un archivo, y el usuario debe otorgar permiso para acceder al directorio que contiene el archivo.
GetParent FS (parcial) GAP (parcial): con la API de Native File System, se puede determinar la ruta de acceso relativa de un archivo a partir de la referencia a un directorio que contenga el archivo mediante FileSystemHandle.resolve(FileSystemHandle) El usuario debe otorgar permiso para acceder al directorio que contiene el archivo.
MakeDirectory FS (parcial) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Pantalla táctil FS (parcial) FileSystemDirectoryHandle.getFile("name", {create: true}) Se puede modificar el tiempo de modificación mediante la escritura.
Borrar FS (parcial) FileSystemDirectoryHandle.removeEntry() A diferencia de la PPAPI, los directorios no tienen que estar vacíos.
Cambiar nombre FS (parcial) GAP (parcial): con la API de Native File System, el archivo se puede escribir con el nuevo nombre utilizando una combinación de FileSystemFileHandle.getFile() para el nombre nuevo y FileSystemFileHandle.createWriter().write() con el contenido del archivo anterior. Luego, usa FileSystemDirectoryHandle.removeEntry() para borrar el archivo anterior. No existe una API directa que haga esto en un solo paso en la API de Native File System.
Consulta GAP (parcial) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (parcial): Blob.type también se puede usar para verificar el tipo de MIME. No se pueden determinar el tipo de sistema de archivos, la hora de creación y la hora del último acceso con la API de Native File System.
ReadDirectoryEntries FS (parcial) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear FS (parcial) window.requestFileSystem La API de JS hace ambas cosas en un solo paso
Abrir GAP window.requestFileSystem La API de JS hace ambas acciones en un solo paso.
GetType GAP FileSystem.type

PPB_Fullscreen

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Muestra SDL Gamepad.* El objeto Gamepad expone una marca de tiempo relativa a navigationStart. Se actualiza cuando se reciben datos del hardware: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL Canvas.getContext('2d')
Describe SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Desplazamiento GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP (parcial): Se puede implementar dibujando el lienzo sobre sí mismo, con un desplazamiento, usandodrawImage y, luego, rellenando el resto.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Flush GAP Sin equivalente directo GAP (parcial): Siempre hay una limpieza implícita al final del código de dibujo, y es poco probable que cambie. Sin embargo, la combinación de OffscreenCanvas y ImageBitmapRenderingContext proporcionan una funcionalidad similar.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (parcial): la exposición de OpenGL ES 3.0 de WebGL 2.0 y Emscripten admite búferes de fotogramas multimuestras definidos por el usuario, en los que se pueden establecer todos los parámetros configurables a través de PPAPI.
Crear SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP Sin equivalente directo GAP (parcial) - Siempre hay una limpieza implícita al final del código de dibujo. esto es poco probable cambiar. Sin embargo, la combinación de OffscreenCanvas y ImageBitmapRenderingContext proporciona una funcionalidad similar.

PPB_ImageData

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetNativeImageDataFormat SDL ImageData exige el orden RGBA
IsImageDataFormatSupported SDL ImageData impone el orden RGBA
Crear SDL CanvasRenderingContext2d.createImageData
Describir SDL ImageData nunca tiene un stride.
Mapa SDL ImageData.data
Dejar de asignar SDL ImageData.data

PPB_InputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
RequestInputEvents SDL Sin equivalente directo La falta de esta función probablemente sea menos relevante, ya que JS/Wasm se ejecuta en el subproceso principal y puede filtrar eventos de forma más económica sin incurrir en un recorrido de ida y vuelta entre procesos.
RequestFilteringInputEvents SDL mouse* tecla* rueda* toque* composición* eventos
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Descendientes de la clase de evento
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL "dblclick" frente a "mousedown" Eventos
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP: deltaMode contiene esta información, pero de forma incompleta. Hay un debate sobre la implementación de una API de WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017.
GetScrollByPage GAP GAP: deltaMode contiene esta información, pero de forma incompleta. Hay un debate sobre la implementación de una API de WheelEvent.deltaMode: https://github.com/w3c/uievents/issues/181#issuecomment-537811017.

PPB_KeyboardInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (para averiguarlo por tu cuenta)

PPB_IMEInputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP: Sin equivalente directo Estos datos se pueden recuperar desde CompositionEvent.data.
GetSegmentOffset GAP GAP: Sin equivalente directo
GetTargetSegment GAP GAP: Sin equivalente directo
GetSelection GAP GAP: Sin equivalente directo

PPB_Instance

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
BindGraphics SDL Canvas.getContext (no sucede ya que la vinculación es automática).
IsFullFrame GAP GAP: No hay equivalentes a los controladores de tipos MIME. Las aplicaciones de NaCl se pueden registrar para manejar un tipo de MIME concreto y poseer todo el documento.
DidCreate N/A &lt;Element&gt;[key] El acceso general al DOM te permite extraer atributos de etiqueta.
DidDestroy N/A N/A No activado para NaCl
DidChangeView N/A "Cambio de tamaño" del elemento Evento
DidChangeFocus N/A Eventos "focus", "focusin" y "focusout" del elemento
HandleDocumentLoad N/A GAP: No hay forma de registrarse como controlador de tipo MIME. Los módulos de NaCl a través de apps y una entrada de manifiesto se pueden configurar para controlar tipos mime específicos.

PPB_MediaStreamAudioTrack

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Configurar GAP getUserMedia() Las restricciones de getUserMedia() pueden proporcionar los valores de configuración que se usarán en MediaStreamTrack.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP: Sin equivalente
RecycleBuffer GAP GAP: Sin equivalente
Cerrar GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP Captura de lienzo Canvas Capture permite introducir fotogramas de video de forma programática.
Configurar GAP applyConstraints(), getUserMedia() GAP (parcial): El alcance de las configuraciones disponibles en la API web puede diferir de la PPAPI.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP GAP: no equivale a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream no se puede precargar, por lo que nunca se almacenará en búfer: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP GAP: no equivalente a PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP: Sin equivalente
RecycleFrame GAP GAP: Sin equivalente
Cerrar GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP: Sin equivalente
PutFrame GAP GAP: Sin equivalente

PPB_MessageLoop

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear N/A En su mayoría, los trabajadores obtienen un bucle de eventos implícito.
GetForMainThread N/A En general, los trabajadores obtienen un bucle de eventos implícito.
GetCurrent N/A En general, los trabajadores obtienen un bucle de eventos implícito.
AttachToCurrentThread N/A En general, los trabajadores obtienen un bucle de eventos implícito.
Ejecutar N/A La mayoría es discutible, los trabajadores obtienen un bucle de eventos implícitos.
PostWork N/A En general, los trabajadores obtienen un bucle de eventos implícito.
PostQuit N/A En su mayoría, los trabajadores obtienen un bucle de eventos implícito.

PPB_Messaging

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
PostMessage N/A Window.postMessage
RegisterMessageHandler N/A Window.addEventListener
UnregisterMessageHandler N/A Window.removeEventListener

PPB_MouseCursor

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
SetCursor SDL Element.style.cursor Se admite el mismo conjunto de cursores de archivo. Puedes usar cursores personalizados con url(..). Los cursores personalizados dinámicos se pueden hacer con URI de datos. CSS3 admite la especificación del hotspot.

PPB_MouseLock

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Varios métodos OpenGLES Cerca de WebGL 1.0 en funcionalidad.
x OffscreenCanvas

PPB_TextInputController

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
SetTextInputType GAP GAP: Posiblemente se completó con la API de Input Method Editor. A algunos desarrolladores les gustaría poder dar pistas de esta manera o, preferentemente, la capacidad de interceptar y mostrar eventos o resultados de IME intercalados dentro de un lienzo.
UpdateCaretPosition GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP: Posiblemente se completó con la API de Input Method Editor. https://www.w3.org/TR/ime-api/

PPB_URLLoader

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind new XMLHttpRequest();
Abrir embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP: Sin equivalente XMLHTTPRequest
GetUploadProgress embind XMLHttpRequest "progreso" Evento
GAP FetchObserver Aún no se especifica ni se implementa; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest "progreso" Evento
GAP FetchObserver Aún no se especifica ni se implementa; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Recuperar respuesta.*
ReadResponseBody embind XMLHttpRequest.response
embind Cuerpo.* (La respuesta es un cuerpo)
FinishStreamingToFile embind GAP: Sin equivalente directo XMLHttpRequest y Fetch suponen la transmisión a la memoria, en lugar de directamente a un almacenamiento.
Cerrar embind XMLHttpRequest.abort
GAP API de Fetch: AbortSignal y AbortController

PPB_URLRequestInfo

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind XMLHttpRequest
embind Solicitud de recuperación
SetProperty GAP GAP: No hay un equivalente directo para XMLHttpRequest. XMLHttpRequest no proporciona formas directas de limitar por solicitud los siguientes redireccionamientos, transmitir a un archivo, establecer URL de referencia o políticas de credenciales.
embind Solicitud.*
AppendDataToBody embind XMLHttpRequest.send GAP: Ambas deben tener el cuerpo completo, en lugar de un fragmento.
embind recuperar(.., opciones:cuerpo)
AppendFileToBody GAP transmisión de carga de fetch() https://www.chromestatus.com/features/5274139738767360
N/A &lt;form&gt; También puedes leer con FileReader y subir, pero eso es más como AppendDataToBody.

PPB_URLResponseInfo

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetProperty embind XMLHttpRequest.getAllResponseHeaders + otros
embind Recuperar respuesta.*
GetBodyAsFileRef embind Recuperar respuesta (cuerpo) .blob() Supone que la capa de almacenamiento optimiza la transferencia.

PPB_Var

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource N/A N/A
VarToResource N/A N/A

PPB_VarArray

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Obtener embind Arreglo[i]
Establecer embind Arreglo[i] = x
GetLength embind Array.length
SetLength embind Longitud de la matriz = n

PPB_VarArrayBuffer

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind nuevo ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Mapa GAP GAP: Sin equivalente directo Los módulos Asm.js / Wasm no pueden asignar regiones de un ArrayBuffer que no sean su montón de memoria lineal único. Es posible que, en el futuro, varios recuerdos o la asignación de memoria mejoren esta situación.
Dejar de asignar GAP GAP: Sin equivalente directo

PPB_VarDictionary

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear embind {}
Obtener embind <Object>[i]
Establecer embind <Object>[i] = x
Borrar embind borrar <Object>[i]
HasKey embind x en <Object>
GetKeys embind for (k in <Object>) {} No tiene un equivalente literal, pero se puede compilar.

PPB_VideoDecoder

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP GAP: se controlaría con la API de WebCodecs propuesta mediante el uso de VideoDecoder(). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Inicialización GAP GAP: Se controlaría con la API de WebCodecs propuesta mediante los parámetros de inicialización de VideoDecoder() (VideoDecoderInitParameters). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP: se controlaría con la API de WebCodecs propuesta mediante ReadableStream.pipeThrough(VideoDecoder). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP GAP: se controlaría con la API de WebCodecs propuesta mediante ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP GAP: Se controlaría con la API de WebCodecs propuesta. El diseño actual reciclará automáticamente las imágenes y mantendrá el proceso de decodificación en curso. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Flush GAP GAP: Se controlaría con la API de WebCodecs propuesta. Se llamará a la API Flush(), sin embargo, aún se está analizando cómo se secuenciará en relación con las llamadas de decodificación. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Restablecer GAP GAP: Se controlaría con la API propuesta de WebCodecs destruyendo la instancia de VideoDecoder y creando una nueva. Esto no será tan eficiente como un método de restablecimiento dedicado, pero todavía se está analizando la semántica de una API de Reset(). https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP GAP: se controlaría con la API de WebCodecs propuesta a través de VideoEncoder().
GetSupportedProfiles GAP GAP (parcial): navigator.mediaCapabilities.encodingInfo() Los perfiles compatibles se deben verificar uno por uno.
Inicialización GAP GAP: Se controlaría con la API propuesta de WebCodecs usando los parámetros de inicialización de VideoEncoder().
GetFramesRequired GAP GAP: Sin equivalente Es poco probable que se exponga el grupo de marcos que usa internamente la API de Web Codecs.
GetFrameCodedSize GAP GAP: Sin equivalente Es poco probable que se exponga el grupo de fotogramas que usa internamente la API de Web Codecs.
GetVideoFrame GAP GAP: Se controlaría con la API propuesta de WebCodecs mediante ReadableStream.pipeThrough(VideoEncoder). Esto codificaría directamente los datos en la transmisión Readable, en lugar de tomar un solo fotograma para completarlos con datos antes de la codificación.
Codifica GAP GAP: se controlaría con la API propuesta de WebCodecs mediante ReadableStream.pipeThrough(VideoEncoder).
GetBitstreamBuffer GAP GAP: Se controlaría con la API de WebCodecs propuesta. El diseño actual pasará automáticamente por el búfer de flujo de bits codificado que se canaliza. Actualmente, la API de WebCodecs supone que el búfer de flujo de bits se puede copiar en lugar de agruparse, por lo que no será necesario reciclarlo.
RecycleBitstreamBuffer GAP GAP: Se controlará con la API propuesta de WebCodecs. El diseño actual reciclará automáticamente el búfer para mantener activo el proceso de codificación. Es poco probable que esto cambie en el futuro, ya que las implicaciones de rendimiento son menores.
RequestEncodingParametersChange GAP GAP: se administraría mediante la API de Web Codecs propuesta. Algunos parámetros se podrán cambiar sobre la marcha, mientras que otros requerirán que se elimine el codificador.
Cerrar GAP GAP: se controlaría con la API de WebCodecs propuesta mediante el uso de VideoEncoder.Close().

PPB_VideoFrame

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
GetTimestamp GAP GAP: Se controlará con la API propuesta de WebCodecs.
SetTimestamp GAP GAP: Se controlará con la API propuesta de WebCodecs.
GetFormat GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetSize GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetDataBuffer GAP GAP: Se controlaría con la API de WebCodecs propuesta.
GetDataBufferSize GAP GAP: Se controlaría con la API de WebCodecs propuesta.

PPB_View

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Se refiere al documento en lugar de a un solo elemento.
IsVisible embind IntersectionObserver
IsPageVisible embind document.visibilityState
GetClipRect embind IntersectionObserver
GetDeviceScale embind window.devicePixelRatio
GetCSSScale embind <Element>.getBoundingClientRect().width / <Element>.offsetWidth
GetScrollOffset embind <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear GAP WebSocket.WebSocket
Conectar GAP WebSocket.WebSocket(url, ...) Evento "open" de WebSocket
Cerrar GAP WebSocket.close
ReceiveMessage GAP Evento "message" de WebSocket Evento "error" de WebSocket Evento "close" de WebSocket
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Gráficos3DContexto perdido SDL Evento "webglcontextlost" del lienzo

PPP_InputEvent

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleInputEvent SDL Element.addEventListener

PPP_Instance

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
DidCreate N/A &lt;Element&gt;[key] El acceso general al DOM te permite extraer atributos de etiqueta.
DidDestroy N/A N/A No activado para NaCl
DidChangeView N/A "Cambio de tamaño" del elemento Evento
DidChangeFocus N/A Eventos "focus", "focusin" y "focusout" del elemento
HandleDocumentLoad N/A GAP: No hay forma de registrarse como controlador de tipo MIME. Módulos de NaCl a través de aplicaciones + una entrada de manifiesto pueden configurarse para manejar determinados tipos de MIME.

PPP_MessageHandler

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleMessage embind Evento "message" de MessagePort Evento "message" de Window
HandleBlockingMessage N/A GAP: Sin equivalente directo Se puede realizar una sincronización similar fuera del subproceso principal con Atomics.wait. Esto se agregó para admitir la emulación de APIs de complementos síncronas.

PPP_Messaging

Método de la PPAPI Asume subprocesos Emscripten API web Limitaciones
HandleMessage embind Evento "message" de MessagePort Evento "message" de Window

PPP_MouseLock

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
MouseLockLost SDL Eventos "pointerlockchange" y "pointerlockerror" del elemento

PPAPI (aplicaciones)

PPB_HostResolver

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear x GAP GAP (parcial): sin equivalente directo
Resolver x GAP GAP (parcial): Sin equivalente directo
GetCanonicalName x GAP GAP (parcial): Sin equivalente directo
GetNetAddressCount x GAP GAP (parcial): Sin equivalente directo
GetNetAddress x GAP GAP (parcial): Sin equivalente directo

PPB_NetAddress

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
CreateFromIPv4Address x GAP GAP (parcial): sin equivalente directo
CreateFromIPv6Address x GAP GAP (parcial): sin equivalente directo
GetFamily x GAP GAP (parcial): sin equivalente directo
DescribeAsString x GAP GAP (parcial): Sin equivalente directo
DescribeAsIPv4Address x GAP GAP (parcial): Sin equivalente directo
DescribeAsIPv6Address x GAP GAP (parcial): sin equivalente directo

PPB_NetworkList

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetCount x GAP GAP: Sin equivalente directo
GetName x GAP GAP: Sin equivalente directo
GetType x GAP GAP: Sin equivalente directo
GetState x GAP GAP: Sin equivalente directo
GetIpAddress x GAP GAP: Sin equivalente directo
GetDisplayName x GAP GAP: Sin equivalente directo
GetMTU x GAP GAP: Sin equivalente directo

PPB_NetworkMonitor

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
Crear x GAP GAP: Sin equivalente directo
UpdateNetworkList x GAP GAP: Sin equivalente directo

PPB_NetworkProxy

Método de PPAPI Asume subprocesos Emscripten API web Limitaciones
GetProxyForURL x GAP GAP: Sin equivalente directo

PPB_TCPSocket y PPB_UDPSocket

No hay una asignación directa 1:1 para la migración. En cambio, hemos esbozado algunas de usuario a continuación y cuál es la ruta de migración recomendada.

Caso de uso Recomendaciones
Compartir pantalla getDisplayMedia y WebRTC ( demo)
Carga desde un servidor local para minimizar el uso del ancho de banda XHR, Fetch, Streams, Service Worker y Cache APIs
Cargando desde un instancia local de una app web / Conéctate a una instancia local de una app web WebRTC
Chat WebSocket*
Comunicación de audio y video en tiempo real WebRTC
Colaboración WebSocket*
Tiempo real juegos multijugador WebTransport**, a menos que sea P2P, en cuyo caso WebRTC (o WebTransport a través de RTCIceTransport)
Tiempo real transmisión interactiva WebTransport**
Cómo comunicarse con el servidor heredado Servidor proxy o middleware para realizar la conversión de protocolos Comentarios para bit.ly/network-api-gaps

*: O WebTransport en el futuro

**: Consulta chromestatus para conocer la disponibilidad