桌面与网页脚本自定义协议
从 sqsmap 具名导入 addProtocol、removeProtocol。先 await addProtocol 确认登记,再加载相应地址。地图仍提供显示与事件,按钮和面板由用户编写。
import {map, addProtocol, removeProtocol} from 'sqsmap';
const feature = {type: 'Feature', id: 7, properties: {},
geometry: {type: 'Point', coordinates: [116.4, 39.9]}};
await addProtocol('localdata', async (request, controller) => {
controller.signal.throwIfAborted();
// 该例JSON只有ASCII;实际文本应按UTF-8编码。
const text = JSON.stringify(feature);
return {data: Uint8Array.from(text, char => char.charCodeAt(0))};
});
const loaded = new Promise(resolve => {
const sub = map.on('sourcedata', event => {
if (event.sourceId === 'point' && event.isSourceLoaded) {sub.unsubscribe(); resolve();}
});
});
map.addSource('point', {type: 'geojson', data: 'localdata://point'});
map.addLayer({id: 'point-circle', type: 'circle', source: 'point',
paint: {'circle-color': 'blue', 'circle-radius': 10}});
await map.sqs.flush();
await loaded;
await map.sqs.flush({render: true});
// 完成后释放登记;已加载的数据仍可显示。
await removeProtocol('localdata');
请求提供只读 url、resourceType、maxBytes 和 method: 'GET'。控制器提供只读 signal.aborted、throwIfAborted、addEventListener('abort', fn)、removeEventListener。结果仅接受 {data: ArrayBuffer | Uint8Array},转交前复制实际视图;字符串、DOM图片和缓存元数据不属于当前共同脚本结果。脚本环境提供标准JavaScript内建对象;浏览器的 fetch、TextEncoder、计时器等仍由宿主API替代。
每会话最多16协议、8实际运行回调、每请求8取消监听;回应最多8MiB并受真实请求预算约束,尚未被宿主接受的回应合计16MiB/32份。取消但未结束的处理函数仍计入8项预算。超时、移除图源、替换、移除登记和停止会话会取消相关请求。处理器属于该会话,冲突明确失败;清理不能删除后来由外部替换的SDK处理器。登记错误和其它地图写入错误一样进入确认历史,请按共同相机指南中的失败水位说明检查与恢复。
(await map.sqs.getCapabilities()).sharedScriptProtocols === true 表示当前脚本宿主已接通。网页脚本Worker与地图主线程/渲染Worker均可使用,地图原始SDK具名协议仍按其JavaScript所在环境登记。原始SDK跨渲染Worker的独立登记可使用:
const protocols = view.sqs.resources.createProtocolScope();
await protocols.addProtocol('assetdata', async (request, controller) => {
controller.signal.throwIfAborted();
return {data: new TextEncoder().encode(JSON.stringify({type: 'Feature', properties: {}, geometry: {type: 'Point', coordinates: [116.4, 39.9]}}))};
});
await protocols.removeProtocol('assetdata');
protocols.close();
每地图最多32独立作用域;作用域登记有自己的归属,返回数据最多8MiB,支持字节或文本。关闭作用域或地图时释放自身登记。经典SDK addProtocol/removeProtocol 仍保留原环境内的替换行为。
桌面GIS应用已将同一回调接口接到原生资源下载器,覆盖共同图源、样式底图、瓦片、sprite、glyph与loadImage的统一资源入口;回调留在QuickJS,ArrayBuffer字节复制为Rust所有的缓冲区。每地图16个协议,不能覆盖其它脚本的登记;资源线程最多8个请求排队,最多2个二进制请求同时等待响应,总回应预算16MiB。登记替换、移除、任务结束及资源取消只清理自己的请求。桌面使用与网页相同的具名导入;未接通的自定义宿主和移动GIS应用仍明确返回 CAPABILITY_UNAVAILABLE。独立动态库的持续QuickJS同名接口见原生协议。Windows/macOS外机、移动设备和正式发行仍待独立验收。
同一脚本在地图主线程/严格渲染Worker×DPR1/2各通过8项,包含真实蓝色点/要素身份、请求类型/预算、超时和删除图源的取消通知:脚本、完整HTML验证页。