Internal change

PiperOrigin-RevId: 489345940
This commit is contained in:
MediaPipe Team 2022-11-17 17:14:56 -08:00 committed by Copybara-Service
parent ab3a5f0fbf
commit 6f3cb340e1
24 changed files with 46 additions and 54 deletions

View File

@ -25,7 +25,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:classifier_options", "//mediapipe/tasks/web/core:classifier_options",
"//mediapipe/tasks/web/core:task_runner", "//mediapipe/tasks/web/core:task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -23,7 +23,7 @@ import {convertClassifierOptionsToProto} from '../../../../tasks/web/components/
import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result'; import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result';
import {TaskRunner} from '../../../../tasks/web/core/task_runner'; import {TaskRunner} from '../../../../tasks/web/core/task_runner';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {AudioClassifierOptions} from './audio_classifier_options'; import {AudioClassifierOptions} from './audio_classifier_options';

View File

@ -18,9 +18,9 @@ mediapipe_ts_library(
"task_runner.ts", "task_runner.ts",
], ],
deps = [ deps = [
"//mediapipe/web/graph_runner:graph_runner_image_lib_ts",
"//mediapipe/web/graph_runner:graph_runner_ts",
"//mediapipe/web/graph_runner:register_model_resources_graph_service_ts", "//mediapipe/web/graph_runner:register_model_resources_graph_service_ts",
"//mediapipe/web/graph_runner:wasm_mediapipe_image_lib_ts",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts",
], ],
) )

View File

@ -15,12 +15,12 @@
*/ */
import {SupportModelResourcesGraphService} from '../../../web/graph_runner/register_model_resources_graph_service'; import {SupportModelResourcesGraphService} from '../../../web/graph_runner/register_model_resources_graph_service';
import {SupportImage} from '../../../web/graph_runner/wasm_mediapipe_image_lib'; import {SupportImage} from '../../../web/graph_runner/graph_runner_image_lib';
import {WasmMediaPipeLib, WasmModule} from '../../../web/graph_runner/wasm_mediapipe_lib'; import {GraphRunner, WasmModule} from '../../../web/graph_runner/graph_runner';
// tslint:disable-next-line:enforce-name-casing // tslint:disable-next-line:enforce-name-casing
const WasmMediaPipeImageLib = const WasmMediaPipeImageLib =
SupportModelResourcesGraphService(SupportImage(WasmMediaPipeLib)); SupportModelResourcesGraphService(SupportImage(GraphRunner));
/** Base class for all MediaPipe Tasks. */ /** Base class for all MediaPipe Tasks. */
export abstract class TaskRunner extends WasmMediaPipeImageLib { export abstract class TaskRunner extends WasmMediaPipeImageLib {

View File

@ -26,7 +26,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:classifier_options", "//mediapipe/tasks/web/core:classifier_options",
"//mediapipe/tasks/web/core:task_runner", "//mediapipe/tasks/web/core:task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -23,7 +23,7 @@ import {convertClassifierOptionsToProto} from '../../../../tasks/web/components/
import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result'; import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result';
import {TaskRunner} from '../../../../tasks/web/core/task_runner'; import {TaskRunner} from '../../../../tasks/web/core/task_runner';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {TextClassifierOptions} from './text_classifier_options'; import {TextClassifierOptions} from './text_classifier_options';

View File

@ -25,7 +25,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:embedder_options", "//mediapipe/tasks/web/core:embedder_options",
"//mediapipe/tasks/web/core:task_runner", "//mediapipe/tasks/web/core:task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -23,7 +23,7 @@ import {convertEmbedderOptionsToProto} from '../../../../tasks/web/components/pr
import {convertFromEmbeddingResultProto} from '../../../../tasks/web/components/processors/embedder_result'; import {convertFromEmbeddingResultProto} from '../../../../tasks/web/components/processors/embedder_result';
import {TaskRunner} from '../../../../tasks/web/core/task_runner'; import {TaskRunner} from '../../../../tasks/web/core/task_runner';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {TextEmbedderOptions} from './text_embedder_options'; import {TextEmbedderOptions} from './text_embedder_options';

View File

@ -21,6 +21,6 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/components/processors:base_options", "//mediapipe/tasks/web/components/processors:base_options",
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:task_runner", "//mediapipe/tasks/web/core:task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -17,7 +17,7 @@
import {BaseOptions as BaseOptionsProto} from '../../../../tasks/cc/core/proto/base_options_pb'; import {BaseOptions as BaseOptionsProto} from '../../../../tasks/cc/core/proto/base_options_pb';
import {convertBaseOptionsToProto} from '../../../../tasks/web/components/processors/base_options'; import {convertBaseOptionsToProto} from '../../../../tasks/web/components/processors/base_options';
import {TaskRunner} from '../../../../tasks/web/core/task_runner'; import {TaskRunner} from '../../../../tasks/web/core/task_runner';
import {ImageSource} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {ImageSource} from '../../../../web/graph_runner/graph_runner';
import {VisionTaskOptions} from './vision_task_options'; import {VisionTaskOptions} from './vision_task_options';

View File

@ -32,7 +32,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:classifier_options", "//mediapipe/tasks/web/core:classifier_options",
"//mediapipe/tasks/web/vision/core:vision_task_runner", "//mediapipe/tasks/web/vision/core:vision_task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -31,7 +31,7 @@ import {Landmark} from '../../../../tasks/web/components/containers/landmark';
import {convertClassifierOptionsToProto} from '../../../../tasks/web/components/processors/classifier_options'; import {convertClassifierOptionsToProto} from '../../../../tasks/web/components/processors/classifier_options';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner'; import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner';
import {createMediaPipeLib, FileLocator, ImageSource, WasmModule} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator, ImageSource, WasmModule} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {GestureRecognizerOptions} from './gesture_recognizer_options'; import {GestureRecognizerOptions} from './gesture_recognizer_options';

View File

@ -27,7 +27,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/components/containers:landmark", "//mediapipe/tasks/web/components/containers:landmark",
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/vision/core:vision_task_runner", "//mediapipe/tasks/web/vision/core:vision_task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -27,7 +27,7 @@ import {Category} from '../../../../tasks/web/components/containers/category';
import {Landmark} from '../../../../tasks/web/components/containers/landmark'; import {Landmark} from '../../../../tasks/web/components/containers/landmark';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner'; import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner';
import {createMediaPipeLib, FileLocator, ImageSource, WasmModule} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator, ImageSource, WasmModule} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {HandLandmarkerOptions} from './hand_landmarker_options'; import {HandLandmarkerOptions} from './hand_landmarker_options';

