utils/textureResourceMeta.tstypescript
export const OG_TEXTURE_RESOURCE_META_KEY = Symbol.for("openglobus.textureResourceMeta");

export interface ITextureResourceMeta {
    resourceKey?: string;
    sourceUri?: string;
    mimeType?: string;
    byteLength?: number;
}

type TextureResourceMetaContainer = Record<PropertyKey, unknown>;

export function getTextureResourceMeta(target: object | null | undefined): ITextureResourceMeta | undefined {
    if (!target) {
        return undefined;
    }

    return (target as TextureResourceMetaContainer)[OG_TEXTURE_RESOURCE_META_KEY] as ITextureResourceMeta | undefined;
}

export function setTextureResourceMeta(
    target: object | null | undefined,
    meta: ITextureResourceMeta | undefined
): void {
    if (!target) {
        return;
    }

    const container = target as TextureResourceMetaContainer;
    if (!meta) {
        delete container[OG_TEXTURE_RESOURCE_META_KEY];
        return;
    }

    Object.defineProperty(container, OG_TEXTURE_RESOURCE_META_KEY, {
        value: meta,
        writable: true,
        configurable: true,
        enumerable: false
    });
}