diff options
| author | ruki <[email protected]> | 2022-05-13 00:52:09 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-05-13 00:52:09 +0800 |
| commit | b89c0a712d8e6d6fe056723e8c88e223d4b6e0c3 (patch) | |
| tree | 94a2402c12ad9449be99e119ea251f4da5568c9d | |
| parent | cc645f1d88bd3cbde0db66b4c5400d5065b0368e (diff) | |
add client session
6 files changed, 180 insertions, 26 deletions
diff --git a/xmake/modules/private/service/distcc_build/client.lua b/xmake/modules/private/service/distcc_build/client.lua index 9f85e3d3e..34e590f83 100644 --- a/xmake/modules/private/service/distcc_build/client.lua +++ b/xmake/modules/private/service/distcc_build/client.lua @@ -29,6 +29,7 @@ import("lib.detect.find_tool") import("private.service.client_config", {alias = "config"}) import("private.service.message") import("private.service.client") +import("private.service.distcc_build.client_session") import("private.service.stream", {alias = "socket_stream"}) -- define module diff --git a/xmake/modules/private/service/distcc_build/client_session.lua b/xmake/modules/private/service/distcc_build/client_session.lua new file mode 100644 index 000000000..957e3b550 --- /dev/null +++ b/xmake/modules/private/service/distcc_build/client_session.lua @@ -0,0 +1,129 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki +-- @file client_session.lua +-- + +-- imports +import("core.base.pipe") +import("core.base.bytes") +import("core.base.object") +import("core.base.global") +import("core.base.option") +import("core.base.hashset") +import("core.base.scheduler") +import("private.service.client_config", {alias = "config"}) +import("private.service.message") + +-- define module +local client_session = client_session or object() + +-- init client session +function client_session:init(client, session_id) + self._ID = session_id + self._CLIENT = client +end + +-- get client session id +function client_session:id() + return self._ID +end + +-- get client +function client_session:client() + return self._CLIENT +end + +-- open client session +function client_session:open() + if self:is_connected() then + return + end + + -- update status + local status = self:status() + status.connected = true + status.session_id = self:id() + self:status_save() +end + +-- close client session +function client_session:close() + if not self:is_connected() then + return + end + + -- update status + local status = self:status() + status.connected = false + status.session_id = self:id() + self:status_save() +end + +-- set stream +function client_session:stream_set(stream) + self._STREAM = stream +end + +-- get stream +function client_session:stream() + return self._STREAM +end + +-- get work directory +function client_session:workdir() + return path.join(self:workdir(), "sessons", self:id()) +end + +-- is connected? +function client_session:is_connected() + return self:status().connected +end + +-- get the status +function client_session:status() + local status = self._STATUS + local statusfile = self:statusfile() + if not status then + if os.isfile(statusfile) then + status = io.load(statusfile) + end + status = status or {} + self._STATUS = status + end + return status +end + +-- save status +function client_session:status_save() + io.save(self:statusfile(), self:status()) +end + +-- get status file +function client_session:statusfile() + return path.join(self:workdir(), "status.txt") +end + +function client_session:__tostring() + return string.format("<session %s>", self:id()) +end + +function main(session_id) + local instance = client_session() + instance:init(session_id) + return instance +end diff --git a/xmake/modules/private/service/distcc_build/server.lua b/xmake/modules/private/service/distcc_build/server.lua index f8889b829..80b0e38b3 100644 --- a/xmake/modules/private/service/distcc_build/server.lua +++ b/xmake/modules/private/service/distcc_build/server.lua @@ -19,6 +19,7 @@ -- -- imports +import("core.base.global") import("private.service.server_config", {alias = "config"}) import("private.service.message") import("private.service.server") @@ -50,6 +51,15 @@ function distcc_build_server:class() return distcc_build_server end +-- get work directory +function distcc_build_server:workdir() + local workdir = config.get("distcc_build.workdir") + if not workdir then + workdir = path.join(global.directory(), "service", "server", "distcc_build") + end + return workdir +end + -- on handle message function distcc_build_server:_on_handle(stream, msg) local session_id = msg:session_id() @@ -102,7 +112,7 @@ end function distcc_build_server:_session(session_id) local session = self._SESSIONS[session_id] if not session then - session = server_session(session_id) + session = server_session(server, session_id) self._SESSIONS[session_id] = session end return session diff --git a/xmake/modules/private/service/distcc_build/server_session.lua b/xmake/modules/private/service/distcc_build/server_session.lua index ddfbab1bb..9c564f302 100644 --- a/xmake/modules/private/service/distcc_build/server_session.lua +++ b/xmake/modules/private/service/distcc_build/server_session.lua @@ -32,17 +32,23 @@ import("private.service.message") -- define module local server_session = server_session or object() --- init server_session -function server_session:init(session_id) +-- init server session +function server_session:init(server, session_id) self._ID = session_id + self._SERVER = server end --- get server_session id +-- get server session id function server_session:id() return self._ID end --- open server_session +-- get server +function server_session:server() + return self._SERVER +end + +-- open server session function server_session:open() if self:is_connected() then return @@ -55,7 +61,7 @@ function server_session:open() self:status_save() end --- close server_session +-- close server session function server_session:close() if not self:is_connected() then return @@ -80,11 +86,7 @@ end -- get work directory function server_session:workdir() - local workdir = config.get("distcc_build.workdir") - if not workdir then - workdir = path.join(global.directory(), "service", "server", "distcc_build") - end - return path.join(workdir, "sessons", self:id()) + return path.join(self:server(), "sessons", self:id()) end -- is connected? @@ -120,8 +122,8 @@ function server_session:__tostring() return string.format("<session %s>", self:id()) end -function main(session_id) +function main(server, session_id) local instance = server_session() - instance:init(session_id) + instance:init(server, session_id) return instance end diff --git a/xmake/modules/private/service/remote_build/server.lua b/xmake/modules/private/service/remote_build/server.lua index 79b175cdb..31ddf4b4c 100644 --- a/xmake/modules/private/service/remote_build/server.lua +++ b/xmake/modules/private/service/remote_build/server.lua @@ -19,6 +19,7 @@ -- -- imports +import("core.base.global") import("private.service.server_config", {alias = "config"}) import("private.service.message") import("private.service.server") @@ -50,6 +51,15 @@ function remote_build_server:class() return remote_build_server end +-- get work directory +function remote_build_server:workdir() + local workdir = config.get("remote_build.workdir") + if not workdir then + workdir = path.join(global.directory(), "service", "server", "remote_build") + end + return workdir +end + -- on handle message function remote_build_server:_on_handle(stream, msg) local session_id = msg:session_id() @@ -110,7 +120,7 @@ end function remote_build_server:_session(session_id) local session = self._SESSIONS[session_id] if not session then - session = server_session(session_id) + session = server_session(self, session_id) self._SESSIONS[session_id] = session end return session diff --git a/xmake/modules/private/service/remote_build/server_session.lua b/xmake/modules/private/service/remote_build/server_session.lua index e0bfb4170..761eb7ee2 100644 --- a/xmake/modules/private/service/remote_build/server_session.lua +++ b/xmake/modules/private/service/remote_build/server_session.lua @@ -33,21 +33,27 @@ import("private.service.remote_build.filesync", {alias = "new_filesync"}) -- define module local server_session = server_session or object() --- init server_session -function server_session:init(session_id) +-- init server session +function server_session:init(server, session_id) self._ID = session_id + self._SERVER = server local filesync = new_filesync(self:sourcedir(), path.join(self:workdir(), "manifest.txt")) filesync:ignorefiles_add(".git/**") filesync:ignorefiles_add(".xmake/**") self._FILESYNC = filesync end --- get server_session id +-- get server session id function server_session:id() return self._ID end --- open server_session +-- get server +function server_session:server() + return self._SERVER +end + +-- open server session function server_session:open() if self:is_connected() then return @@ -63,7 +69,7 @@ function server_session:open() self:status_save() end --- close server_session +-- close server session function server_session:close() if not self:is_connected() then return @@ -212,11 +218,7 @@ end -- get work directory function server_session:workdir() - local workdir = config.get("remote_build.workdir") - if not workdir then - workdir = path.join(global.directory(), "service", "server", "remote_build") - end - return path.join(workdir, "sessons", self:id()) + return path.join(self:server():workdir(), "sessons", self:id()) end -- is connected? @@ -364,8 +366,8 @@ function server_session:__tostring() return string.format("<session %s>", self:id()) end -function main(session_id) +function main(server, session_id) local instance = server_session() - instance:init(session_id) + instance:init(server, session_id) return instance end |