View File

@ -25,7 +25,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/core:classifier_options", "//mediapipe/tasks/web/core:classifier_options",
"//mediapipe/tasks/web/vision/core:vision_task_runner", "//mediapipe/tasks/web/vision/core:vision_task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -23,7 +23,7 @@ import {convertClassifierOptionsToProto} from '../../../../tasks/web/components/
import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result'; import {convertFromClassificationResultProto} from '../../../../tasks/web/components/processors/classifier_result';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner'; import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner';
import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {ImageClassifierOptions} from './image_classifier_options'; import {ImageClassifierOptions} from './image_classifier_options';

View File

@ -25,7 +25,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/core:embedder_options", "//mediapipe/tasks/web/core:embedder_options",
"//mediapipe/tasks/web/vision/core:vision_task_options", "//mediapipe/tasks/web/vision/core:vision_task_options",
"//mediapipe/tasks/web/vision/core:vision_task_runner", "//mediapipe/tasks/web/vision/core:vision_task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -23,7 +23,7 @@ import {convertEmbedderOptionsToProto} from '../../../../tasks/web/components/pr
import {convertFromEmbeddingResultProto} from '../../../../tasks/web/components/processors/embedder_result'; import {convertFromEmbeddingResultProto} from '../../../../tasks/web/components/processors/embedder_result';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner'; import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner';
import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {ImageEmbedderOptions} from './image_embedder_options'; import {ImageEmbedderOptions} from './image_embedder_options';

View File

@ -22,7 +22,7 @@ mediapipe_ts_library(
"//mediapipe/tasks/web/components/containers:category", "//mediapipe/tasks/web/components/containers:category",
"//mediapipe/tasks/web/core", "//mediapipe/tasks/web/core",
"//mediapipe/tasks/web/vision/core:vision_task_runner", "//mediapipe/tasks/web/vision/core:vision_task_runner",
"//mediapipe/web/graph_runner:wasm_mediapipe_lib_ts", "//mediapipe/web/graph_runner:graph_runner_ts",
], ],
) )

View File

@ -21,7 +21,7 @@ import {BaseOptions as BaseOptionsProto} from '../../../../tasks/cc/core/proto/b
import {ObjectDetectorOptions as ObjectDetectorOptionsProto} from '../../../../tasks/cc/vision/object_detector/proto/object_detector_options_pb'; import {ObjectDetectorOptions as ObjectDetectorOptionsProto} from '../../../../tasks/cc/vision/object_detector/proto/object_detector_options_pb';
import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options'; import {WasmLoaderOptions} from '../../../../tasks/web/core/wasm_loader_options';
import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner'; import {VisionTaskRunner} from '../../../../tasks/web/vision/core/vision_task_runner';
import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/wasm_mediapipe_lib'; import {createMediaPipeLib, FileLocator, ImageSource} from '../../../../web/graph_runner/graph_runner';
// Placeholder for internal dependency on trusted resource url // Placeholder for internal dependency on trusted resource url
import {ObjectDetectorOptions} from './object_detector_options'; import {ObjectDetectorOptions} from './object_detector_options';

