scramjet/src/client/shared/scope.ts
2024-07-27 11:41:02 -04:00

44 lines
1.3 KiB
TypeScript

import { ScramjetClient } from "../client";
export const iswindow = "window" in self;
export const isworker = "WorkerGlobalScope" in self;
export const issw = "ServiceWorkerGlobalScope" in self;
export const isdedicated = "DedicatedWorkerGlobalScope" in self;
export const isshared = "SharedWorkerGlobalScope" in self;
export default function (client: ScramjetClient, self: typeof globalThis) {
function scope(identifier: any) {
// this will break iframe postmessage!
if (
iswindow &&
(identifier instanceof self.Window ||
identifier instanceof self.top.window.Window ||
identifier instanceof self.parent.window.Window)
) {
return client.windowProxy;
} else if (
(iswindow && identifier instanceof Location) ||
(isworker && identifier instanceof WorkerLocation)
) {
return client.locationProxy;
} else if (iswindow && identifier instanceof Document) {
return client.documentProxy;
} else if (isworker && identifier instanceof WorkerGlobalScope) {
return client.windowProxy;
}
return identifier;
}
// shorthand because this can get out of hand reall quickly
self.$s = scope;
self.$tryset = function (lhs: any, op: string, rhs: any) {
if (lhs instanceof Location) {
// @ts-ignore
locationProxy.href = rhs;
return true;
}
};
}