@onlyne/lib 3.1.0 → 3.2.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.
Files changed (121) hide show
  1. package/README.md +4 -3
  2. package/dist/awaited.d.ts +43 -0
  3. package/dist/awaited.d.ts.map +1 -0
  4. package/dist/awaited.js +82 -0
  5. package/dist/awaited.js.map +1 -0
  6. package/dist/client.d.ts +140 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +1772 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/core.d.ts +36 -0
  11. package/dist/core.d.ts.map +1 -0
  12. package/dist/core.js +122 -0
  13. package/dist/core.js.map +1 -0
  14. package/dist/delivery.d.ts +120 -0
  15. package/dist/delivery.d.ts.map +1 -0
  16. package/dist/delivery.js +117 -0
  17. package/dist/delivery.js.map +1 -0
  18. package/dist/discovery.d.ts +35 -0
  19. package/dist/discovery.d.ts.map +1 -0
  20. package/dist/discovery.js +306 -0
  21. package/dist/discovery.js.map +1 -0
  22. package/dist/domains.d.ts +29 -0
  23. package/dist/domains.d.ts.map +1 -0
  24. package/dist/domains.js +267 -0
  25. package/dist/domains.js.map +1 -0
  26. package/dist/history.d.ts +13 -0
  27. package/dist/history.d.ts.map +1 -0
  28. package/dist/history.js +143 -0
  29. package/dist/history.js.map +1 -0
  30. package/dist/http.d.ts +20 -0
  31. package/dist/http.d.ts.map +1 -0
  32. package/dist/http.js +88 -0
  33. package/dist/http.js.map +1 -0
  34. package/{src/index.ts → dist/index.d.ts} +2 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +15 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/keys.d.ts +97 -0
  39. package/dist/keys.d.ts.map +1 -0
  40. package/dist/keys.js +679 -0
  41. package/dist/keys.js.map +1 -0
  42. package/dist/memory.d.ts +9 -0
  43. package/dist/memory.d.ts.map +1 -0
  44. package/dist/memory.js +35 -0
  45. package/dist/memory.js.map +1 -0
  46. package/dist/messages.d.ts +64 -0
  47. package/dist/messages.d.ts.map +1 -0
  48. package/dist/messages.js +480 -0
  49. package/dist/messages.js.map +1 -0
  50. package/dist/node.d.ts +26 -0
  51. package/dist/node.d.ts.map +1 -0
  52. package/dist/node.js +59 -0
  53. package/dist/node.js.map +1 -0
  54. package/dist/resolve.d.ts +18 -0
  55. package/dist/resolve.d.ts.map +1 -0
  56. package/dist/resolve.js +37 -0
  57. package/dist/resolve.js.map +1 -0
  58. package/dist/resources.d.ts +25 -0
  59. package/dist/resources.d.ts.map +1 -0
  60. package/dist/resources.js +782 -0
  61. package/dist/resources.js.map +1 -0
  62. package/dist/routes/domains.d.ts +4 -0
  63. package/dist/routes/domains.d.ts.map +1 -0
  64. package/dist/routes/domains.js +42 -0
  65. package/dist/routes/domains.js.map +1 -0
  66. package/dist/routes/grants.d.ts +8 -0
  67. package/dist/routes/grants.d.ts.map +1 -0
  68. package/dist/routes/grants.js +32 -0
  69. package/dist/routes/grants.js.map +1 -0
  70. package/dist/routes/public.d.ts +4 -0
  71. package/dist/routes/public.d.ts.map +1 -0
  72. package/dist/routes/public.js +62 -0
  73. package/dist/routes/public.js.map +1 -0
  74. package/dist/routes/resources.d.ts +8 -0
  75. package/dist/routes/resources.d.ts.map +1 -0
  76. package/dist/routes/resources.js +87 -0
  77. package/dist/routes/resources.js.map +1 -0
  78. package/dist/routes/shared.d.ts +77 -0
  79. package/dist/routes/shared.d.ts.map +1 -0
  80. package/dist/routes/shared.js +349 -0
  81. package/dist/routes/shared.js.map +1 -0
  82. package/dist/routes/threads.d.ts +8 -0
  83. package/dist/routes/threads.d.ts.map +1 -0
  84. package/dist/routes/threads.js +113 -0
  85. package/dist/routes/threads.js.map +1 -0
  86. package/dist/routes/trust.d.ts +4 -0
  87. package/dist/routes/trust.d.ts.map +1 -0
  88. package/dist/routes/trust.js +36 -0
  89. package/dist/routes/trust.js.map +1 -0
  90. package/dist/stream.d.ts +20 -0
  91. package/dist/stream.d.ts.map +1 -0
  92. package/dist/stream.js +141 -0
  93. package/dist/stream.js.map +1 -0
  94. package/dist/threads.d.ts +79 -0
  95. package/dist/threads.d.ts.map +1 -0
  96. package/dist/threads.js +480 -0
  97. package/dist/threads.js.map +1 -0
  98. package/dist/transport.d.ts +45 -0
  99. package/dist/transport.d.ts.map +1 -0
  100. package/dist/transport.js +175 -0
  101. package/dist/transport.js.map +1 -0
  102. package/dist/types.d.ts +809 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +9 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +16 -8
  107. package/src/client.ts +0 -1745
  108. package/src/core.ts +0 -114
  109. package/src/discovery.ts +0 -275
  110. package/src/domains.ts +0 -213
  111. package/src/history.ts +0 -139
  112. package/src/http.ts +0 -852
  113. package/src/keys.ts +0 -642
  114. package/src/memory.ts +0 -34
  115. package/src/messages.ts +0 -409
  116. package/src/node.ts +0 -63
  117. package/src/resolve.ts +0 -39
  118. package/src/resources.ts +0 -745
  119. package/src/threads.ts +0 -409
  120. package/src/transport.ts +0 -211
  121. package/src/types.ts +0 -428
