feat: route plugin external fetches (probe + models) through CORS proxy ai-assistant-fig.dynv6.net; bump 0.1.17
This commit is contained in:
1 parent
86b0128d8e
commit
9cc5e98752
3 files changed
+13
-4
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "figma-ai-plugin",
|
"name": "figma-ai-plugin",
|
||||||
"version": "0.1.16",
|
"version": "0.1.17",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@create-figma-plugin/ui": "^4.0.3",
|
"@create-figma-plugin/ui": "^4.0.3",
|
||||||
|
|||||||
+11
-2
@@ -1,10 +1,19 @@
|
|||||||
import { emit, on, showUI } from '@create-figma-plugin/utilities'
|
import { emit, on, showUI } from '@create-figma-plugin/utilities'
|
||||||
|
|
||||||
|
// CORS proxy (dev). Figma plugin has origin:null, so direct calls to APIs without
|
||||||
|
// Access-Control-Allow-Origin fail. Route external requests through this proxy, which
|
||||||
|
// adds `Access-Control-Allow-Origin: *`. Target host must be in the proxy allowlist
|
||||||
|
// (api.apinex.bond, apinex.bond, example.com) — no token needed for those.
|
||||||
|
const CORS_PROXY = 'https://ai-assistant-fig.dynv6.net/proxy'
|
||||||
|
function viaProxy (target: string): string {
|
||||||
|
return CORS_PROXY + '?url=' + encodeURIComponent(target)
|
||||||
|
}
|
||||||
|
|
||||||
// Probe whether the plugin sandbox can reach the public internet.
|
// Probe whether the plugin sandbox can reach the public internet.
|
||||||
// Used on plugin open (so the user sees network status immediately) and before each model fetch.
|
// Used on plugin open (so the user sees network status immediately) and before each model fetch.
|
||||||
async function probeConnectivity () {
|
async function probeConnectivity () {
|
||||||
try {
|
try {
|
||||||
const pr = await fetch('https://example.com')
|
const pr = await fetch(viaProxy('https://example.com'))
|
||||||
emit('PROBE_RESULT', { msg: 'example.com reachable · status=' + pr.status })
|
emit('PROBE_RESULT', { msg: 'example.com reachable · status=' + pr.status })
|
||||||
} catch (pe) {
|
} catch (pe) {
|
||||||
emit('PROBE_RESULT', { msg: 'example.com UNREACHABLE · ' + (pe != null ? (typeof pe === 'string' ? pe : JSON.stringify(pe)) : 'unknown') })
|
emit('PROBE_RESULT', { msg: 'example.com UNREACHABLE · ' + (pe != null ? (typeof pe === 'string' ? pe : JSON.stringify(pe)) : 'unknown') })
|
||||||
@@ -529,7 +538,7 @@ export default function () {
|
|||||||
.replace(/^@url:\s*/i, '') // drop '@url:' annotation if pasted from chat
|
.replace(/^@url:\s*/i, '') // drop '@url:' annotation if pasted from chat
|
||||||
.trim()
|
.trim()
|
||||||
.replace(/\/+$/, '') // drop trailing slashes
|
.replace(/\/+$/, '') // drop trailing slashes
|
||||||
const res = await fetch(base + '/models', {
|
const res = await fetch(viaProxy(base + '/models'), {
|
||||||
headers: { Authorization: 'Bearer ' + payload.apiKey }
|
headers: { Authorization: 'Bearer ' + payload.apiKey }
|
||||||
})
|
})
|
||||||
const raw = await res.text()
|
const raw = await res.text()
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ const MIN_WINDOW_SIZE = { width: 320, height: 200 }
|
|||||||
// very high — actual clamp is done by main via clampWindowSize (bounds*zoom).
|
// very high — actual clamp is done by main via clampWindowSize (bounds*zoom).
|
||||||
|
|
||||||
// Full plugin version shown in the footer status bar. Keep in sync with package.json "version".
|
// Full plugin version shown in the footer status bar. Keep in sync with package.json "version".
|
||||||
const PLUGIN_VERSION = '0.1.16'
|
const PLUGIN_VERSION = '0.1.17'
|
||||||
|
|
||||||
const fieldStyle = {
|
const fieldStyle = {
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
|||||||
Reference in new issue
Block a user