View File

@ -3,32 +3,24 @@
load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library") load("//mediapipe/framework/port:build_config.bzl", "mediapipe_ts_library")
package(default_visibility = [ package(default_visibility = [
":internal",
"//mediapipe/tasks:internal", "//mediapipe/tasks:internal",
]) ])
package_group(
name = "internal",
packages = [
"//mediapipe/app/pursuit/wasm/web_ml_cpu/typescript/...",
],
)
mediapipe_ts_library( mediapipe_ts_library(
name = "wasm_mediapipe_lib_ts", name = "graph_runner_ts",
srcs = [ srcs = [
":wasm_mediapipe_lib.ts", ":graph_runner.ts",
], ],
allow_unoptimized_namespaces = True, allow_unoptimized_namespaces = True,
) )
mediapipe_ts_library( mediapipe_ts_library(
name = "wasm_mediapipe_image_lib_ts", name = "graph_runner_image_lib_ts",
srcs = [ srcs = [
":wasm_mediapipe_image_lib.ts", ":graph_runner_image_lib.ts",
], ],
allow_unoptimized_namespaces = True, allow_unoptimized_namespaces = True,
deps = [":wasm_mediapipe_lib_ts"], deps = [":graph_runner_ts"],
) )
mediapipe_ts_library( mediapipe_ts_library(
@ -37,5 +29,5 @@ mediapipe_ts_library(
":register_model_resources_graph_service.ts", ":register_model_resources_graph_service.ts",
], ],
allow_unoptimized_namespaces = True, allow_unoptimized_namespaces = True,
deps = [":wasm_mediapipe_lib_ts"], deps = [":graph_runner_ts"],
) )

View File

