nano-git 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +407 -0
- package/dist/backend/file-backend.d.mts +26 -0
- package/dist/backend/file-backend.mjs +83 -0
- package/dist/backend/file.d.mts +2 -0
- package/dist/backend/file.mjs +2 -0
- package/dist/backend/index.d.mts +2 -0
- package/dist/backend/index.mjs +1 -0
- package/dist/backend/memory-backend.d.mts +25 -0
- package/dist/backend/memory-backend.mjs +33 -0
- package/dist/backend/memory.d.mts +2 -0
- package/dist/backend/memory.mjs +2 -0
- package/dist/backend/types.d.mts +90 -0
- package/dist/core/errors.d.mts +124 -0
- package/dist/core/errors.mjs +168 -0
- package/dist/core/hash-digest.d.mts +35 -0
- package/dist/core/hash-digest.mjs +50 -0
- package/dist/core/hash-file.d.mts +20 -0
- package/dist/core/hash-file.mjs +27 -0
- package/dist/core/hash-path.d.mts +17 -0
- package/dist/core/hash-path.mjs +35 -0
- package/dist/core/types/odb.d.mts +63 -0
- package/dist/core/types/refs.d.mts +140 -0
- package/dist/core/types/refs.mjs +19 -0
- package/dist/core/types/shallow.d.mts +52 -0
- package/dist/core/types.d.mts +154 -0
- package/dist/core/types.mjs +43 -0
- package/dist/errors.d.mts +2 -0
- package/dist/errors.mjs +2 -0
- package/dist/hash-file.d.mts +2 -0
- package/dist/hash-file.mjs +2 -0
- package/dist/index.d.mts +16 -0
- package/dist/index.mjs +14 -0
- package/dist/objects/author.d.mts +25 -0
- package/dist/objects/author.mjs +45 -0
- package/dist/objects/blob.d.mts +15 -0
- package/dist/objects/blob.mjs +20 -0
- package/dist/objects/codec.d.mts +46 -0
- package/dist/objects/codec.mjs +84 -0
- package/dist/objects/commit.d.mts +26 -0
- package/dist/objects/commit.mjs +160 -0
- package/dist/objects/index.d.mts +8 -0
- package/dist/objects/index.mjs +8 -0
- package/dist/objects/raw.d.mts +85 -0
- package/dist/objects/raw.mjs +111 -0
- package/dist/objects/tag.d.mts +26 -0
- package/dist/objects/tag.mjs +148 -0
- package/dist/objects/tree.d.mts +22 -0
- package/dist/objects/tree.mjs +66 -0
- package/dist/odb/file-utils.mjs +136 -0
- package/dist/odb/file.d.mts +22 -0
- package/dist/odb/file.mjs +66 -0
- package/dist/odb/memory.d.mts +22 -0
- package/dist/odb/memory.mjs +54 -0
- package/dist/pack/composite-store.d.mts +76 -0
- package/dist/pack/composite-store.mjs +133 -0
- package/dist/pack/constants.mjs +48 -0
- package/dist/pack/crc32.mjs +38 -0
- package/dist/pack/delta-apply.d.mts +21 -0
- package/dist/pack/delta-apply.mjs +71 -0
- package/dist/pack/delta-create.d.mts +28 -0
- package/dist/pack/delta-create.mjs +151 -0
- package/dist/pack/index.d.mts +16 -0
- package/dist/pack/index.mjs +13 -0
- package/dist/pack/object-header.d.mts +36 -0
- package/dist/pack/object-header.mjs +72 -0
- package/dist/pack/ofs-delta-offset.d.mts +35 -0
- package/dist/pack/ofs-delta-offset.mjs +59 -0
- package/dist/pack/pack-builder-types.d.mts +19 -0
- package/dist/pack/pack-builder.d.mts +52 -0
- package/dist/pack/pack-builder.mjs +80 -0
- package/dist/pack/pack-encoding.mjs +76 -0
- package/dist/pack/pack-index-reader.d.mts +57 -0
- package/dist/pack/pack-index-reader.mjs +90 -0
- package/dist/pack/pack-index-types.d.mts +16 -0
- package/dist/pack/pack-index-writer.d.mts +45 -0
- package/dist/pack/pack-index-writer.mjs +106 -0
- package/dist/pack/pack-reader-resolver.mjs +104 -0
- package/dist/pack/pack-reader-types.d.mts +31 -0
- package/dist/pack/pack-reader-types.mjs +22 -0
- package/dist/pack/pack-reader-utils.mjs +61 -0
- package/dist/pack/pack-reader.d.mts +81 -0
- package/dist/pack/pack-reader.mjs +171 -0
- package/dist/pack/pack-store-loader.mjs +79 -0
- package/dist/pack/pack-store-types.d.mts +16 -0
- package/dist/pack/pack-store.d.mts +55 -0
- package/dist/pack/pack-store.mjs +114 -0
- package/dist/pack/pack-writer.mjs +96 -0
- package/dist/pack/varint.d.mts +34 -0
- package/dist/pack/varint.mjs +57 -0
- package/dist/refs/file.d.mts +6 -0
- package/dist/refs/file.mjs +222 -0
- package/dist/refs/fs-utils.mjs +30 -0
- package/dist/refs/memory.d.mts +14 -0
- package/dist/refs/memory.mjs +104 -0
- package/dist/refs/names.d.mts +57 -0
- package/dist/refs/names.mjs +80 -0
- package/dist/refs/resolve.d.mts +33 -0
- package/dist/refs/resolve.mjs +55 -0
- package/dist/refs/shallow/file.d.mts +17 -0
- package/dist/refs/shallow/file.mjs +61 -0
- package/dist/refs/shallow/memory.d.mts +18 -0
- package/dist/refs/shallow/memory.mjs +33 -0
- package/dist/repository/core.d.mts +3 -0
- package/dist/repository/core.mjs +2 -0
- package/dist/repository/create.d.mts +22 -0
- package/dist/repository/create.mjs +43 -0
- package/dist/repository/file.d.mts +43 -0
- package/dist/repository/file.mjs +82 -0
- package/dist/repository/import/import-glob.mjs +44 -0
- package/dist/repository/import/import-plan-builder.mjs +625 -0
- package/dist/repository/import/import-session-types.d.mts +280 -0
- package/dist/repository/import/import-session.mjs +96 -0
- package/dist/repository/import/import-view.mjs +133 -0
- package/dist/repository/memory.d.mts +17 -0
- package/dist/repository/memory.mjs +33 -0
- package/dist/repository/ops/fetch-operations.mjs +20 -0
- package/dist/repository/ops/fetch-types.d.mts +82 -0
- package/dist/repository/ops/fetch-url.mjs +82 -0
- package/dist/repository/ops/fs-object-operations.mjs +31 -0
- package/dist/repository/ops/maintenance-operations.mjs +62 -0
- package/dist/repository/ops/maintenance-types.d.mts +42 -0
- package/dist/repository/ops/object-operations.mjs +65 -0
- package/dist/repository/ops/object-types.d.mts +109 -0
- package/dist/repository/ops/push-operations.mjs +16 -0
- package/dist/repository/ops/push-resolution.mjs +17 -0
- package/dist/repository/ops/push-types.d.mts +72 -0
- package/dist/repository/ops/push-url.mjs +45 -0
- package/dist/repository/ops/reachability.mjs +60 -0
- package/dist/repository/ops/ref-operations.mjs +86 -0
- package/dist/repository/ops/ref-types.d.mts +70 -0
- package/dist/repository/tree/tree-patch.d.mts +64 -0
- package/dist/repository/tree/tree-patch.mjs +268 -0
- package/dist/repository/tree/tree-walk.d.mts +46 -0
- package/dist/repository/tree/tree-walk.mjs +65 -0
- package/dist/repository/tree/tree-writer.mjs +68 -0
- package/dist/repository/types.d.mts +36 -0
- package/dist/sha1.d.mts +4 -0
- package/dist/sha1.mjs +4 -0
- package/dist/transport/client/receive-pack/http.d.mts +33 -0
- package/dist/transport/client/receive-pack/http.mjs +99 -0
- package/dist/transport/client/receive-pack/push-error.d.mts +23 -0
- package/dist/transport/client/receive-pack/push-error.mjs +32 -0
- package/dist/transport/client/receive-pack/push-pack-plan.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-pack-plan.mjs +60 -0
- package/dist/transport/client/receive-pack/push-policy.d.mts +19 -0
- package/dist/transport/client/receive-pack/push-policy.mjs +64 -0
- package/dist/transport/client/receive-pack/push-ref-plan.d.mts +45 -0
- package/dist/transport/client/receive-pack/push-ref-plan.mjs +108 -0
- package/dist/transport/client/receive-pack/push-report.d.mts +28 -0
- package/dist/transport/client/receive-pack/push-report.mjs +84 -0
- package/dist/transport/client/receive-pack/push-request-plan.mjs +52 -0
- package/dist/transport/client/receive-pack/push.d.mts +32 -0
- package/dist/transport/client/receive-pack/push.mjs +97 -0
- package/dist/transport/client/receive-pack/request.d.mts +39 -0
- package/dist/transport/client/receive-pack/request.mjs +46 -0
- package/dist/transport/client/receive-pack/response.d.mts +26 -0
- package/dist/transport/client/receive-pack/response.mjs +52 -0
- package/dist/transport/client/receive-pack/result.d.mts +34 -0
- package/dist/transport/client/receive-pack/result.mjs +100 -0
- package/dist/transport/client/upload-pack/capability-advertisement.d.mts +56 -0
- package/dist/transport/client/upload-pack/capability-advertisement.mjs +130 -0
- package/dist/transport/client/upload-pack/fetch.d.mts +109 -0
- package/dist/transport/client/upload-pack/fetch.mjs +392 -0
- package/dist/transport/client/upload-pack/http.d.mts +29 -0
- package/dist/transport/client/upload-pack/http.mjs +79 -0
- package/dist/transport/client/upload-pack/ls-refs.d.mts +75 -0
- package/dist/transport/client/upload-pack/ls-refs.mjs +150 -0
- package/dist/transport/client/upload-pack/object-info.d.mts +65 -0
- package/dist/transport/client/upload-pack/object-info.mjs +111 -0
- package/dist/transport/client/upload-pack/types.d.mts +153 -0
- package/dist/transport/http/index.d.mts +3 -0
- package/dist/transport/http/index.mjs +2 -0
- package/dist/transport/http/smart-http.d.mts +46 -0
- package/dist/transport/http/smart-http.mjs +176 -0
- package/dist/transport/http/types.d.mts +27 -0
- package/dist/transport/index.d.mts +9 -0
- package/dist/transport/index.mjs +8 -0
- package/dist/transport/protocol/object-graph.d.mts +63 -0
- package/dist/transport/protocol/object-graph.mjs +149 -0
- package/dist/transport/protocol/pkt-line.d.mts +109 -0
- package/dist/transport/protocol/pkt-line.mjs +195 -0
- package/dist/transport/protocol/ref-advertisement.mjs +185 -0
- package/dist/transport/protocol/ref-collection.d.mts +38 -0
- package/dist/transport/protocol/ref-collection.mjs +63 -0
- package/dist/transport/protocol/ref-match.d.mts +39 -0
- package/dist/transport/protocol/ref-match.mjs +42 -0
- package/dist/transport/protocol/refspec.d.mts +44 -0
- package/dist/transport/protocol/refspec.mjs +79 -0
- package/dist/transport/protocol/side-band.d.mts +65 -0
- package/dist/transport/protocol/side-band.mjs +142 -0
- package/dist/transport/protocol/transport-capabilities.mjs +46 -0
- package/dist/transport/protocol/types.d.mts +148 -0
- package/dist/transport/protocol/update-refs.d.mts +68 -0
- package/dist/transport/protocol/update-refs.mjs +126 -0
- package/dist/transport/receive-pack.d.mts +11 -0
- package/dist/transport/receive-pack.mjs +11 -0
- package/dist/transport/server/receive-pack/advertise.d.mts +28 -0
- package/dist/transport/server/receive-pack/advertise.mjs +88 -0
- package/dist/transport/server/receive-pack/handler.d.mts +30 -0
- package/dist/transport/server/receive-pack/handler.mjs +156 -0
- package/dist/transport/server/receive-pack/index.d.mts +6 -0
- package/dist/transport/server/receive-pack/index.mjs +6 -0
- package/dist/transport/server/receive-pack/parse.d.mts +17 -0
- package/dist/transport/server/receive-pack/parse.mjs +80 -0
- package/dist/transport/server/receive-pack/report-status.mjs +64 -0
- package/dist/transport/server/receive-pack/service.d.mts +41 -0
- package/dist/transport/server/receive-pack/service.mjs +39 -0
- package/dist/transport/server/receive-pack/types.d.mts +56 -0
- package/dist/transport/server/receive-pack/types.mjs +25 -0
- package/dist/transport/server/receive-pack/unpack.mjs +119 -0
- package/dist/transport/server/upload-pack/advertise.d.mts +20 -0
- package/dist/transport/server/upload-pack/advertise.mjs +30 -0
- package/dist/transport/server/upload-pack/command.d.mts +43 -0
- package/dist/transport/server/upload-pack/command.mjs +56 -0
- package/dist/transport/server/upload-pack/fetch.d.mts +43 -0
- package/dist/transport/server/upload-pack/fetch.mjs +217 -0
- package/dist/transport/server/upload-pack/index.d.mts +7 -0
- package/dist/transport/server/upload-pack/index.mjs +7 -0
- package/dist/transport/server/upload-pack/ls-refs.d.mts +38 -0
- package/dist/transport/server/upload-pack/ls-refs.mjs +113 -0
- package/dist/transport/server/upload-pack/service.d.mts +40 -0
- package/dist/transport/server/upload-pack/service.mjs +51 -0
- package/dist/transport/server/upload-pack/types.d.mts +11 -0
- package/dist/transport/server/upload-pack/types.mjs +21 -0
- package/dist/transport/upload-pack.d.mts +7 -0
- package/dist/transport/upload-pack.mjs +6 -0
- package/package.json +98 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { createReceivePackService } from "../server/receive-pack/service.mjs";
|
|
2
|
+
import { UploadPackServiceError } from "../server/upload-pack/types.mjs";
|
|
3
|
+
import { createUploadPackService } from "../server/upload-pack/service.mjs";
|
|
4
|
+
//#region src/transport/http/smart-http.ts
|
|
5
|
+
/**
|
|
6
|
+
* Smart HTTP 服务端适配器
|
|
7
|
+
*
|
|
8
|
+
* 类似 git-http-backend 的职责,但基于标准 Web API 的 Request/Response:
|
|
9
|
+
* - 接收标准 Request,返回标准 Response
|
|
10
|
+
* - 框架无关(Bun、Deno、Node.js、Cloudflare Workers 等均可直接使用)
|
|
11
|
+
* - 无自定义 HTTP 抽象层
|
|
12
|
+
*
|
|
13
|
+
* 当前支持:
|
|
14
|
+
* - upload-pack(fetch + ls-refs)
|
|
15
|
+
* - receive-pack(push)
|
|
16
|
+
*
|
|
17
|
+
* 路由:
|
|
18
|
+
* - GET /info/refs?service=git-upload-pack → v2 能力广告
|
|
19
|
+
* - GET /info/refs?service=git-receive-pack → v1 ref 广告
|
|
20
|
+
* - POST /git-upload-pack → ls-refs / fetch 命令
|
|
21
|
+
* - POST /git-receive-pack → receive-pack(push)处理
|
|
22
|
+
*
|
|
23
|
+
* @see https://git-scm.com/docs/git-http-backend
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 创建 HTTP 错误响应
|
|
27
|
+
*/
|
|
28
|
+
function errorResponse(status, message) {
|
|
29
|
+
return new Response(`${status} ${message}\n`, {
|
|
30
|
+
status,
|
|
31
|
+
headers: { "Content-Type": "text/plain" }
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 验证 info/refs 请求
|
|
36
|
+
*/
|
|
37
|
+
function validateInfoRefsRequest(method, service) {
|
|
38
|
+
if (method !== "GET") return errorResponse(405, "Method Not Allowed: info/refs requires GET");
|
|
39
|
+
if (service !== "git-upload-pack" && service !== "git-receive-pack") return errorResponse(400, `Unknown service: ${service}`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 验证服务请求(/git-upload-pack 等)
|
|
44
|
+
*/
|
|
45
|
+
function validateServiceRequest(method, contentType) {
|
|
46
|
+
if (method !== "POST") return errorResponse(405, "Method Not Allowed: service requires POST");
|
|
47
|
+
if (!contentType || !contentType.startsWith("application/x-git-")) return errorResponse(400, "Bad Content-Type for Git service request");
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 处理 info/refs GET 请求
|
|
52
|
+
*
|
|
53
|
+
* 根据 service 类型返回相应的 ref 广告:
|
|
54
|
+
* - git-upload-pack:返回 v2 能力广告
|
|
55
|
+
* - git-receive-pack:始终返回 v1 ref 广告
|
|
56
|
+
*
|
|
57
|
+
* @param service - 服务类型(git-upload-pack 或 git-receive-pack)
|
|
58
|
+
*/
|
|
59
|
+
function handleInfoRefs(service, uploadPackService, receivePackService) {
|
|
60
|
+
if (service === "git-receive-pack") {
|
|
61
|
+
const advertise = receivePackService.advertise();
|
|
62
|
+
return new Response(advertise, {
|
|
63
|
+
status: 200,
|
|
64
|
+
headers: {
|
|
65
|
+
"Content-Type": "application/x-git-receive-pack-advertisement",
|
|
66
|
+
"Cache-Control": "no-cache"
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const advertise = uploadPackService.advertise();
|
|
71
|
+
const contentType = service.startsWith("git-") ? `application/x-${service}-advertisement` : `application/x-git-${service}-advertisement`;
|
|
72
|
+
return new Response(advertise, {
|
|
73
|
+
status: 200,
|
|
74
|
+
headers: {
|
|
75
|
+
"Content-Type": contentType,
|
|
76
|
+
"Cache-Control": "no-cache"
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 处理 /git-upload-pack POST 请求
|
|
82
|
+
*/
|
|
83
|
+
async function handleUploadPack(body, uploadPackService) {
|
|
84
|
+
if (body.length === 0) return errorResponse(400, "Request body is required");
|
|
85
|
+
let response;
|
|
86
|
+
try {
|
|
87
|
+
response = uploadPackService.handleRequest(body);
|
|
88
|
+
} catch (err) {
|
|
89
|
+
if (err instanceof UploadPackServiceError) return errorResponse(400, err.message);
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
return new Response(response, {
|
|
93
|
+
status: 200,
|
|
94
|
+
headers: {
|
|
95
|
+
"Content-Type": "application/x-git-upload-pack-result",
|
|
96
|
+
"Cache-Control": "no-cache"
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 创建 Smart HTTP 处理函数
|
|
102
|
+
*
|
|
103
|
+
* 类似 git-http-backend 的核心入口。
|
|
104
|
+
* 接收标准 Request,返回标准 Response,框架无关。
|
|
105
|
+
*
|
|
106
|
+
* @param backend - 仓库后端
|
|
107
|
+
* @returns HTTP 处理函数
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* // Bun.serve — 直接作为 fetch 处理器
|
|
112
|
+
* import { createSmartHttpHandler } from "nano-git/transport/http";
|
|
113
|
+
* import { openRepository } from "nano-git/repository/file";
|
|
114
|
+
* Bun.serve({ port: 8080, fetch: createSmartHttpHandler(openRepository("/repo")) });
|
|
115
|
+
*
|
|
116
|
+
* // Node.js http
|
|
117
|
+
* import { createServer } from "node:http";
|
|
118
|
+
* const handler = createSmartHttpHandler(openRepository("/repo"));
|
|
119
|
+
* createServer(async (req, res) => {
|
|
120
|
+
* const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
121
|
+
* const body = await new Promise<Buffer>((resolve) => {
|
|
122
|
+
* const chunks: Buffer[] = [];
|
|
123
|
+
* req.on("data", (c) => chunks.push(c));
|
|
124
|
+
* req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
125
|
+
* });
|
|
126
|
+
* const response = await handler(new Request(url, {
|
|
127
|
+
* method: req.method,
|
|
128
|
+
* headers: Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k, String(v)])),
|
|
129
|
+
* body: req.method === "POST" ? body : undefined,
|
|
130
|
+
* }));
|
|
131
|
+
* res.writeHead(response.status, Object.fromEntries(response.headers));
|
|
132
|
+
* res.end(Buffer.from(await response.arrayBuffer()));
|
|
133
|
+
* }).listen(8080);
|
|
134
|
+
*
|
|
135
|
+
* // Cloudflare Workers / Deno
|
|
136
|
+
* export default { fetch: createSmartHttpHandler(openRepository("./repo")) };
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
function createSmartHttpHandler(backend) {
|
|
140
|
+
const uploadPackService = createUploadPackService(backend);
|
|
141
|
+
const receivePackService = createReceivePackService(backend);
|
|
142
|
+
return async (request) => {
|
|
143
|
+
const url = new URL(request.url);
|
|
144
|
+
const { pathname: path } = url;
|
|
145
|
+
const method = request.method;
|
|
146
|
+
if (path === "/info/refs" || path.endsWith("/info/refs")) {
|
|
147
|
+
const service = url.searchParams.get("service");
|
|
148
|
+
const validationError = validateInfoRefsRequest(method, service);
|
|
149
|
+
if (validationError) return validationError;
|
|
150
|
+
const isV2 = (request.headers.get("git-protocol") ?? "").includes("version=2");
|
|
151
|
+
if (service === "git-upload-pack" && !isV2) return errorResponse(400, "Only Git Wire Protocol v2 is supported for fetch. Set Git-Protocol: version=2 header.");
|
|
152
|
+
return handleInfoRefs(service, uploadPackService, receivePackService);
|
|
153
|
+
}
|
|
154
|
+
if (path === "/git-upload-pack" || path.endsWith("/git-upload-pack")) {
|
|
155
|
+
const validationError = validateServiceRequest(method, request.headers.get("content-type"));
|
|
156
|
+
if (validationError) return validationError;
|
|
157
|
+
return handleUploadPack(Buffer.from(await request.arrayBuffer()), uploadPackService);
|
|
158
|
+
}
|
|
159
|
+
if (path === "/git-receive-pack" || path.endsWith("/git-receive-pack")) {
|
|
160
|
+
const validationError = validateServiceRequest(method, request.headers.get("content-type"));
|
|
161
|
+
if (validationError) return validationError;
|
|
162
|
+
const body = Buffer.from(await request.arrayBuffer());
|
|
163
|
+
const response = receivePackService.handleRequest(body);
|
|
164
|
+
return new Response(response, {
|
|
165
|
+
status: 200,
|
|
166
|
+
headers: {
|
|
167
|
+
"Content-Type": "application/x-git-receive-pack-result",
|
|
168
|
+
"Cache-Control": "no-cache"
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return errorResponse(404, `Not Found: ${path}`);
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
export { createSmartHttpHandler };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/transport/http/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Smart HTTP 适配层类型定义
|
|
4
|
+
*
|
|
5
|
+
* 基于标准 Web API 的 Request/Response,框架无关。
|
|
6
|
+
* 任何支持 Web 标准的环境均可直接使用:
|
|
7
|
+
* - Bun.serve / Deno.serve
|
|
8
|
+
* - Cloudflare Workers
|
|
9
|
+
* - Node.js 18+ (global This)
|
|
10
|
+
* - 各框架的适配层(Hono、Express 等)
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Smart HTTP 处理函数签名
|
|
14
|
+
*
|
|
15
|
+
* 接收标准 Request,返回标准 Response。
|
|
16
|
+
* 纯函数风格,不绑定任何 HTTP 框架。
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const handler: SmartHttpHandler = async (req: Request) => {
|
|
21
|
+
* return new Response("OK", { status: 200 });
|
|
22
|
+
* };
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
type SmartHttpHandler = (request: Request) => Response | Promise<Response>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { SmartHttpHandler };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ApplyRefUpdatesResult, RefMappingRule, RefUpdateRejection, RemoteRef } from "./protocol/types.mjs";
|
|
2
|
+
import { PktLine, PktLineData, PktLineDelimiter, PktLineError, PktLineFlush, PktLineResponseEnd, encodeDelimiterPkt, encodeFlushPkt, encodePktLine, encodeResponseEndPkt, parsePktLines, splitPktLinesFromBuffer } from "./protocol/pkt-line.mjs";
|
|
3
|
+
import { ParsedRefSpec, RefSpecError, mappingRuleToParsedSpec, parseRefSpec, parsedSpecToMappingRule } from "./protocol/refspec.mjs";
|
|
4
|
+
import { getLocalRefs, remoteRefsToMap } from "./protocol/ref-collection.mjs";
|
|
5
|
+
import { mapRefName, matchesRefSpec } from "./protocol/ref-match.mjs";
|
|
6
|
+
import { CollectReachableMissing, collectReachable, isAncestor, peelTagChain } from "./protocol/object-graph.mjs";
|
|
7
|
+
import { SideBandError, extractPackfile, extractProgress, extractRawPackfile } from "./protocol/side-band.mjs";
|
|
8
|
+
import { RefUpdateError, applyRefUpdates, isRefNamespaceRequiringFastForward, resolveBranchTargetHash } from "./protocol/update-refs.mjs";
|
|
9
|
+
export { type ApplyRefUpdatesResult, type CollectReachableMissing, type ParsedRefSpec, type PktLine, type PktLineData, type PktLineDelimiter, PktLineError, type PktLineFlush, type PktLineResponseEnd, type RefMappingRule, RefSpecError, RefUpdateError, type RefUpdateRejection, type RemoteRef, SideBandError, applyRefUpdates, collectReachable, encodeDelimiterPkt, encodeFlushPkt, encodePktLine, encodeResponseEndPkt, extractPackfile, extractProgress, extractRawPackfile, getLocalRefs, isAncestor, isRefNamespaceRequiringFastForward, mapRefName, mappingRuleToParsedSpec, matchesRefSpec, parsePktLines, parseRefSpec, parsedSpecToMappingRule, peelTagChain, remoteRefsToMap, resolveBranchTargetHash, splitPktLinesFromBuffer };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PktLineError, encodeDelimiterPkt, encodeFlushPkt, encodePktLine, encodeResponseEndPkt, parsePktLines, splitPktLinesFromBuffer } from "./protocol/pkt-line.mjs";
|
|
2
|
+
import { collectReachable, isAncestor, peelTagChain } from "./protocol/object-graph.mjs";
|
|
3
|
+
import { getLocalRefs, remoteRefsToMap } from "./protocol/ref-collection.mjs";
|
|
4
|
+
import { RefUpdateError, applyRefUpdates, isRefNamespaceRequiringFastForward, resolveBranchTargetHash } from "./protocol/update-refs.mjs";
|
|
5
|
+
import { RefSpecError, mappingRuleToParsedSpec, parseRefSpec, parsedSpecToMappingRule } from "./protocol/refspec.mjs";
|
|
6
|
+
import { mapRefName, matchesRefSpec } from "./protocol/ref-match.mjs";
|
|
7
|
+
import { SideBandError, extractPackfile, extractProgress, extractRawPackfile } from "./protocol/side-band.mjs";
|
|
8
|
+
export { PktLineError, RefSpecError, RefUpdateError, SideBandError, applyRefUpdates, collectReachable, encodeDelimiterPkt, encodeFlushPkt, encodePktLine, encodeResponseEndPkt, extractPackfile, extractProgress, extractRawPackfile, getLocalRefs, isAncestor, isRefNamespaceRequiringFastForward, mapRefName, mappingRuleToParsedSpec, matchesRefSpec, parsePktLines, parseRefSpec, parsedSpecToMappingRule, peelTagChain, remoteRefsToMap, resolveBranchTargetHash, splitPktLinesFromBuffer };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { SHA1 } from "../../core/types.mjs";
|
|
2
|
+
import { ObjectSource } from "../../core/types/odb.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/transport/protocol/object-graph.d.ts
|
|
5
|
+
/** collectReachable 遇到缺失对象时的策略 */
|
|
6
|
+
type CollectReachableMissing = "throw" | "skip" | "skip-commit-parents";
|
|
7
|
+
/**
|
|
8
|
+
* 从多个起始点收集所有可达对象哈希
|
|
9
|
+
*
|
|
10
|
+
* @param source - 对象源
|
|
11
|
+
* @param roots - 起始哈希列表
|
|
12
|
+
* @param missing - 遇到缺失对象时的行为,透传给 collectReachableFrom
|
|
13
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
14
|
+
* @returns 可达对象哈希集合
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const reachable = collectReachable(source, [headHash]);
|
|
19
|
+
* console.log(reachable.size);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function collectReachable(source: ObjectSource, roots: SHA1[], missing?: CollectReachableMissing, shallowBoundaries?: Set<SHA1>): Set<SHA1>;
|
|
23
|
+
/**
|
|
24
|
+
* 沿 tag 链解引用到最底层的非 tag 对象
|
|
25
|
+
*
|
|
26
|
+
* 遍历 tag → object → 直到遇到非 tag 对象(commit/tree/blob)。
|
|
27
|
+
* 用于 fast-forward 预检:refs/{heads,tags} 之外的命名空间
|
|
28
|
+
* (如 refs/custom/*)允许存储 tag 对象,解引用后才能正确比较祖先关系。
|
|
29
|
+
*
|
|
30
|
+
* @param source - 对象源
|
|
31
|
+
* @param hash - 起点哈希
|
|
32
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
33
|
+
* @returns 解引用后的非 tag 对象哈希,若对象缺失返回 hash 本身
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const peeled = peelTagChain(source, tagHash);
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function peelTagChain(source: ObjectSource, hash: SHA1, shallowBoundaries?: Set<SHA1>): SHA1;
|
|
41
|
+
/**
|
|
42
|
+
* 检查 oldHash 是否为 newHash 的祖先 commit(或二者相等)
|
|
43
|
+
*
|
|
44
|
+
* 从 newHash 出发沿 parent 链回溯,若能找到 oldHash 则返回 true。
|
|
45
|
+
* 支持 tag 对象解引用:非 refs/{heads,tags} 命名空间允许存储 tag 对象,
|
|
46
|
+
* 比较时将 oldHash 和 newHash 沿 tag 链解引用到最底层对象(应为 commit)。
|
|
47
|
+
*
|
|
48
|
+
* @param source - 对象源
|
|
49
|
+
* @param oldHash - 旧的(远端)对象哈希
|
|
50
|
+
* @param newHash - 新的(本地)目标对象哈希
|
|
51
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
52
|
+
* @returns oldHash 是否为 newHash 的祖先
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* if (isAncestor(source, oldTip, newTip)) {
|
|
57
|
+
* console.log("Fast-forward possible");
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare function isAncestor(source: ObjectSource, oldHash: SHA1, newHash: SHA1, shallowBoundaries?: Set<SHA1>): boolean;
|
|
62
|
+
//#endregion
|
|
63
|
+
export { CollectReachableMissing, collectReachable, isAncestor, peelTagChain };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ObjectNotFoundError } from "../../core/errors.mjs";
|
|
2
|
+
import { tryReadObject } from "../../objects/raw.mjs";
|
|
3
|
+
//#region src/transport/protocol/object-graph.ts
|
|
4
|
+
/**
|
|
5
|
+
* 对象图算法(纯 ObjectSource 版本)
|
|
6
|
+
*
|
|
7
|
+
* 提供 commit ancestry / peel / reachability 等图算法基础设施,
|
|
8
|
+
* 供 fetch 和 push 等上层模块共同依赖,避免基础算法挂在场景编排模块中。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { isAncestor, collectReachable } from "./object-graph.ts";
|
|
13
|
+
*
|
|
14
|
+
* const reachable = collectReachable(store, [headHash]);
|
|
15
|
+
* const isFF = isAncestor(store, oldTip, newTip);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
function throwIfMissingObject(source, hash, missing, viaCommitParent, shallowBoundaries) {
|
|
19
|
+
if (viaCommitParent && shallowBoundaries?.has(hash)) return;
|
|
20
|
+
if (missing === "throw" || missing === "skip-commit-parents") throw new ObjectNotFoundError(hash, `Object ${hash} is missing from the local store. The local repository may be incomplete or corrupted.`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 从指定哈希出发,递归收集所有可达对象哈希
|
|
24
|
+
*
|
|
25
|
+
* @param source - 对象源
|
|
26
|
+
* @param hash - 起始对象哈希
|
|
27
|
+
* @param reachable - 用于收集结果的可达集合
|
|
28
|
+
* @param missing - 遇到缺失对象时的行为:
|
|
29
|
+
* - `"skip"`(默认):静默跳过,用于远程排除计算
|
|
30
|
+
* - `"throw"`:任意缺失均抛出错误
|
|
31
|
+
* - `"skip-commit-parents"`:仅沿 commit parent 边缺失时跳过(shallow 场景)
|
|
32
|
+
* @param viaCommitParent - 当前边是否来自 commit 的 parent 引用
|
|
33
|
+
*/
|
|
34
|
+
function collectReachableFrom(source, hash, reachable, missing = "skip", shallowBoundaries, viaCommitParent = false) {
|
|
35
|
+
if (reachable.has(hash)) return;
|
|
36
|
+
const obj = tryReadObject(source, hash);
|
|
37
|
+
if (obj === void 0) {
|
|
38
|
+
throwIfMissingObject(source, hash, missing, viaCommitParent, shallowBoundaries);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
reachable.add(hash);
|
|
42
|
+
switch (obj.type) {
|
|
43
|
+
case "blob": return;
|
|
44
|
+
case "tree":
|
|
45
|
+
for (const entry of obj.entries) collectReachableFrom(source, entry.hash, reachable, missing, shallowBoundaries, false);
|
|
46
|
+
return;
|
|
47
|
+
case "commit":
|
|
48
|
+
collectReachableFrom(source, obj.tree, reachable, missing, shallowBoundaries, false);
|
|
49
|
+
for (const parent of obj.parents) collectReachableFrom(source, parent, reachable, missing, shallowBoundaries, true);
|
|
50
|
+
return;
|
|
51
|
+
case "tag":
|
|
52
|
+
collectReachableFrom(source, obj.object, reachable, missing, shallowBoundaries, false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 从多个起始点收集所有可达对象哈希
|
|
58
|
+
*
|
|
59
|
+
* @param source - 对象源
|
|
60
|
+
* @param roots - 起始哈希列表
|
|
61
|
+
* @param missing - 遇到缺失对象时的行为,透传给 collectReachableFrom
|
|
62
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
63
|
+
* @returns 可达对象哈希集合
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const reachable = collectReachable(source, [headHash]);
|
|
68
|
+
* console.log(reachable.size);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
function collectReachable(source, roots, missing = "skip", shallowBoundaries) {
|
|
72
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
73
|
+
for (const hash of roots) collectReachableFrom(source, hash, reachable, missing, shallowBoundaries, false);
|
|
74
|
+
return reachable;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 沿 tag 链解引用到最底层的非 tag 对象
|
|
78
|
+
*
|
|
79
|
+
* 遍历 tag → object → 直到遇到非 tag 对象(commit/tree/blob)。
|
|
80
|
+
* 用于 fast-forward 预检:refs/{heads,tags} 之外的命名空间
|
|
81
|
+
* (如 refs/custom/*)允许存储 tag 对象,解引用后才能正确比较祖先关系。
|
|
82
|
+
*
|
|
83
|
+
* @param source - 对象源
|
|
84
|
+
* @param hash - 起点哈希
|
|
85
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
86
|
+
* @returns 解引用后的非 tag 对象哈希,若对象缺失返回 hash 本身
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* const peeled = peelTagChain(source, tagHash);
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
function peelTagChain(source, hash, shallowBoundaries) {
|
|
94
|
+
let current = hash;
|
|
95
|
+
while (true) {
|
|
96
|
+
const obj = tryReadObject(source, current);
|
|
97
|
+
if (obj === void 0) {
|
|
98
|
+
if (shallowBoundaries?.has(current)) return current;
|
|
99
|
+
return current;
|
|
100
|
+
}
|
|
101
|
+
if (obj.type !== "tag") return current;
|
|
102
|
+
current = obj.object;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 检查 oldHash 是否为 newHash 的祖先 commit(或二者相等)
|
|
107
|
+
*
|
|
108
|
+
* 从 newHash 出发沿 parent 链回溯,若能找到 oldHash 则返回 true。
|
|
109
|
+
* 支持 tag 对象解引用:非 refs/{heads,tags} 命名空间允许存储 tag 对象,
|
|
110
|
+
* 比较时将 oldHash 和 newHash 沿 tag 链解引用到最底层对象(应为 commit)。
|
|
111
|
+
*
|
|
112
|
+
* @param source - 对象源
|
|
113
|
+
* @param oldHash - 旧的(远端)对象哈希
|
|
114
|
+
* @param newHash - 新的(本地)目标对象哈希
|
|
115
|
+
* @param shallowBoundaries - 已知 shallow 边界集合(可选)
|
|
116
|
+
* @returns oldHash 是否为 newHash 的祖先
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* if (isAncestor(source, oldTip, newTip)) {
|
|
121
|
+
* console.log("Fast-forward possible");
|
|
122
|
+
* }
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
function isAncestor(source, oldHash, newHash, shallowBoundaries) {
|
|
126
|
+
if (oldHash === newHash) return true;
|
|
127
|
+
const peeledOld = peelTagChain(source, oldHash, shallowBoundaries);
|
|
128
|
+
const peeledNew = peelTagChain(source, newHash, shallowBoundaries);
|
|
129
|
+
if (peeledOld === peeledNew) return true;
|
|
130
|
+
const visited = /* @__PURE__ */ new Set();
|
|
131
|
+
const queue = [peeledNew];
|
|
132
|
+
while (queue.length > 0) {
|
|
133
|
+
const current = queue.shift();
|
|
134
|
+
if (current === peeledOld) return true;
|
|
135
|
+
if (visited.has(current)) continue;
|
|
136
|
+
visited.add(current);
|
|
137
|
+
const obj = tryReadObject(source, current);
|
|
138
|
+
if (obj === void 0) {
|
|
139
|
+
if (current === peeledOld) return true;
|
|
140
|
+
if (shallowBoundaries?.has(current)) return true;
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
if (obj.type !== "commit") continue;
|
|
144
|
+
for (const parent of obj.parents) if (!visited.has(parent)) queue.push(parent);
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
//#endregion
|
|
149
|
+
export { collectReachable, isAncestor, peelTagChain };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { GitError } from "../../core/errors.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/transport/protocol/pkt-line.d.ts
|
|
4
|
+
/** pkt-line 解码结果 */
|
|
5
|
+
interface PktLineData {
|
|
6
|
+
type: "data";
|
|
7
|
+
/** 负载数据(不含 4 字节长度前缀) */
|
|
8
|
+
payload: Buffer;
|
|
9
|
+
}
|
|
10
|
+
interface PktLineFlush {
|
|
11
|
+
type: "flush";
|
|
12
|
+
}
|
|
13
|
+
interface PktLineDelimiter {
|
|
14
|
+
type: "delimiter";
|
|
15
|
+
}
|
|
16
|
+
interface PktLineResponseEnd {
|
|
17
|
+
type: "response-end";
|
|
18
|
+
}
|
|
19
|
+
/** 解析后的 pkt-line 类型 */
|
|
20
|
+
type PktLine = PktLineData | PktLineFlush | PktLineDelimiter | PktLineResponseEnd;
|
|
21
|
+
/**
|
|
22
|
+
* pkt-line 协议错误
|
|
23
|
+
*
|
|
24
|
+
* 当 pkt-line 数据格式不符合 Git 协议规范时抛出。
|
|
25
|
+
*/
|
|
26
|
+
declare class PktLineError extends GitError {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 编码 pkt-line 数据帧
|
|
31
|
+
*
|
|
32
|
+
* 将 payload 编码为 pkt-line 格式:"XXXX<payload>"
|
|
33
|
+
* 其中 XXXX 是含 4 字节前缀的总长度(十六进制)。
|
|
34
|
+
*
|
|
35
|
+
* @param payload - 负载数据(字符串或 Buffer)
|
|
36
|
+
* @returns pkt-line 编码后的 Buffer
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const buf = encodePktLine("hello");
|
|
41
|
+
* console.log(buf.toString("utf-8")); // => "0009hello"
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare function encodePktLine(payload: string | Buffer): Buffer;
|
|
45
|
+
/**
|
|
46
|
+
* 生成 flush-pkt
|
|
47
|
+
*
|
|
48
|
+
* @returns Buffer("0000")
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const buf = encodeFlushPkt();
|
|
53
|
+
* console.log(buf.toString("utf-8")); // => "0000"
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
declare function encodeFlushPkt(): Buffer;
|
|
57
|
+
/**
|
|
58
|
+
* 生成 delimiter-pkt(协议 v2)
|
|
59
|
+
*
|
|
60
|
+
* @returns Buffer("0001")
|
|
61
|
+
*/
|
|
62
|
+
declare function encodeDelimiterPkt(): Buffer;
|
|
63
|
+
/**
|
|
64
|
+
* 生成 response-end-pkt(协议 v2)
|
|
65
|
+
*
|
|
66
|
+
* @returns Buffer("0002")
|
|
67
|
+
*/
|
|
68
|
+
declare function encodeResponseEndPkt(): Buffer;
|
|
69
|
+
/**
|
|
70
|
+
* 解析 pkt-line 编码的完整数据流
|
|
71
|
+
*
|
|
72
|
+
* 将包含一个或多个 pkt-line 帧的 Buffer 解析为 PktLine 数组。
|
|
73
|
+
*
|
|
74
|
+
* @param data - 完整的 pkt-line 编码数据
|
|
75
|
+
* @returns 解析后的 PktLine 列表
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* const lines = parsePktLines(Buffer.from("0009hello0000", "utf-8"));
|
|
80
|
+
* // lines[0] = { type: "data", payload: Buffer("hello") }
|
|
81
|
+
* // lines[1] = { type: "flush" }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
declare function parsePktLines(data: Buffer): PktLine[];
|
|
85
|
+
/**
|
|
86
|
+
* 解析 pkt-line 编码的数据流,将有效帧与尾部原始二进制数据分离
|
|
87
|
+
*
|
|
88
|
+
* 与 {@link parsePktLines} 不同,此函数不会因尾部存在非 pkt-line 原始数据而抛出错误,
|
|
89
|
+
* 而是将剩余数据作为 trailing 返回。适用于解析非 side-band 编码的 upload-pack 响应:
|
|
90
|
+
* pkt-line 头部(ACK/NAK)+ 尾部原始 packfile 数据。
|
|
91
|
+
*
|
|
92
|
+
* @param data - 可能包含尾部原始数据的 pkt-line 编码 buffer
|
|
93
|
+
* @returns 解析出的帧列表和尾部原始数据
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const { lines, trailing } = splitPktLinesFromBuffer(
|
|
98
|
+
* Buffer.concat([encodePktLine("NAK\n"), rawPackfile]),
|
|
99
|
+
* );
|
|
100
|
+
* // lines[0] = { type: "data", payload: Buffer("NAK\n") }
|
|
101
|
+
* // trailing = <raw packfile>
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare function splitPktLinesFromBuffer(data: Buffer): {
|
|
105
|
+
lines: PktLine[];
|
|
106
|
+
trailing: Buffer;
|
|
107
|
+
};
|
|
108
|
+
//#endregion
|
|
109
|
+
export { PktLine, PktLineData, PktLineDelimiter, PktLineError, PktLineFlush, PktLineResponseEnd, encodeDelimiterPkt, encodeFlushPkt, encodePktLine, encodeResponseEndPkt, parsePktLines, splitPktLinesFromBuffer };
|