@openclaw/lobster 2026.7.2-beta.7 → 2026.7.34
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/dist/index.js +149 -9
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/dependabot.yml +2 -42
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/workflows/ci.yml +3 -51
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/README.md +9 -9
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/index.js +246 -41
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/utils.js +319 -157
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/package.json +4 -4
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/equal.test.js +31 -54
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/parse.test.js +2 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security.test.js +211 -3
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/uri-js.test.js +1 -1
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/util.test.js +0 -9
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/tsconfig.json +7 -8
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.d.ts +9 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.test-d.ts +17 -0
- package/node_modules/typebox/build/compile/validator.d.mts +4 -1
- package/node_modules/typebox/build/guard/guard.d.mts +1 -1
- package/node_modules/typebox/build/guard/guard.mjs +2 -5
- package/node_modules/typebox/build/guard/string.mjs +4 -16
- package/node_modules/typebox/build/schema/engine/_functions.mjs +15 -34
- package/node_modules/typebox/build/type/action/readonly_object.d.mts +0 -5
- package/node_modules/typebox/build/type/action/readonly_object.mjs +0 -8
- package/node_modules/typebox/build/typebox.d.mts +1 -1
- package/node_modules/typebox/build/typebox.mjs +1 -1
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +32 -29
- package/openclaw.plugin.json +0 -1
- package/package.json +5 -5
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/benchmark/encoder.mjs +0 -54
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/scheme-normalization.test.js +0 -16
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security-utf8-encoding.test.js +0 -0
- package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.tst.ts +0 -15
package/dist/index.js
CHANGED
|
@@ -1,18 +1,137 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
2
3
|
import { optionalNonNegativeIntegerSchema, optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
|
|
3
4
|
import { readNonNegativeIntegerParam, readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
|
|
4
5
|
import { jsonResult } from "openclaw/plugin-sdk/tool-results";
|
|
5
6
|
import { Type } from "typebox";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
6
8
|
import { stat } from "node:fs/promises";
|
|
7
9
|
import path from "node:path";
|
|
8
10
|
import { Readable, Writable } from "node:stream";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
//#region extensions/lobster/src/lobster-ajv-cache.ts
|
|
14
|
+
const installedSymbol = Symbol.for("openclaw.lobster.ajv-compile-cache.installed");
|
|
15
|
+
const cacheSymbol = Symbol.for("openclaw.lobster.ajv-compile-cache.entries");
|
|
16
|
+
const maxEntries = 512;
|
|
17
|
+
function stableJsonStringify(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
18
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
19
|
+
if (seen.has(value)) throw new TypeError("Cannot cache cyclic JSON schema");
|
|
20
|
+
seen.add(value);
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
const items = value.map((entry) => stableJsonStringify(entry, seen));
|
|
23
|
+
seen.delete(value);
|
|
24
|
+
return `[${items.join(",")}]`;
|
|
25
|
+
}
|
|
26
|
+
const record = value;
|
|
27
|
+
const properties = Object.keys(record).toSorted().filter((key) => record[key] !== void 0).map((key) => `${JSON.stringify(key)}:${stableJsonStringify(record[key], seen)}`);
|
|
28
|
+
seen.delete(value);
|
|
29
|
+
return `{${properties.join(",")}}`;
|
|
30
|
+
}
|
|
31
|
+
function compileCacheKey(schema) {
|
|
32
|
+
try {
|
|
33
|
+
return createHash("sha256").update(stableJsonStringify(schema)).digest("hex");
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function readCompileCache(instance) {
|
|
39
|
+
let cache = instance[cacheSymbol];
|
|
40
|
+
if (!cache) {
|
|
41
|
+
cache = /* @__PURE__ */ new Map();
|
|
42
|
+
Object.defineProperty(instance, cacheSymbol, {
|
|
43
|
+
value: cache,
|
|
44
|
+
configurable: true
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return cache;
|
|
48
|
+
}
|
|
49
|
+
function rememberCompiledValidator(params) {
|
|
50
|
+
const { cache, instance, key, removeSchema, schema, validate } = params;
|
|
51
|
+
if (!cache.has(key) && cache.size >= maxEntries) {
|
|
52
|
+
const oldest = cache.keys().next().value;
|
|
53
|
+
if (oldest !== void 0) {
|
|
54
|
+
const evicted = cache.get(oldest);
|
|
55
|
+
cache.delete(oldest);
|
|
56
|
+
if (evicted) removeSchema.call(instance, evicted.schema);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
cache.set(key, {
|
|
60
|
+
schema,
|
|
61
|
+
validate
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function resolveLobsterAjvConstructor(packageEntryPath) {
|
|
65
|
+
const ajvPath = createRequire(packageEntryPath).resolve("ajv");
|
|
66
|
+
const ajvModule = await import(pathToFileURL(ajvPath).href);
|
|
67
|
+
return ajvModule.default ?? ajvModule;
|
|
68
|
+
}
|
|
69
|
+
async function installLobsterAjvCompileCache(packageEntryPath) {
|
|
70
|
+
let AjvCtor;
|
|
71
|
+
try {
|
|
72
|
+
AjvCtor = await resolveLobsterAjvConstructor(packageEntryPath);
|
|
73
|
+
} catch {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const proto = AjvCtor.prototype;
|
|
77
|
+
if (proto[installedSymbol]) return;
|
|
78
|
+
const originalCompile = proto.compile;
|
|
79
|
+
const originalRemoveSchema = proto.removeSchema;
|
|
80
|
+
Object.defineProperty(proto, installedSymbol, {
|
|
81
|
+
value: true,
|
|
82
|
+
configurable: true
|
|
83
|
+
});
|
|
84
|
+
proto.compile = function compileWithContentCache(schema) {
|
|
85
|
+
const key = compileCacheKey(schema);
|
|
86
|
+
if (!key) return originalCompile.call(this, schema);
|
|
87
|
+
const cache = readCompileCache(this);
|
|
88
|
+
const cached = cache.get(key);
|
|
89
|
+
if (cached) return cached.validate;
|
|
90
|
+
const validate = originalCompile.call(this, schema);
|
|
91
|
+
rememberCompiledValidator({
|
|
92
|
+
cache,
|
|
93
|
+
instance: this,
|
|
94
|
+
key,
|
|
95
|
+
removeSchema: originalRemoveSchema,
|
|
96
|
+
schema,
|
|
97
|
+
validate
|
|
98
|
+
});
|
|
99
|
+
return validate;
|
|
100
|
+
};
|
|
101
|
+
proto.removeSchema = function removeSchemaAndClearContentCache(schemaKeyRef) {
|
|
102
|
+
this[cacheSymbol]?.clear();
|
|
103
|
+
return originalRemoveSchema.call(this, schemaKeyRef);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
9
107
|
//#region extensions/lobster/src/lobster-runner.ts
|
|
108
|
+
const lobsterRequire = createRequire(import.meta.url);
|
|
10
109
|
const workflowExts = /* @__PURE__ */ new Set([
|
|
11
110
|
".lobster",
|
|
12
111
|
".yaml",
|
|
13
112
|
".yml",
|
|
14
113
|
".json"
|
|
15
114
|
]);
|
|
115
|
+
function toEmbeddedToolRuntime(moduleExports, source) {
|
|
116
|
+
const { runToolRequest, resumeToolRequest } = moduleExports;
|
|
117
|
+
if (typeof runToolRequest === "function" && typeof resumeToolRequest === "function") return {
|
|
118
|
+
runToolRequest,
|
|
119
|
+
resumeToolRequest
|
|
120
|
+
};
|
|
121
|
+
throw new Error(`${source} does not export Lobster embedded runtime functions`);
|
|
122
|
+
}
|
|
123
|
+
function findLobsterPackageRoot(resolvedEntryPath) {
|
|
124
|
+
let dir = path.dirname(resolvedEntryPath);
|
|
125
|
+
while (true) {
|
|
126
|
+
const packageJsonPath = path.join(dir, "package.json");
|
|
127
|
+
try {
|
|
128
|
+
if (JSON.parse(readFileSync(packageJsonPath, "utf8")).name === "@clawdbot/lobster") return dir;
|
|
129
|
+
} catch {}
|
|
130
|
+
const parent = path.dirname(dir);
|
|
131
|
+
if (parent === dir) throw new Error(`Could not locate @clawdbot/lobster package root from ${resolvedEntryPath}`);
|
|
132
|
+
dir = parent;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
16
135
|
function normalizeForCwdSandbox(p) {
|
|
17
136
|
const normalized = path.normalize(p);
|
|
18
137
|
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
@@ -131,12 +250,29 @@ async function withTimeout(timeoutMs, fn) {
|
|
|
131
250
|
});
|
|
132
251
|
});
|
|
133
252
|
}
|
|
134
|
-
async function loadEmbeddedToolRuntimeFromPackage() {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
253
|
+
async function loadEmbeddedToolRuntimeFromPackage(options = {}) {
|
|
254
|
+
const importModule = options.importModule ?? (async (specifier) => await import(specifier));
|
|
255
|
+
const packageEntryPath = (options.resolvePackageEntry ?? ((specifier) => lobsterRequire.resolve(specifier)))("@clawdbot/lobster");
|
|
256
|
+
await installLobsterAjvCompileCache(packageEntryPath);
|
|
257
|
+
let coreLoadError;
|
|
258
|
+
try {
|
|
259
|
+
return toEmbeddedToolRuntime(await importModule([
|
|
260
|
+
"@clawdbot",
|
|
261
|
+
"lobster",
|
|
262
|
+
"core"
|
|
263
|
+
].join("/")), "@clawdbot/lobster/core");
|
|
264
|
+
} catch (error) {
|
|
265
|
+
coreLoadError = error;
|
|
266
|
+
}
|
|
267
|
+
let fallbackLoadError;
|
|
268
|
+
try {
|
|
269
|
+
const packageRoot = findLobsterPackageRoot(packageEntryPath);
|
|
270
|
+
const coreRuntimeUrl = pathToFileURL(path.join(packageRoot, "dist/src/core/index.js")).href;
|
|
271
|
+
return toEmbeddedToolRuntime(await importModule(coreRuntimeUrl), coreRuntimeUrl);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
fallbackLoadError = error;
|
|
274
|
+
}
|
|
275
|
+
throw new Error("Failed to load the Lobster embedded runtime", { cause: new AggregateError([coreLoadError, fallbackLoadError], "Both Lobster embedded runtime load paths failed") });
|
|
140
276
|
}
|
|
141
277
|
function createEmbeddedLobsterRunner(options) {
|
|
142
278
|
const loadRuntime = options?.loadRuntime ?? loadEmbeddedToolRuntimeFromPackage;
|
|
@@ -435,11 +571,12 @@ function parseResumeFlowParams(params) {
|
|
|
435
571
|
};
|
|
436
572
|
}
|
|
437
573
|
function formatManagedFlowResult(result) {
|
|
438
|
-
|
|
574
|
+
const details = {
|
|
439
575
|
...result.envelope && typeof result.envelope === "object" && !Array.isArray(result.envelope) ? result.envelope : { envelope: result.envelope },
|
|
440
576
|
flow: result.flow,
|
|
441
577
|
mutation: result.mutation
|
|
442
|
-
}
|
|
578
|
+
};
|
|
579
|
+
return jsonResult(details);
|
|
443
580
|
}
|
|
444
581
|
function requireTaskFlowRuntime(taskFlow, action) {
|
|
445
582
|
if (!taskFlow) throw new Error(`Managed TaskFlow ${action} mode requires a bound taskFlow runtime`);
|
|
@@ -456,7 +593,10 @@ function createLobsterTool(api, options) {
|
|
|
456
593
|
label: "Lobster Workflow",
|
|
457
594
|
description: "Run Lobster pipelines as a local-first workflow runtime (typed JSON envelope + resumable approvals).",
|
|
458
595
|
parameters: Type.Object({
|
|
459
|
-
action: Type.
|
|
596
|
+
action: Type.Unsafe({
|
|
597
|
+
type: "string",
|
|
598
|
+
enum: ["run", "resume"]
|
|
599
|
+
}),
|
|
460
600
|
pipeline: Type.Optional(Type.String()),
|
|
461
601
|
argsJson: Type.Optional(Type.String()),
|
|
462
602
|
token: Type.Optional(Type.String()),
|
|
@@ -2,52 +2,12 @@ version: 2
|
|
|
2
2
|
updates:
|
|
3
3
|
- package-ecosystem: "github-actions"
|
|
4
4
|
directory: "/"
|
|
5
|
-
commit-message:
|
|
6
|
-
# Prefix all commit messages with "chore: "
|
|
7
|
-
prefix: "chore"
|
|
8
5
|
schedule:
|
|
9
|
-
interval: "
|
|
10
|
-
cooldown:
|
|
11
|
-
default-days: 7
|
|
12
|
-
allow:
|
|
13
|
-
- dependency-name: "*"
|
|
14
|
-
update-types:
|
|
15
|
-
- "version-update:semver-major"
|
|
6
|
+
interval: "monthly"
|
|
16
7
|
open-pull-requests-limit: 10
|
|
17
8
|
|
|
18
9
|
- package-ecosystem: "npm"
|
|
19
10
|
directory: "/"
|
|
20
|
-
commit-message:
|
|
21
|
-
# Prefix all commit messages with "chore: "
|
|
22
|
-
prefix: "chore"
|
|
23
11
|
schedule:
|
|
24
|
-
interval: "
|
|
25
|
-
cooldown:
|
|
26
|
-
default-days: 7
|
|
27
|
-
versioning-strategy: "increase-if-necessary"
|
|
28
|
-
allow:
|
|
29
|
-
- dependency-name: "*"
|
|
30
|
-
update-types:
|
|
31
|
-
- "version-update:semver-major"
|
|
32
|
-
ignore:
|
|
33
|
-
# TODO: remove ignore until neostandard support ESLint 10
|
|
34
|
-
- dependency-name: "eslint"
|
|
35
|
-
- dependency-name: "neostandard"
|
|
36
|
-
- dependency-name: "@stylistic/*"
|
|
12
|
+
interval: "monthly"
|
|
37
13
|
open-pull-requests-limit: 10
|
|
38
|
-
groups:
|
|
39
|
-
# Production dependencies with breaking changes
|
|
40
|
-
dependencies:
|
|
41
|
-
dependency-type: "production"
|
|
42
|
-
# ESLint related dependencies
|
|
43
|
-
dev-dependencies-eslint:
|
|
44
|
-
patterns:
|
|
45
|
-
- "eslint"
|
|
46
|
-
- "neostandard"
|
|
47
|
-
- "@stylistic/*"
|
|
48
|
-
# TypeScript related dependencies
|
|
49
|
-
dev-dependencies-typescript:
|
|
50
|
-
patterns:
|
|
51
|
-
- "@types/*"
|
|
52
|
-
- "tstyche"
|
|
53
|
-
- "typescript"
|
|
@@ -23,61 +23,13 @@ permissions:
|
|
|
23
23
|
contents: read
|
|
24
24
|
|
|
25
25
|
jobs:
|
|
26
|
-
type-tests:
|
|
27
|
-
name: Type Tests
|
|
28
|
-
runs-on: ubuntu-latest
|
|
29
|
-
strategy:
|
|
30
|
-
matrix:
|
|
31
|
-
node-version: ['20', '22', '24', '26']
|
|
32
|
-
steps:
|
|
33
|
-
- uses: actions/checkout@v7
|
|
34
|
-
with:
|
|
35
|
-
persist-credentials: false
|
|
36
|
-
|
|
37
|
-
- uses: actions/setup-node@v6
|
|
38
|
-
with:
|
|
39
|
-
node-version: ${{ matrix.node-version }}
|
|
40
|
-
cache: 'npm'
|
|
41
|
-
cache-dependency-path: package.json
|
|
42
|
-
check-latest: true
|
|
43
|
-
|
|
44
|
-
- name: Install dependencies
|
|
45
|
-
run: npm install --ignore-scripts
|
|
46
|
-
|
|
47
|
-
- name: Run type tests
|
|
48
|
-
run: npm run test:typescript
|
|
49
|
-
|
|
50
|
-
unit-tests:
|
|
51
|
-
name: Unit Tests
|
|
52
|
-
runs-on: ubuntu-latest
|
|
53
|
-
strategy:
|
|
54
|
-
matrix:
|
|
55
|
-
node-version: ['16', '18', '20', '22', '24', '26']
|
|
56
|
-
steps:
|
|
57
|
-
- uses: actions/checkout@v7
|
|
58
|
-
with:
|
|
59
|
-
persist-credentials: false
|
|
60
|
-
|
|
61
|
-
- uses: actions/setup-node@v6
|
|
62
|
-
with:
|
|
63
|
-
node-version: ${{ matrix.node-version }}
|
|
64
|
-
cache: 'npm'
|
|
65
|
-
cache-dependency-path: package.json
|
|
66
|
-
check-latest: true
|
|
67
|
-
|
|
68
|
-
- name: Install dependencies
|
|
69
|
-
run: npm install --ignore-scripts
|
|
70
|
-
|
|
71
|
-
- name: Run unit tests
|
|
72
|
-
run: npm test
|
|
73
|
-
|
|
74
26
|
test-regression-check-node10:
|
|
75
27
|
name: Test compatibility with Node.js 10
|
|
76
28
|
runs-on: ubuntu-latest
|
|
77
29
|
permissions:
|
|
78
30
|
contents: read
|
|
79
31
|
steps:
|
|
80
|
-
- uses: actions/checkout@
|
|
32
|
+
- uses: actions/checkout@v6
|
|
81
33
|
with:
|
|
82
34
|
persist-credentials: false
|
|
83
35
|
|
|
@@ -119,7 +71,7 @@ jobs:
|
|
|
119
71
|
permissions:
|
|
120
72
|
contents: read
|
|
121
73
|
steps:
|
|
122
|
-
- uses: actions/checkout@
|
|
74
|
+
- uses: actions/checkout@v6
|
|
123
75
|
with:
|
|
124
76
|
persist-credentials: false
|
|
125
77
|
|
|
@@ -151,4 +103,4 @@ jobs:
|
|
|
151
103
|
with:
|
|
152
104
|
license-check: true
|
|
153
105
|
lint: true
|
|
154
|
-
node-versions: '["16", "18", "20", "22", "24"
|
|
106
|
+
node-versions: '["16", "18", "20", "22", "24"]'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: package-manager-ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- next
|
|
8
|
+
- 'v*'
|
|
9
|
+
paths-ignore:
|
|
10
|
+
- 'docs/**'
|
|
11
|
+
- '*.md'
|
|
12
|
+
pull_request:
|
|
13
|
+
paths-ignore:
|
|
14
|
+
- 'docs/**'
|
|
15
|
+
- '*.md'
|
|
16
|
+
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
test:
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
uses: fastify/workflows/.github/workflows/plugins-ci-package-manager.yml@v6
|
|
@@ -27,10 +27,10 @@ Malformed authorities and out-of-range ports are reported through the parsed com
|
|
|
27
27
|
If set to `true`, the serializer will not resolve a relative `path` component.
|
|
28
28
|
|
|
29
29
|
* `unicodeSupport` (boolean, false)
|
|
30
|
-
If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](
|
|
30
|
+
If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).
|
|
31
31
|
|
|
32
32
|
* `domainHost` (boolean, false)
|
|
33
|
-
If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](
|
|
33
|
+
If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt).
|
|
34
34
|
|
|
35
35
|
### Parse
|
|
36
36
|
|
|
@@ -90,14 +90,14 @@ true
|
|
|
90
90
|
|
|
91
91
|
## Scheme supports
|
|
92
92
|
|
|
93
|
-
fast-uri supports inserting custom [scheme](
|
|
93
|
+
fast-uri supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme)-dependent processing rules. Currently, fast-uri has built-in support for the following schemes:
|
|
94
94
|
|
|
95
|
-
* http \[[RFC 2616](
|
|
96
|
-
* https \[[RFC 2818](
|
|
97
|
-
* ws \[[RFC 6455](
|
|
98
|
-
* wss \[[RFC 6455](
|
|
99
|
-
* urn \[[RFC 2141](
|
|
100
|
-
* urn:uuid \[[RFC 4122](
|
|
95
|
+
* http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\]
|
|
96
|
+
* https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\]
|
|
97
|
+
* ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
|
|
98
|
+
* wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
|
|
99
|
+
* urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\]
|
|
100
|
+
* urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\]
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
## Benchmarks
|