@web-applets/sdk 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,31 @@
1
+ import { AppletAction, AppletMessage, ActionParams, AppletManifest, AppletDataEvent, AppletResizeEvent, AppletActionsEvent, AppletMessageRelay } from './shared';
2
+ interface LoadOpts {
3
+ unsafe?: boolean;
4
+ }
5
+ declare function load(url: string, container?: HTMLIFrameElement, opts?: LoadOpts): Promise<Applet>;
6
+ interface AppletOptions {
7
+ manifest: AppletManifest;
8
+ container: HTMLIFrameElement;
9
+ }
10
+ declare class Applet<T = any> extends EventTarget {
11
+ #private;
12
+ messageRelay: AppletMessageRelay;
13
+ url: string;
14
+ actions: AppletAction[];
15
+ container: HTMLIFrameElement;
16
+ type: string;
17
+ constructor(options: AppletOptions);
18
+ initializeListeners(): void;
19
+ get data(): T;
20
+ set data(data: T);
21
+ get manifest(): AppletManifest;
22
+ onresize(event: AppletResizeEvent): void;
23
+ onactions(event: AppletActionsEvent): void;
24
+ ondata(event: AppletDataEvent): void;
25
+ disconnect(): void;
26
+ dispatchAction(actionId: string, params: ActionParams): Promise<AppletMessage>;
27
+ }
28
+ export declare const applets: {
29
+ load: typeof load;
30
+ };
31
+ export { Applet };
@@ -0,0 +1,134 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _Applet_manifest, _Applet_data;
13
+ import { AppletMessage, AppletDataMessage, AppletInitMessage, AppletDataEvent, AppletResizeEvent, AppletActionsEvent, AppletMessageRelay, } from './shared';
14
+ import { parseUrl } from '../lib/utils';
15
+ // Container for initializing applets without an explicit container
16
+ const hiddenContainer = document.createElement('iframe');
17
+ hiddenContainer.style.display = 'none';
18
+ document.body.appendChild(hiddenContainer);
19
+ const defaultOpts = {
20
+ unsafe: false,
21
+ };
22
+ // Load an applet object from a URL
23
+ async function load(url, container, opts) {
24
+ const _opts = Object.assign(defaultOpts, opts ?? {});
25
+ if (!container)
26
+ container = hiddenContainer;
27
+ url = parseUrl(url);
28
+ const manifest = await loadManifest(`${url}`);
29
+ // If unsafe enabled, allow same origin sandbox
30
+ // This is required for e.g. YouTube embeds
31
+ if (_opts.unsafe && manifest.unsafe) {
32
+ container.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin');
33
+ }
34
+ else {
35
+ container.setAttribute('sandbox', 'allow-scripts allow-forms');
36
+ }
37
+ // Load the applet
38
+ const applet = new Applet({
39
+ manifest,
40
+ container,
41
+ });
42
+ return new Promise((resolve) => {
43
+ applet.messageRelay.on('ready', () => {
44
+ resolve(applet);
45
+ });
46
+ });
47
+ }
48
+ class Applet extends EventTarget {
49
+ constructor(options) {
50
+ super();
51
+ this.actions = [];
52
+ _Applet_manifest.set(this, void 0);
53
+ this.type = 'host';
54
+ _Applet_data.set(this, void 0);
55
+ this.container = options.container;
56
+ this.container.src = options.manifest.start_url;
57
+ this.messageRelay = new AppletMessageRelay(this.container.contentWindow);
58
+ __classPrivateFieldSet(this, _Applet_manifest, options.manifest, "f");
59
+ this.initializeListeners();
60
+ this.messageRelay.on('ready', () => {
61
+ this.messageRelay.send(new AppletInitMessage({ manifest: options.manifest }));
62
+ });
63
+ }
64
+ initializeListeners() {
65
+ this.messageRelay.on('data', (message) => {
66
+ __classPrivateFieldSet(this, _Applet_data, message.data, "f");
67
+ const dataEvent = new AppletDataEvent({ data: message.data });
68
+ if (typeof this.ondata === 'function')
69
+ this.ondata(dataEvent);
70
+ this.dispatchEvent(dataEvent);
71
+ });
72
+ this.messageRelay.on('resize', (message) => {
73
+ const resizeEvent = new AppletResizeEvent({
74
+ dimensions: message.dimensions,
75
+ });
76
+ if (typeof this.onresize === 'function')
77
+ this.onresize(resizeEvent);
78
+ this.dispatchEvent(resizeEvent);
79
+ });
80
+ this.messageRelay.on('actions', (message) => {
81
+ this.actions = message.actions;
82
+ const actionsEvent = new AppletActionsEvent({ actions: message.actions });
83
+ if (typeof this.onactions === 'function')
84
+ this.onactions(actionsEvent);
85
+ this.dispatchEvent(actionsEvent);
86
+ });
87
+ }
88
+ get data() {
89
+ return __classPrivateFieldGet(this, _Applet_data, "f");
90
+ }
91
+ set data(data) {
92
+ __classPrivateFieldSet(this, _Applet_data, data, "f");
93
+ this.messageRelay.send(new AppletDataMessage({ data }));
94
+ }
95
+ get manifest() {
96
+ return __classPrivateFieldGet(this, _Applet_manifest, "f");
97
+ }
98
+ onresize(event) { }
99
+ onactions(event) { }
100
+ ondata(event) { }
101
+ disconnect() {
102
+ this.container.src = 'about:blank';
103
+ }
104
+ async dispatchAction(actionId, params) {
105
+ const actionMessage = new AppletMessage('action', {
106
+ actionId,
107
+ params,
108
+ });
109
+ return await this.messageRelay.send(actionMessage);
110
+ }
111
+ }
112
+ _Applet_manifest = new WeakMap(), _Applet_data = new WeakMap();
113
+ // Loads a manifest and parses the JSON
114
+ async function loadManifest(baseUrl) {
115
+ baseUrl = parseUrl(baseUrl);
116
+ let manifest;
117
+ try {
118
+ const request = await fetch(`${baseUrl}/manifest.json`);
119
+ manifest = await request.json();
120
+ // TODO: Add verification this is a valid manifest
121
+ }
122
+ catch (e) {
123
+ console.error(e.message);
124
+ }
125
+ manifest.start_url = manifest.start_url
126
+ ? parseUrl(manifest.start_url, baseUrl)
127
+ : baseUrl;
128
+ return manifest;
129
+ }
130
+ // Exports
131
+ export const applets = {
132
+ load,
133
+ };
134
+ export { Applet };
@@ -0,0 +1,121 @@
1
+ export interface AppletManifest {
2
+ name?: string;
3
+ short_name?: string;
4
+ icons: AppletIcons;
5
+ description?: string;
6
+ icon?: string;
7
+ display?: string;
8
+ start_url?: string;
9
+ unsafe?: boolean;
10
+ actions?: AppletAction[];
11
+ }
12
+ export interface AppletIcons {
13
+ src: string;
14
+ purpose?: string;
15
+ sizes?: string;
16
+ type?: string;
17
+ }
18
+ export interface AppletAction {
19
+ id: string;
20
+ name?: string;
21
+ description?: string;
22
+ params?: JSONSchemaProperties;
23
+ }
24
+ export type JSONSchemaProperties = Record<string, {
25
+ type: string;
26
+ description?: string;
27
+ properties?: JSONSchemaProperties;
28
+ }>;
29
+ export type ActionParams = Record<string, any>;
30
+ export declare function loadManifest(pageUrl: string): Promise<AppletManifest>;
31
+ interface SendMessageOptions {
32
+ resolves: boolean;
33
+ }
34
+ export declare class AppletMessageRelay {
35
+ target: Window;
36
+ constructor(target: Window);
37
+ send(message: AppletMessage, options?: SendMessageOptions): Promise<AppletMessage>;
38
+ on(messageType: AppletMessageType, callback: AppletMessageCallback): Promise<void>;
39
+ }
40
+ export declare class AppletMessage {
41
+ type: AppletMessageType;
42
+ id: string;
43
+ timeStamp: number;
44
+ [key: string]: any;
45
+ constructor(type: AppletMessageType, values?: {
46
+ [key: string]: any;
47
+ });
48
+ toJson(): {
49
+ [k: string]: any;
50
+ };
51
+ }
52
+ export declare class AppletResolveMessage extends AppletMessage {
53
+ messageId: string;
54
+ constructor({ id }: {
55
+ id: string;
56
+ });
57
+ }
58
+ export declare class AppletActionsMessage extends AppletMessage {
59
+ actions: AppletAction[];
60
+ constructor({ actions }: {
61
+ actions: AppletAction[];
62
+ });
63
+ }
64
+ export declare class AppletDataMessage<T = any> extends AppletMessage {
65
+ data: T;
66
+ constructor({ data }: {
67
+ data: T;
68
+ });
69
+ }
70
+ export declare class AppletReadyMessage extends AppletMessage {
71
+ constructor();
72
+ }
73
+ export declare class AppletResizeMessage extends AppletMessage {
74
+ dimensions: {
75
+ height: number;
76
+ width: number;
77
+ };
78
+ constructor({ dimensions, }: {
79
+ dimensions: AppletResizeMessage['dimensions'];
80
+ });
81
+ }
82
+ interface AppletActionMessageOptions {
83
+ actionId: string;
84
+ params: any;
85
+ }
86
+ export declare class AppletActionMessage extends AppletMessage {
87
+ actionId: string;
88
+ params: any;
89
+ constructor({ actionId, params }: AppletActionMessageOptions);
90
+ }
91
+ export declare class AppletInitMessage extends AppletMessage {
92
+ constructor();
93
+ }
94
+ export type AppletMessageType = 'action' | 'actions' | 'data' | 'init' | 'ready' | 'resolve' | 'resize';
95
+ export type AppletMessageCallback = (message: AppletMessage) => Promise<void> | void;
96
+ export declare class AppletDataEvent extends Event {
97
+ data: any;
98
+ constructor({ data }: {
99
+ data: any;
100
+ });
101
+ }
102
+ export declare class AppletReadyEvent extends Event {
103
+ constructor();
104
+ }
105
+ export declare class AppletLoadEvent extends Event {
106
+ constructor();
107
+ }
108
+ export declare class AppletActionsEvent extends Event {
109
+ actions: AppletAction[];
110
+ constructor({ actions }: {
111
+ actions: AppletAction[];
112
+ });
113
+ }
114
+ export interface AppletResizeEventOpts {
115
+ dimensions: AppletResizeMessage['dimensions'];
116
+ }
117
+ export declare class AppletResizeEvent extends Event {
118
+ dimensions: AppletResizeMessage['dimensions'];
119
+ constructor({ dimensions }: AppletResizeEventOpts);
120
+ }
121
+ export {};
@@ -0,0 +1,171 @@
1
+ /* Manifest & action definitions */
2
+ import { parseUrl } from '../utils';
3
+ export async function loadManifest(pageUrl) {
4
+ pageUrl = parseUrl(pageUrl);
5
+ let manifest;
6
+ try {
7
+ const pageRequest = await fetch(pageUrl);
8
+ const html = await pageRequest.text();
9
+ const parser = new DOMParser();
10
+ const doc = parser.parseFromString(html, 'text/html');
11
+ const linkElem = doc.querySelector('link[rel="manifest"]');
12
+ const manifestUrl = parseUrl(linkElem.href);
13
+ const manifestRequest = await fetch(manifestUrl);
14
+ manifest = await manifestRequest.json();
15
+ // TODO: Add verification this is a valid manifest
16
+ }
17
+ catch (e) {
18
+ return;
19
+ }
20
+ return manifest;
21
+ }
22
+ export class AppletMessageRelay {
23
+ constructor(target) {
24
+ this.target = target;
25
+ }
26
+ async send(message, options) {
27
+ this.target.postMessage(message.toJson(), '*');
28
+ if (options && options.resolves === false)
29
+ return;
30
+ // Wait for a resolve message to be sent back before completing await
31
+ return new Promise((resolve) => {
32
+ const listener = (messageEvent) => {
33
+ const responseMessage = new AppletMessage(messageEvent.data.type, messageEvent.data);
34
+ if (responseMessage.type === 'resolve' &&
35
+ responseMessage.id === message.id) {
36
+ window.removeEventListener('message', listener);
37
+ resolve(responseMessage);
38
+ }
39
+ };
40
+ window.addEventListener('message', listener);
41
+ });
42
+ }
43
+ async on(messageType, callback) {
44
+ const listener = async (messageEvent) => {
45
+ if (messageEvent.source === window.self)
46
+ return;
47
+ if (messageEvent.data.type !== messageType)
48
+ return;
49
+ const message = new AppletMessage(messageEvent.data.type, messageEvent.data);
50
+ // Wait for the callback to complete, then send a 'resolve' event
51
+ // with the message ID.
52
+ await callback(message);
53
+ const resolveMessage = new AppletResolveMessage({ id: message.id });
54
+ this.send(resolveMessage, { resolves: false });
55
+ };
56
+ window.addEventListener('message', listener);
57
+ // TODO: Return something that I can then call .off or .removeListener, implement the
58
+ // rest of that event class
59
+ }
60
+ }
61
+ /* Messages */
62
+ export class AppletMessage {
63
+ constructor(type, values) {
64
+ this.timeStamp = Date.now();
65
+ this.type = type;
66
+ this.id = crypto.randomUUID();
67
+ if (values)
68
+ Object.assign(this, values);
69
+ }
70
+ toJson() {
71
+ return Object.fromEntries(Object.entries(this).filter(([_, value]) => {
72
+ try {
73
+ JSON.stringify(value);
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }));
80
+ }
81
+ }
82
+ export class AppletResolveMessage extends AppletMessage {
83
+ constructor({ id }) {
84
+ super('resolve');
85
+ this.id = id;
86
+ }
87
+ }
88
+ export class AppletActionsMessage extends AppletMessage {
89
+ constructor({ actions }) {
90
+ super('actions');
91
+ this.actions = actions;
92
+ }
93
+ }
94
+ export class AppletDataMessage extends AppletMessage {
95
+ constructor({ data }) {
96
+ super('data');
97
+ this.data = data;
98
+ }
99
+ }
100
+ export class AppletReadyMessage extends AppletMessage {
101
+ constructor() {
102
+ super('ready');
103
+ }
104
+ }
105
+ export class AppletResizeMessage extends AppletMessage {
106
+ constructor({ dimensions, }) {
107
+ super('resize');
108
+ this.dimensions = dimensions;
109
+ }
110
+ }
111
+ export class AppletActionMessage extends AppletMessage {
112
+ constructor({ actionId, params }) {
113
+ super('action');
114
+ this.actionId = actionId;
115
+ this.params = params;
116
+ }
117
+ }
118
+ export class AppletInitMessage extends AppletMessage {
119
+ constructor() {
120
+ super('init');
121
+ }
122
+ }
123
+ /* Events */
124
+ export class AppletDataEvent extends Event {
125
+ constructor({ data }) {
126
+ super('data', {
127
+ bubbles: false,
128
+ cancelable: false,
129
+ composed: false,
130
+ });
131
+ this.data = data;
132
+ }
133
+ }
134
+ export class AppletReadyEvent extends Event {
135
+ constructor() {
136
+ super('ready', {
137
+ bubbles: false,
138
+ cancelable: false,
139
+ composed: false,
140
+ });
141
+ }
142
+ }
143
+ export class AppletLoadEvent extends Event {
144
+ constructor() {
145
+ super('load', {
146
+ bubbles: false,
147
+ cancelable: false,
148
+ composed: false,
149
+ });
150
+ }
151
+ }
152
+ export class AppletActionsEvent extends Event {
153
+ constructor({ actions }) {
154
+ super('actions', {
155
+ bubbles: false,
156
+ cancelable: false,
157
+ composed: false,
158
+ });
159
+ this.actions = actions;
160
+ }
161
+ }
162
+ export class AppletResizeEvent extends Event {
163
+ constructor({ dimensions }) {
164
+ super('resize', {
165
+ bubbles: false,
166
+ cancelable: false,
167
+ composed: false,
168
+ });
169
+ this.dimensions = dimensions;
170
+ }
171
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- export * from './utils';
2
- export * from './types';
3
- export * as applets from './client';
4
- export { Applet } from './client';
5
- export * from './context';
1
+ export * from './core/shared';
2
+ export * from './core/applet';
3
+ export * from './core/context';
4
+ import { load } from './core/applet';
5
+ import { getContext } from './core/context';
6
+ export declare const applets: {
7
+ load: typeof load;
8
+ getContext: typeof getContext;
9
+ };
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
- export * from './utils';
2
- export * from './types';
3
- import * as applets_1 from './client';
4
- export { applets_1 as applets };
5
- export { Applet } from './client';
6
- export * from './context';
1
+ export * from './core/shared';
2
+ export * from './core/applet';
3
+ export * from './core/context';
4
+ import { load } from './core/applet';
5
+ import { getContext } from './core/context';
6
+ export const applets = {
7
+ load,
8
+ getContext,
9
+ };
@@ -0,0 +1,17 @@
1
+ import { AppletAction } from '../core/shared';
2
+ export declare function parseUrl(url: string, base?: string): string;
3
+ export declare function createOpenAISchemaForAction(action: AppletAction): {
4
+ strict: boolean;
5
+ name: string;
6
+ schema: {
7
+ type: string;
8
+ required: string[];
9
+ properties: {
10
+ id: {
11
+ type: string;
12
+ };
13
+ params: import("../core/shared").JSONSchemaProperties;
14
+ };
15
+ additionalProperties: boolean;
16
+ };
17
+ };
@@ -0,0 +1,37 @@
1
+ // Adds http/https to URLs, and prepends with window location if relative
2
+ export function parseUrl(url, base) {
3
+ if (['http', 'https'].includes(url.split('://')[0])) {
4
+ return url;
5
+ }
6
+ let path = trimSlashes(url);
7
+ url = `${base || window.location.origin}/${path}`;
8
+ return url;
9
+ }
10
+ function trimSlashes(str) {
11
+ return str.replace(/^\/+|\/+$/g, '');
12
+ }
13
+ export function createOpenAISchemaForAction(action) {
14
+ return {
15
+ strict: true,
16
+ name: 'action_schema',
17
+ schema: {
18
+ type: 'object',
19
+ required: Object.keys(action),
20
+ properties: {
21
+ id: { type: 'string' },
22
+ params: action.params,
23
+ },
24
+ additionalProperties: false,
25
+ },
26
+ };
27
+ }
28
+ // export async function loadAppletManifest(url: string): Promise<AppletManifest> {
29
+ // url = parseUrl(url);
30
+ // const request = await fetch(`${url}/manifest.json`);
31
+ // const appletManifest = await request.json();
32
+ // if (appletManifest.type !== 'applet') {
33
+ // throw new Error("URL doesn't point to a valid applet manifest.");
34
+ // }
35
+ // appletManifest.entrypoint = parseUrl(appletManifest.entrypoint, url);
36
+ // return appletManifest;
37
+ // }
package/dist/utils.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { AppletAction, type AppletManifest } from './types';
2
- export declare function getAppletsList(url: string): Promise<any>;
3
- export declare function loadAppletManifest(url: string): Promise<AppletManifest>;
1
+ import { AppletAction } from './core/shared';
2
+ export declare function parseUrl(url: string, base?: string): string;
4
3
  export declare function createOpenAISchemaForAction(action: AppletAction): {
5
4
  strict: boolean;
6
5
  name: string;
@@ -11,7 +10,7 @@ export declare function createOpenAISchemaForAction(action: AppletAction): {
11
10
  id: {
12
11
  type: string;
13
12
  };
14
- params: import("./types").ActionParamSchema;
13
+ params: import("./core/shared").JSONSchemaProperties;
15
14
  };
16
15
  additionalProperties: boolean;
17
16
  };
package/dist/utils.js CHANGED
@@ -1,36 +1,16 @@
1
- function parseUrl(url, base) {
2
- if (['http', 'https'].includes(url.split('://')[0])) {
3
- return url;
4
- }
5
- let path = url;
6
- if (path.startsWith('/'))
7
- path = path.slice(1);
8
- if (path.endsWith('/'))
9
- path = path.slice(0, -1);
10
- url = `${base || window.location.origin}/${path}`;
11
- return url;
12
- }
13
- export async function getAppletsList(url) {
14
- url = parseUrl(url);
15
- try {
16
- const request = await fetch(`${url}/manifest.json`);
17
- const appManifest = await request.json();
18
- return appManifest.applets ? appManifest.applets : [];
19
- }
20
- catch {
21
- return [];
22
- }
1
+ // Adds http/https to URLs, and prepends with window location if relative
2
+ export function parseUrl(url, base) {
3
+ if (url)
4
+ url = URL.parse(url, base ?? window.location.href).href;
5
+ return trimTrailingSlash(url);
23
6
  }
24
- export async function loadAppletManifest(url) {
25
- url = parseUrl(url);
26
- const request = await fetch(`${url}/manifest.json`);
27
- const appletManifest = await request.json();
28
- if (appletManifest.type !== 'applet') {
29
- throw new Error("URL doesn't point to a valid applet manifest.");
7
+ function trimTrailingSlash(url) {
8
+ if (url.endsWith('/')) {
9
+ return url.slice(0, -1);
30
10
  }
31
- appletManifest.entrypoint = parseUrl(appletManifest.entrypoint, url);
32
- return appletManifest;
11
+ return url;
33
12
  }
13
+ // Creates an OpenAI-compatible schema declaration for an action
34
14
  export function createOpenAISchemaForAction(action) {
35
15
  return {
36
16
  strict: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@web-applets/sdk",
3
- "version": "0.0.8",
3
+ "version": "0.1.0",
4
4
  "description": "The Web Applets SDK, for creating & hosting Web Applets.",
5
5
  "author": "Rupert Manfredi <rupert@unternet.co>",
6
6
  "license": "MIT",
package/dist/client.d.ts DELETED
@@ -1,32 +0,0 @@
1
- import { AppletAction, AppletHeader, AppletMessage, ActionParams, AppletManifest, AppletMessageType, AppletMessageCallback, AppletManifestDict } from './types';
2
- export declare function list(url: string): Promise<AppletManifestDict>;
3
- interface AppletOpts {
4
- headless?: boolean;
5
- unsafe?: boolean;
6
- }
7
- export declare function load(url: string, container?: HTMLIFrameElement, opts?: AppletOpts): Promise<Applet>;
8
- export declare class Applet<T = unknown> extends EventTarget {
9
- #private;
10
- actions: AppletAction[];
11
- manifest: AppletManifest;
12
- container: HTMLIFrameElement;
13
- constructor();
14
- get state(): T;
15
- set state(state: T);
16
- toJson(): {
17
- [k: string]: any;
18
- };
19
- resizeContainer(dimensions: {
20
- height: number;
21
- width: number;
22
- }): void;
23
- onstateupdated(event: CustomEvent): void;
24
- disconnect(): void;
25
- dispatchAction(actionId: string, params: ActionParams): Promise<AppletMessage<any>>;
26
- send(message: AppletMessage): Promise<AppletMessage<any>>;
27
- on(messageType: AppletMessageType, callback: AppletMessageCallback): Promise<void>;
28
- }
29
- export declare function loadManifest(url: string): Promise<AppletManifest>;
30
- export declare function getHeaders(url: string): Promise<AppletHeader[]>;
31
- export declare function getManifests(url: string): Promise<any[]>;
32
- export {};