@ -129,7 +129,7 @@ declare global {
declare function importScripts(...urls: Array<string|URL>): void; declare function importScripts(...urls: Array<string|URL>): void;
/** /**
* Valid types of image sources which we can run our WasmMediaPipeLib over. * Valid types of image sources which we can run our GraphRunner over.
*/ */
export type ImageSource = export type ImageSource =
HTMLCanvasElement|HTMLVideoElement|HTMLImageElement|ImageData|ImageBitmap; HTMLCanvasElement|HTMLVideoElement|HTMLImageElement|ImageData|ImageBitmap;
@ -138,7 +138,7 @@ export type ImageSource =
/** A listener that will be invoked with an absl::StatusCode and message. */ /** A listener that will be invoked with an absl::StatusCode and message. */
export type ErrorListener = (code: number, message: string) => void; export type ErrorListener = (code: number, message: string) => void;
// Internal type of constructors used for initializing WasmMediaPipeLib and // Internal type of constructors used for initializing GraphRunner and
// subclasses. // subclasses.
type WasmMediaPipeConstructor<LibType> = type WasmMediaPipeConstructor<LibType> =
(new ( (new (
@ -151,7 +151,7 @@ type WasmMediaPipeConstructor<LibType> =
* into canvas, or else return the output WebGLTexture. Takes a WebAssembly * into canvas, or else return the output WebGLTexture. Takes a WebAssembly
* Module (must be instantiated to self.Module). * Module (must be instantiated to self.Module).
*/ */
export class WasmMediaPipeLib { export class GraphRunner {
// TODO: These should be protected/private, but are left exposed for // TODO: These should be protected/private, but are left exposed for
// now so that we can use proper TS mixins with this class as a base. This // now so that we can use proper TS mixins with this class as a base. This
// should be somewhat fixed when we create our .d.ts files. // should be somewhat fixed when we create our .d.ts files.
@ -989,7 +989,7 @@ async function runScript(scriptUrl: string) {
/** /**
* Global function to initialize Wasm blob and load runtime assets for a * Global function to initialize Wasm blob and load runtime assets for a
* specialized MediaPipe library. This allows us to create a requested * specialized MediaPipe library. This allows us to create a requested
* subclass inheriting from WasmMediaPipeLib. * subclass inheriting from GraphRunner.
* @param constructorFcn The name of the class to instantiate via "new". * @param constructorFcn The name of the class to instantiate via "new".
* @param wasmLoaderScript Url for the wasm-runner script; produced by the build * @param wasmLoaderScript Url for the wasm-runner script; produced by the build
* process. * process.
@ -1043,12 +1043,12 @@ export async function createMediaPipeLib<LibType>(
* @return promise A promise which will resolve when initialization has * @return promise A promise which will resolve when initialization has
* completed successfully. * completed successfully.
*/ */
export async function createWasmMediaPipeLib( export async function createGraphRunner(
wasmLoaderScript?: string, wasmLoaderScript?: string,
assetLoaderScript?: string, assetLoaderScript?: string,
glCanvas?: HTMLCanvasElement|OffscreenCanvas|null, glCanvas?: HTMLCanvasElement|OffscreenCanvas|null,
fileLocator?: FileLocator): Promise<WasmMediaPipeLib> { fileLocator?: FileLocator): Promise<GraphRunner> {
return createMediaPipeLib( return createMediaPipeLib(
WasmMediaPipeLib, wasmLoaderScript, assetLoaderScript, glCanvas, GraphRunner, wasmLoaderScript, assetLoaderScript, glCanvas,
fileLocator); fileLocator);
} }

View File

@ -1,12 +1,12 @@
import {ImageSource, WasmMediaPipeLib} from './wasm_mediapipe_lib'; import {ImageSource, GraphRunner} from './graph_runner';
/** /**
* We extend from a WasmMediaPipeLib constructor. This ensures our mixin has * We extend from a GraphRunner constructor. This ensures our mixin has
* access to the wasmModule, among other things. The `any` type is required for * access to the wasmModule, among other things. The `any` type is required for
* mixin constructors. * mixin constructors.
*/ */
// tslint:disable-next-line:no-any // tslint:disable-next-line:no-any
type LibConstructor = new (...args: any[]) => WasmMediaPipeLib; type LibConstructor = new (...args: any[]) => GraphRunner;
/** /**
* Declarations for Emscripten's WebAssembly Module behavior, so TS compiler * Declarations for Emscripten's WebAssembly Module behavior, so TS compiler
@ -19,10 +19,10 @@ export declare interface WasmImageModule {
} }
/** /**
* An implementation of WasmMediaPipeLib that supports binding GPU image data as * An implementation of GraphRunner that supports binding GPU image data as
* `mediapipe::Image` instances. We implement as a proper TS mixin, to allow for * `mediapipe::Image` instances. We implement as a proper TS mixin, to allow for
* effective multiple inheritance. Example usage: * effective multiple inheritance. Example usage:
* `const WasmMediaPipeImageLib = SupportImage(WasmMediaPipeLib);` * `const WasmMediaPipeImageLib = SupportImage(GraphRunner);`
*/ */
// tslint:disable-next-line:enforce-name-casing // tslint:disable-next-line:enforce-name-casing
export function SupportImage<TBase extends LibConstructor>(Base: TBase) { export function SupportImage<TBase extends LibConstructor>(Base: TBase) {

View File

@ -1,12 +1,12 @@
import {WasmMediaPipeLib} from './wasm_mediapipe_lib'; import {GraphRunner} from './graph_runner';
/** /**
* We extend from a WasmMediaPipeLib constructor. This ensures our mixin has * We extend from a GraphRunner constructor. This ensures our mixin has
* access to the wasmModule, among other things. The `any` type is required for * access to the wasmModule, among other things. The `any` type is required for
* mixin constructors. * mixin constructors.
*/ */
// tslint:disable-next-line:no-any // tslint:disable-next-line:no-any
type LibConstructor = new (...args: any[]) => WasmMediaPipeLib; type LibConstructor = new (...args: any[]) => GraphRunner;
/** /**
* Declarations for Emscripten's WebAssembly Module behavior, so TS compiler * Declarations for Emscripten's WebAssembly Module behavior, so TS compiler
@ -17,11 +17,11 @@ export declare interface WasmModuleRegisterModelResources {
} }
/** /**
* An implementation of WasmMediaPipeLib that supports registering model * An implementation of GraphRunner that supports registering model
* resources to a cache, in the form of a GraphService C++-side. We implement as * resources to a cache, in the form of a GraphService C++-side. We implement as
* a proper TS mixin, to allow for effective multiple inheritance. Sample usage: * a proper TS mixin, to allow for effective multiple inheritance. Sample usage:
* `const WasmMediaPipeImageLib = SupportModelResourcesGraphService( * `const WasmMediaPipeImageLib = SupportModelResourcesGraphService(
* WasmMediaPipeLib);` * GraphRunner);`
*/ */
// tslint:disable:enforce-name-casing // tslint:disable:enforce-name-casing
export function SupportModelResourcesGraphService<TBase extends LibConstructor>( export function SupportModelResourcesGraphService<TBase extends LibConstructor>(