From ad146148429fa955cb05785a837ef33f12e385f2 Mon Sep 17 00:00:00 2001 From: dragon Date: Tue, 25 Nov 2025 15:29:12 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=83=A8=E5=88=86=20block=20?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E8=B0=83=E6=95=B4=20js=20=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=99=A8=E7=9A=84=20kv=20=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/hello_world/index.html | 2 +- global-types/globals.d.ts | 8 +++++--- pkg/core/domain.go | 12 +++--------- pkg/core/meta.go | 10 ++++++++-- pkg/filters/block.go | 3 ++- pkg/filters/goja/goja.go | 3 ++- pkg/filters/goja/var_kv.go | 18 ++++++++---------- pkg/server.go | 5 +++-- tests/filter_block_test.go | 4 ++-- 9 files changed, 34 insertions(+), 31 deletions(-) diff --git a/examples/hello_world/index.html b/examples/hello_world/index.html index 301f4ab..3898290 100644 --- a/examples/hello_world/index.html +++ b/examples/hello_world/index.html @@ -5,7 +5,7 @@ - js 验证 + Hello World

Hello World

diff --git a/global-types/globals.d.ts b/global-types/globals.d.ts index 659109f..cc2d6f1 100644 --- a/global-types/globals.d.ts +++ b/global-types/globals.d.ts @@ -1,4 +1,4 @@ -// goja.d.ts +// global.d.ts declare global { @@ -25,6 +25,7 @@ declare global { put(key: string, value: string): Promise; } + // @ts-ignore const event: EventSystem; // Request 相关类型 @@ -103,8 +104,8 @@ declare global { } interface KVSystem { - repo(group: string): KVOps; - org(group: string): KVOps; + repo(...group: string[]): KVOps; + org(...group: string[]): KVOps; } const kv: KVSystem; @@ -118,6 +119,7 @@ declare global { debug(...args: any[]): void; } + // @ts-ignore const console: Console; } diff --git a/pkg/core/domain.go b/pkg/core/domain.go index db9452b..39d8197 100644 --- a/pkg/core/domain.go +++ b/pkg/core/domain.go @@ -12,17 +12,15 @@ import ( type PageDomain struct { *ServerMeta - alias *DomainAlias baseDomain string defaultBranch string } -func NewPageDomain(meta *ServerMeta, alias *DomainAlias, baseDomain, defaultBranch string) *PageDomain { +func NewPageDomain(meta *ServerMeta, baseDomain, defaultBranch string) *PageDomain { return &PageDomain{ baseDomain: baseDomain, defaultBranch: defaultBranch, ServerMeta: meta, - alias: alias, } } @@ -40,7 +38,7 @@ func (p *PageDomain) ParseDomainMeta(ctx context.Context, domain, path, branch s } pathArr := strings.Split(strings.TrimPrefix(path, "/"), "/") if !strings.HasSuffix(domain, "."+p.baseDomain) { - alias, err := p.alias.Query(ctx, domain) // 确定 alias 是否存在内容 + alias, err := p.Alias.Query(ctx, domain) // 确定 alias 是否存在内容 if err != nil { zap.L().Warn("unknown domain", zap.String("base", p.baseDomain), zap.String("domain", domain), zap.Error(err)) return nil, os.ErrNotExist @@ -83,10 +81,6 @@ func (p *PageDomain) returnMeta(ctx context.Context, owner, repo, branch string, result.Owner = owner result.Repo = repo result.Path = strings.Join(path, "/") - // todo: 优化保存逻辑 ,减少写入 - if err = p.alias.Bind(ctx, meta.Alias, result.Owner, result.Repo, branch); err != nil { - zap.L().Warn("alias binding error.", zap.Error(err)) - return nil, err - } + return result, nil } diff --git a/pkg/core/meta.go b/pkg/core/meta.go index 5e4db20..89398d8 100644 --- a/pkg/core/meta.go +++ b/pkg/core/meta.go @@ -24,6 +24,7 @@ import ( type ServerMeta struct { Backend Domain string + Alias *DomainAlias client *http.Client cache *tools.KVCache[PageMetaContent] @@ -70,10 +71,11 @@ func (m *PageMetaContent) String() string { return string(marshal) } -func NewServerMeta(client *http.Client, backend Backend, domain string, cache kv.KV, ttl time.Duration) *ServerMeta { +func NewServerMeta(client *http.Client, backend Backend, domain string, alias *DomainAlias, cache kv.KV, ttl time.Duration) *ServerMeta { return &ServerMeta{ Backend: backend, Domain: domain, + Alias: alias, client: client, cache: tools.NewCache[PageMetaContent](cache, "meta", ttl), locker: utils.NewLocker(), @@ -144,7 +146,11 @@ func (s *ServerMeta) GetMeta(ctx context.Context, owner, repo, branch string) (* _ = s.cache.Store(ctx, key, *rel) return nil, err } - + // todo: 优化保存逻辑 ,减少写入 + if err = s.Alias.Bind(ctx, rel.Alias, owner, repo, branch); err != nil { + zap.L().Warn("alias binding error.", zap.Error(err)) + return nil, err + } _ = s.cache.Store(ctx, key, *rel) return rel, nil } diff --git a/pkg/filters/block.go b/pkg/filters/block.go index 5ccc32f..cc80a9c 100644 --- a/pkg/filters/block.go +++ b/pkg/filters/block.go @@ -2,6 +2,7 @@ package filters import ( "net/http" + "os" "gopkg.d7z.net/gitea-pages/pkg/core" ) @@ -16,7 +17,7 @@ func FilterInstBlock(_ core.Params) (core.FilterInstance, error) { return nil, err } if param.Code == 0 { - param.Code = http.StatusForbidden + return nil, os.ErrNotExist } if param.Message == "" { param.Message = http.StatusText(param.Code) diff --git a/pkg/filters/goja/goja.go b/pkg/filters/goja/goja.go index 75edbcd..1687fcf 100644 --- a/pkg/filters/goja/goja.go +++ b/pkg/filters/goja/goja.go @@ -17,6 +17,7 @@ import ( ) // todo: 新增超时配置 + func FilterInstGoJa(gl core.Params) (core.FilterInstance, error) { var global struct { Timeout time.Duration `json:"timeout"` @@ -50,7 +51,7 @@ func FilterInstGoJa(gl core.Params) (core.FilterInstance, error) { debug := NewDebug(global.EnableDebug && param.Debug && request.URL.Query(). Get("debug") == "true", request, w) - program, err := goja.Compile("main.js", js, false) + program, err := goja.Compile(param.Exec, js, false) if err != nil { return debug.Flush(err) } diff --git a/pkg/filters/goja/var_kv.go b/pkg/filters/goja/var_kv.go index 372f8da..acbb484 100644 --- a/pkg/filters/goja/var_kv.go +++ b/pkg/filters/goja/var_kv.go @@ -2,7 +2,6 @@ package goja import ( "os" - "strings" "github.com/dop251/goja" "github.com/pkg/errors" @@ -12,22 +11,21 @@ import ( func KVInject(ctx core.FilterContext, jsCtx *goja.Runtime) error { return jsCtx.GlobalObject().Set("kv", map[string]interface{}{ - "repo": func(group string) (goja.Value, error) { - return kvResult(ctx.RepoDB)(ctx, jsCtx, group) + "repo": func(group ...string) (goja.Value, error) { + return kvResult(ctx.RepoDB)(ctx, jsCtx, group...) }, - "org": func(group string) (goja.Value, error) { - return kvResult(ctx.OrgDB)(ctx, jsCtx, group) + "org": func(group ...string) (goja.Value, error) { + return kvResult(ctx.OrgDB)(ctx, jsCtx, group...) }, }) } -func kvResult(db kv.CursorPagedKV) func(ctx core.FilterContext, jsCtx *goja.Runtime, group string) (goja.Value, error) { - return func(ctx core.FilterContext, jsCtx *goja.Runtime, group string) (goja.Value, error) { - group = strings.TrimSpace(group) - if group == "" { +func kvResult(db kv.CursorPagedKV) func(ctx core.FilterContext, jsCtx *goja.Runtime, group ...string) (goja.Value, error) { + return func(ctx core.FilterContext, jsCtx *goja.Runtime, group ...string) (goja.Value, error) { + if len(group) == 0 { return goja.Undefined(), errors.New("invalid group") } - db := db.Child(group).(kv.CursorPagedKV) + db := db.Child(group...).(kv.CursorPagedKV) return jsCtx.ToValue(map[string]interface{}{ "get": func(key string) (goja.Value, error) { get, err := db.Get(ctx, key) diff --git a/pkg/server.go b/pkg/server.go index 47f681c..3396cdd 100644 --- a/pkg/server.go +++ b/pkg/server.go @@ -54,8 +54,9 @@ func NewPageServer( errorHandler func(w http.ResponseWriter, r *http.Request, err error), filterConfig map[string]map[string]any, ) (*Server, error) { - svcMeta := core.NewServerMeta(client, backend, domain, cacheMeta, cacheMetaTTL) - pageMeta := core.NewPageDomain(svcMeta, core.NewDomainAlias(db.Child("config", "alias")), domain, defaultBranch) + alias := core.NewDomainAlias(db.Child("config", "alias")) + svcMeta := core.NewServerMeta(client, backend, domain, alias, cacheMeta, cacheMetaTTL) + pageMeta := core.NewPageDomain(svcMeta, domain, defaultBranch) globCache, err := lru.New[string, glob.Glob](512) if err != nil { return nil, err diff --git a/tests/filter_block_test.go b/tests/filter_block_test.go index 419a9d2..3b83a37 100644 --- a/tests/filter_block_test.go +++ b/tests/filter_block_test.go @@ -23,7 +23,7 @@ func Test_filter_block(t *testing.T) { routes: - path: "bad.html" block: - code: + code: 403 `) data, _, err = server.OpenFile("https://org1.example.com/repo1/") assert.NoError(t, err) @@ -32,5 +32,5 @@ routes: assert.Equal(t, 403, resp.StatusCode) // 默认排除的内容 _, resp, _ = server.OpenFile("https://org1.example.com/repo1/.pages.yaml") - assert.Equal(t, 403, resp.StatusCode) + assert.Equal(t, 404, resp.StatusCode) }