@@ -0,0 +1,175 @@
1
+ import { OnlyneError } from "./core.js";
2
+ // Loopback hosts may speak plain HTTP. Everything else reached by a resolver
3
+ // could be a remote peer, so it must be HTTPS: a cleartext binding would put
4
+ // bearer credentials on the wire.
5
+ const LOOPBACK = { '127.0.0.1': true, localhost: true, '[::1]': true };
6
+ /**
7
+ * The base URL a service request may use: HTTPS anywhere, plain HTTP on loopback only.
8
+ * Public reads (a candidate's service description) use the same rule, so one host cannot
9
+ * downgrade the other.
10
+ */
11
+ export function serviceBase(value) {
12
+ let base;
13
+ try {
14
+ base = new URL(value);
15
+ }
16
+ catch {
17
+ throw new OnlyneError('unavailable', 'The endpoint is not an absolute URL.');
18
+ }
19
+ if (base.protocol !== 'https:' && !(base.protocol === 'http:' && LOOPBACK[base.hostname] === true)) {
20
+ throw new OnlyneError('unavailable', 'Plain HTTP is limited to loopback; cross-host peers must use HTTPS.');
21
+ }
22
+ return base;
23
+ }
24
+ function isFailure(value) {
25
+ return typeof value === 'object' && value !== null && 'code' in value && 'message' in value && typeof value.code === 'string' && typeof value.message === 'string';
26
+ }
27
+ // Some bindings answer errors without the envelope when the request never
28
+ // reached service code; a bare failure record is still preserved.
29
+ function failureRecord(parsed) {
30
+ return typeof parsed === 'object' && parsed !== null && 'error' in parsed ? parsed.error : parsed;
31
+ }
32
+ /**
33
+ * RFC 0017 §3: what a signed request hits when this node holds no trusted key for the peer.
34
+ * Both node ids travel in the text and in `details`, because a missing key here says nothing
35
+ * about whether the peer runs. The runtime re-sends the record that stays open, so the code is
36
+ * `unavailable` and the message keeps that retry apart from an agent repeating the send.
37
+ *
38
+ * A pending exchange is not a task for the reader: the invitation is already recorded on the
39
+ * side that owes the approval, and the acquisition policy there submits the approval on the
40
+ * next attempt, or that node's holder confirms it (RFC 0018 §4). The text says that instead of
41
+ * prescribing a menu step, because with policy `all` or `segment` no one has to act. The
42
+ * `no_record` and `revoked` cases keep the host's `guidance` menu, since nothing records them
43
+ * yet and only a holder can start or restore the exchange.
44
+ */
45
+ function missingTrust(self, target, peer, guidance) {
46
+ const here = self ?? 'this node';
47
+ const retry = 'The runtime re-sends the open record once the pairing exists; do not re-send it yourself.';
48
+ const reason = peer === undefined ? 'no_record' : peer.state === 'revoked' ? 'revoked' : 'pending';
49
+ const required_action = reason === 'pending' ? 'confirm_exchange' : reason === 'revoked' ? 'restore_trust' : 'request_exchange';
50
+ // A pending row says which holder still owes the act: ours when the peer asked, theirs when we did.
51
+ const responsible_node = reason === 'pending' && peer?.local_approved === true ? target : self;
52
+ const details = { self, peer: target, reason, responsible_node, required_action };
53
+ const guide = guidance?.(details);
54
+ const surface = guide === undefined ? '' : `: ${guide.entry.join(' → ')}`;
55
+ const failure = guide === undefined ? details : { ...details, entry: guide.entry };
56
+ if (reason === 'no_record') {
57
+ // The exchange has a sanctioned start that is not a human step: `trust_begin` on this
58
+ // node, judged by this node's acquisition policy, and the peer's policy judges the
59
+ // statement that arrives. Naming only the panel hid that path (tern host report).
60
+ return new OnlyneError('unavailable', `${here} holds no trust record for ${target}, so this request cannot be signed. Start the exchange with trust_begin, which the acquisition policy on ${here} judges; ${target} can also start one, and this node's policy judges the arriving statement. A holder can complete the pairing through this node's Onlyne surface${surface}. ${retry}`, failure);
61
+ }
62
+ if (reason === 'revoked') {
63
+ return new OnlyneError('unavailable', `${here} revoked ${target}, so this request cannot be signed. This agent cannot restore trust; the holder of ${here} pairs the two nodes again through this node's Onlyne surface${surface}. ${retry}`, failure);
64
+ }
65
+ const message = peer.local_approved
66
+ ? `${target} has not answered the exchange ${here} requested, so this request cannot be signed yet. The invitation is recorded at ${target} as pending; the acquisition policy on that node submits the approval on the next attempt, or its holder confirms it${surface}. ${retry}`
67
+ : `${target} requested an exchange with ${here} and this node has not approved it, so this request cannot be signed yet. The invitation is recorded here as pending; this node's acquisition policy submits the approval on the next attempt, or its holder confirms it${surface}. ${retry}`;
68
+ return new OnlyneError('unavailable', message, failure);
69
+ }
70
+ export class FetchTransport {
71
+ resolve;
72
+ fetcher;
73
+ signing;
74
+ constructor(resolve, fetcher = fetch, signing) {
75
+ this.resolve = resolve;
76
+ this.fetcher = fetcher;
77
+ this.signing = signing;
78
+ }
79
+ async request(target, method, path, body, signal) {
80
+ const endpoint = await this.resolve(target);
81
+ if (endpoint.node_id !== target) {
82
+ throw new OnlyneError('unavailable', 'The resolver returned a target for another identity.');
83
+ }
84
+ const base = serviceBase(endpoint.base_url);
85
+ // The route is relative to base_url, which already carries the service
86
+ // prefix; a leading slash would silently drop that prefix.
87
+ const url = new URL('./' + path.replace(/^\/+/, ''), base.pathname.endsWith('/') ? base : base.href + '/');
88
+ if (url.origin !== base.origin) {
89
+ throw new OnlyneError('invalid_request', 'The request path leaves the endpoint origin.');
90
+ }
91
+ const headers = new Headers(endpoint.headers);
92
+ const serialized = body === undefined ? '' : JSON.stringify(body);
93
+ if (body !== undefined) {
94
+ headers.set('Content-Type', 'application/json');
95
+ // A server rejects the whole request when this header contradicts the
96
+ // body, so the key travels as a header only from the top-level field the
97
+ // body already carries; the body keeps its own copy.
98
+ if (typeof body === 'object' && body !== null && 'idempotency_key' in body && typeof body.idempotency_key === 'string' && body.idempotency_key !== '') {
99
+ headers.set('Idempotency-Key', body.idempotency_key);
100
+ }
101
+ }
102
+ if (this.signing !== undefined) {
103
+ const peer = await this.signing.trust.entry(target);
104
+ // No trusted key for this peer: the request cannot be signed, and sending it unsigned
105
+ // would be refused anyway. Report a retryable outage so the record stays open while the
106
+ // node holder completes the pairing, instead of recording a permanent refusal. The
107
+ // resolver supplies `Onlyne-Actor`, so the outbound request already names this node.
108
+ if (peer?.state !== 'trusted') {
109
+ throw missingTrust(headers.get('Onlyne-Actor'), target, peer, this.signing.guidance);
110
+ }
111
+ {
112
+ const signer = new Request(url.href, { method, headers });
113
+ await this.signing.trust.signRequest(signer, target, serialized);
114
+ for (const [name, value] of signer.headers)
115
+ headers.set(name, value);
116
+ }
117
+ }
118
+ let response;
119
+ const request = new Request(url.href, { method, headers });
120
+ try {
121
+ response = await this.fetcher(url, {
122
+ method,
123
+ headers,
124
+ body: body === undefined ? undefined : serialized,
125
+ signal,
126
+ });
127
+ }
128
+ catch (error) {
129
+ // A consumer's cancellation is not a reachability fault; the caller sees
130
+ // its own abort reason instead of a retryable outage.
131
+ if (signal?.aborted)
132
+ throw signal.reason;
133
+ throw new OnlyneError('unavailable', 'The target could not be reached.');
134
+ }
135
+ let text;
136
+ try {
137
+ text = await response.text();
138
+ }
139
+ catch {
140
+ throw new OnlyneError('unavailable', 'The response body could not be read.');
141
+ }
142
+ let parsed;
143
+ try {
144
+ parsed = text === '' ? undefined : JSON.parse(text);
145
+ }
146
+ catch {
147
+ parsed = undefined;
148
+ }
149
+ if (response.ok) {
150
+ if (parsed === undefined)
151
+ throw new OnlyneError('unavailable', 'The target returned a malformed response.');
152
+ // A signed request is only ever sent to a trusted peer, so its answer must prove that
153
+ // identity; `verifyResponse` fails when the row is missing, untrusted or the signature
154
+ // does not cover this request's nonce.
155
+ if (this.signing !== undefined)
156
+ await this.signing.trust.verifyResponse(target, request, response, text);
157
+ return parsed;
158
+ }
159
+ const record = failureRecord(parsed);
160
+ // A signed request is answered by a signed response even when it fails; an unsigned or
161
+ // forged error must not be read as the peer's refusal.
162
+ if (this.signing !== undefined)
163
+ await this.signing.trust.verifyResponse(target, request, response, text);
164
+ if (isFailure(record)) {
165
+ const rejection = new OnlyneError(record.code, record.message);
166
+ if (typeof record.retryable === 'boolean')
167
+ rejection.error.retryable = record.retryable;
168
+ if (record.details !== undefined)
169
+ rejection.error.details = record.details;
170
+ throw rejection;
171
+ }
172
+ throw new OnlyneError(response.status >= 500 ? 'unavailable' : 'internal', `The target answered HTTP ${response.status} without a failure record.`);
173
+ }
174
+ }
175
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}