介绍

infinite 模式下,lua配置不使用 Config 变量,而使用 Infinite 变量

基本格式:

Infinite = {
    inbounds = {
        {
            tag = "listen1",
            generator = function(cid, state_index, data)

            end
        }
    },
    outbounds = {
        {
            tag = "dial1",
            generator = function(cid, state_index, data)

            end
        }
    }
}

回顾 Config 入门 ,对比下我们发现, Infinite 的 基本结构 和 Config 类似,都有 inbounds 和 outbounds 列表。

不过,列表中的元素中的项不再是 tag 和 chain , 而是 tag 和 函数 generator!

generator 将被重复调用,以生成 chain. 区别就在于,通过函数,我们每次生成的 chain 的内容是可以不同的,也就是说,infinite 实现了 动态链 机制!

先看个能用的示例:

下面这个演示 与Config 入门 中的示例 是等价的:

local direct = { Direct = {} }

Infinite = {
    inbounds = { {
        tag = "listen1",
        generator = function(cid, state_index, _data)
            if state_index == -1 then
                return 0, {
                    stream_generator = {
                        Listener = { listen_addr = "0.0.0.0:10800" }
                    },
                    new_thread_fn = function(cid, state_index, _data)
                        local new_cid, newi, new_data = coroutine.yield(1, {
                            Socks5 = {}
                        })
                        return -1, {}
                    end
                }
            end
        end
    } },
    outbounds = { {
        tag = "dial1",
        generator = function(cid, state_index, _data)
            if state_index == -1 then
                return 0, direct
            else
                return -1, {}
            end
        end
    } }
}

首先是要了解,generator 的 返回值有两个,第一个值是 index, 负数表示链结束。 第二个值是 当前链节点 所生成的 Map。

如果是 Listener ,情况则复杂一些,要使用一个 {stream_generator, new_thread_fn }

stream_generator 是一个 正常的 InMapConfig, 而 new_thread_fn 则是一个函数, 它在 stream_generator 每监听到一个新请求时被调用, 因此它内部用到了 lua 的用法 coroutine.yield, 这个就照抄就行。

总之 coroutine.yield 参数中 我们又 返回 一个数和一个 InMapConfig, 而 coroutine.yield 函数的 返回的时机, 就是我们再次定义下一个 InMapConfig 的时机。 如果链中还有 Map, 我们可以继续调用 coroutine.yield, 如果已经到了 链尾,我们则 直接 return -1, {} 就行。

不难,习惯就好。

其它

有限动态链

ruci 还有一个 有限动态链 的用法,其功能 完全介于 Infinite (完全动态链) 和 Config (静态链) 之间,请在 项目中搜索 Dyn_Selectors 以进行学习

简单讲 有限动态链 就是 基于 Config 的 列表,动态返回 index. 因此虽然它是 动态的,但却要预先定义好每一种可能,因此叫做 有限动态链 。

因为其夹在 Config 和 Infinite 之间,并没有什么出彩的地方。但是其使用难度比 Infinite 要低很多。

接下来

lua自定义协议