@devoplus/one-sdk 0.0.0-stage → 0.2.0-next.112
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/CHANGELOG.md +268 -0
- package/README.md +894 -2
- package/bin/accessRequest.d.mts +96 -0
- package/bin/accessRequest.mjs +340 -0
- package/bin/appOps.d.mts +97 -0
- package/bin/appOps.mjs +336 -0
- package/bin/dataCommand.mjs +131 -0
- package/bin/devConfig.mjs +132 -0
- package/bin/one.mjs +341 -0
- package/bin/session.mjs +239 -0
- package/dist/agentInput.d.ts +9 -0
- package/dist/agentInput.d.ts.map +1 -0
- package/dist/agentInput.js +102 -0
- package/dist/agentInput.js.map +1 -0
- package/dist/agentTools.d.ts +83 -0
- package/dist/agentTools.d.ts.map +1 -0
- package/dist/agentTools.js +164 -0
- package/dist/agentTools.js.map +1 -0
- package/dist/ai.d.ts +67 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +129 -0
- package/dist/ai.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +58 -0
- package/dist/audit.js.map +1 -0
- package/dist/backend.d.ts +27 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +63 -0
- package/dist/backend.js.map +1 -0
- package/dist/cache.d.ts +20 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +84 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +469 -0
- package/dist/client.js.map +1 -0
- package/dist/components.d.ts +235 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +1491 -0
- package/dist/components.js.map +1 -0
- package/dist/context.d.ts +110 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/data/crud.d.ts +74 -0
- package/dist/data/crud.d.ts.map +1 -0
- package/dist/data/crud.js +614 -0
- package/dist/data/crud.js.map +1 -0
- package/dist/data/ddl.d.ts +76 -0
- package/dist/data/ddl.d.ts.map +1 -0
- package/dist/data/ddl.js +362 -0
- package/dist/data/ddl.js.map +1 -0
- package/dist/data/fold.d.ts +14 -0
- package/dist/data/fold.d.ts.map +1 -0
- package/dist/data/fold.js +76 -0
- package/dist/data/fold.js.map +1 -0
- package/dist/data/model.d.ts +113 -0
- package/dist/data/model.d.ts.map +1 -0
- package/dist/data/model.js +408 -0
- package/dist/data/model.js.map +1 -0
- package/dist/data/values.d.ts +29 -0
- package/dist/data/values.d.ts.map +1 -0
- package/dist/data/values.js +152 -0
- package/dist/data/values.js.map +1 -0
- package/dist/dexa.d.ts +44 -0
- package/dist/dexa.d.ts.map +1 -0
- package/dist/dexa.js +74 -0
- package/dist/dexa.js.map +1 -0
- package/dist/dexaCommand.d.ts +116 -0
- package/dist/dexaCommand.d.ts.map +1 -0
- package/dist/dexaCommand.js +226 -0
- package/dist/dexaCommand.js.map +1 -0
- package/dist/export/columns.d.ts +62 -0
- package/dist/export/columns.d.ts.map +1 -0
- package/dist/export/columns.js +127 -0
- package/dist/export/columns.js.map +1 -0
- package/dist/export/csv.d.ts +10 -0
- package/dist/export/csv.d.ts.map +1 -0
- package/dist/export/csv.js +30 -0
- package/dist/export/csv.js.map +1 -0
- package/dist/export/report.d.ts +19 -0
- package/dist/export/report.d.ts.map +1 -0
- package/dist/export/report.js +91 -0
- package/dist/export/report.js.map +1 -0
- package/dist/export/response.d.ts +14 -0
- package/dist/export/response.d.ts.map +1 -0
- package/dist/export/response.js +70 -0
- package/dist/export/response.js.map +1 -0
- package/dist/export/xlsx.d.ts +15 -0
- package/dist/export/xlsx.d.ts.map +1 -0
- package/dist/export/xlsx.js +167 -0
- package/dist/export/xlsx.js.map +1 -0
- package/dist/export/zip.d.ts +7 -0
- package/dist/export/zip.d.ts.map +1 -0
- package/dist/export/zip.js +83 -0
- package/dist/export/zip.js.map +1 -0
- package/dist/files.d.ts +52 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +137 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +57 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +157 -0
- package/dist/jobs.js.map +1 -0
- package/dist/log.d.ts +22 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +107 -0
- package/dist/log.js.map +1 -0
- package/dist/notify.d.ts +41 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +11 -0
- package/dist/notify.js.map +1 -0
- package/dist/org.d.ts +184 -0
- package/dist/org.d.ts.map +1 -0
- package/dist/org.js +114 -0
- package/dist/org.js.map +1 -0
- package/dist/people.d.ts +39 -0
- package/dist/people.d.ts.map +1 -0
- package/dist/people.js +88 -0
- package/dist/people.js.map +1 -0
- package/dist/problem.d.ts +12 -0
- package/dist/problem.d.ts.map +1 -0
- package/dist/problem.js +33 -0
- package/dist/problem.js.map +1 -0
- package/dist/runtime.d.ts +92 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +8 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scenarios.d.ts +125 -0
- package/dist/scenarios.d.ts.map +1 -0
- package/dist/scenarios.js +251 -0
- package/dist/scenarios.js.map +1 -0
- package/package.json +55 -3
package/dist/audit.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { OneError } from './context.js';
|
|
2
|
+
import { logAudit, logEvent } from './log.js';
|
|
3
|
+
export const AUDIT_ACTION_MAX_LENGTH = 64;
|
|
4
|
+
export const AUDIT_TARGET_MAX_LENGTH = 200;
|
|
5
|
+
export const AUDIT_DATA_MAX_BYTES = 4096;
|
|
6
|
+
const ACTION_PATTERN = /^[a-z0-9][a-z0-9._:-]*$/;
|
|
7
|
+
/** Sunucuya giden gövdeyi doğrular ve kurar; hatalı girdi fırlatır (uzak yazmadan ÖNCE, istek hiç gitmez). */
|
|
8
|
+
export function buildAuditRequest(action, target, data) {
|
|
9
|
+
const a = action.trim();
|
|
10
|
+
if (a.length === 0 || a.length > AUDIT_ACTION_MAX_LENGTH || !ACTION_PATTERN.test(a))
|
|
11
|
+
throw new OneError(400, 'ONE-SDK-E-030', `Denetim işlem anahtarı 1-${AUDIT_ACTION_MAX_LENGTH} karakter, küçük harf/rakam ve . _ : - olmalıdır (ör. order.approve).`);
|
|
12
|
+
const t = target?.trim();
|
|
13
|
+
if (t !== undefined && t.length > AUDIT_TARGET_MAX_LENGTH)
|
|
14
|
+
throw new OneError(400, 'ONE-SDK-E-031', `Denetim hedefi en çok ${AUDIT_TARGET_MAX_LENGTH} karakter olabilir.`);
|
|
15
|
+
if (data !== undefined) {
|
|
16
|
+
if (data === null || typeof data !== 'object' || Array.isArray(data))
|
|
17
|
+
throw new OneError(400, 'ONE-SDK-E-032', 'Denetim ayrıntısı bir JSON nesnesi olmalıdır.');
|
|
18
|
+
// Döngüsel başvuru ya da bigint `Record<string, unknown>` tipine uyar ama JSON'a çevrilemez: yerel TypeError
|
|
19
|
+
// yerine belgelenmiş girdi hatası (önbellek `serialize` ile aynı kural) — aksi hâlde çağıran 500 ONE-SDK-E-999 görürdü.
|
|
20
|
+
let serialized;
|
|
21
|
+
try {
|
|
22
|
+
serialized = JSON.stringify(data);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new OneError(400, 'ONE-SDK-E-032', 'Denetim ayrıntısı JSON\'a çevrilemiyor (döngüsel başvuru ya da desteklenmeyen değer).');
|
|
26
|
+
}
|
|
27
|
+
const bytes = new TextEncoder().encode(serialized).byteLength;
|
|
28
|
+
if (bytes > AUDIT_DATA_MAX_BYTES)
|
|
29
|
+
throw new OneError(413, 'ONE-SDK-E-032', `Denetim ayrıntısı en çok ${AUDIT_DATA_MAX_BYTES} bayt olabilir (${bytes}).`);
|
|
30
|
+
}
|
|
31
|
+
const body = { action: a };
|
|
32
|
+
if (t)
|
|
33
|
+
body.target = t;
|
|
34
|
+
if (data !== undefined)
|
|
35
|
+
body.data = data;
|
|
36
|
+
return body;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Kritik kullanıcı işlemini Devoplus denetim günlüğüne yazar (console izi + backend). Aktör, portal ve uygulama
|
|
40
|
+
* istekle GÖNDERİLMEZ — backend bunları doğrulanmış platform bağlamından alır.
|
|
41
|
+
*/
|
|
42
|
+
export async function recordAudit(api, ctx, action, target, data) {
|
|
43
|
+
const body = buildAuditRequest(action, target, data);
|
|
44
|
+
logAudit(ctx, body.action, body.target, body.data);
|
|
45
|
+
try {
|
|
46
|
+
const response = await api.request('One/services/audit', { method: 'POST', body: JSON.stringify(body) });
|
|
47
|
+
return { recorded: response?.recorded === true };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Best-effort: denetim yazılamadı diye asıl iş düşmez; ama kayıp SESSİZ de değildir (uyarı olayı).
|
|
51
|
+
logEvent(ctx, 'warn', 'Denetim kaydı backend\'e yazılamadı.', {
|
|
52
|
+
action: body.action,
|
|
53
|
+
error: error instanceof OneError ? error.code : String(error),
|
|
54
|
+
});
|
|
55
|
+
return { recorded: false };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface BackendClientOptions {
|
|
2
|
+
/** Ortamın API tabanı; outbound allowlist'inde olmak ZORUNDA. */
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
/** Tarayıcıdan gelen Authorization başlığı (Bearer <app_token>) — olduğu gibi iletilir. */
|
|
5
|
+
authorization: string | null;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* `Retry-After` (RFC 9110 §10.2.3) yalnız saniye biçiminde okunur; HTTP tarihi biçimi backend'de üretilmez (okundu:
|
|
9
|
+
* `ErrorResponseFactory` tamsayı saniye yazar) ve burada tahmin edilmez. Başlık yoksa ya da okunamazsa gövdedeki
|
|
10
|
+
* `retryAfterSeconds` denenir; ikisi de yoksa `undefined`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function retryAfterSecondsOf(headers: Headers, body: {
|
|
13
|
+
retryAfterSeconds?: unknown;
|
|
14
|
+
}): number | undefined;
|
|
15
|
+
export declare class BackendClient {
|
|
16
|
+
private readonly opts;
|
|
17
|
+
constructor(opts: BackendClientOptions);
|
|
18
|
+
/**
|
|
19
|
+
* `api/v1/...` yolu; yanıt zarfsız ham DTO, 204 → undefined, hata → OneError(ProblemDetails). `init.headers` olduğu
|
|
20
|
+
* gibi eklenir (ör. DEXA komutunun `Idempotency-Key`'i); platform çıkış katmanı yalnız `X-One-*` adlı başlıkları siler.
|
|
21
|
+
* Hata yanıtındaki `Retry-After` `OneError.retryAfterSeconds`'a taşınır.
|
|
22
|
+
*/
|
|
23
|
+
request<T>(path: string, init?: RequestInit): Promise<T>;
|
|
24
|
+
get<T>(path: string): Promise<T>;
|
|
25
|
+
post<T>(path: string, body: unknown): Promise<T>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,2FAA2F;IAC3F,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAUD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAM/G;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,oBAAoB,EAAI;IAE3D;;;;OAIG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBjE;IAED,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/B;IAED,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/C;CACF"}
|
package/dist/backend.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// CA backend istemcisi. Sır YOKTUR: platform çıkış katmanı kimliği ekler (Ö-04).
|
|
2
|
+
// Kullanıcının uygulama belirteci istekle birlikte iletilir ki backend "kullanıcı yetkisi ∩ scope" uygulasın.
|
|
3
|
+
import { OneError } from './context.js';
|
|
4
|
+
/**
|
|
5
|
+
* `Retry-After` (RFC 9110 §10.2.3) yalnız saniye biçiminde okunur; HTTP tarihi biçimi backend'de üretilmez (okundu:
|
|
6
|
+
* `ErrorResponseFactory` tamsayı saniye yazar) ve burada tahmin edilmez. Başlık yoksa ya da okunamazsa gövdedeki
|
|
7
|
+
* `retryAfterSeconds` denenir; ikisi de yoksa `undefined`.
|
|
8
|
+
*/
|
|
9
|
+
export function retryAfterSecondsOf(headers, body) {
|
|
10
|
+
const header = headers.get('retry-after')?.trim();
|
|
11
|
+
if (header && /^\d{1,9}$/.test(header))
|
|
12
|
+
return Number(header);
|
|
13
|
+
const fromBody = body.retryAfterSeconds;
|
|
14
|
+
if (typeof fromBody === 'number' && Number.isInteger(fromBody) && fromBody >= 0)
|
|
15
|
+
return fromBody;
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
export class BackendClient {
|
|
19
|
+
opts;
|
|
20
|
+
constructor(opts) {
|
|
21
|
+
this.opts = opts;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* `api/v1/...` yolu; yanıt zarfsız ham DTO, 204 → undefined, hata → OneError(ProblemDetails). `init.headers` olduğu
|
|
25
|
+
* gibi eklenir (ör. DEXA komutunun `Idempotency-Key`'i); platform çıkış katmanı yalnız `X-One-*` adlı başlıkları siler.
|
|
26
|
+
* Hata yanıtındaki `Retry-After` `OneError.retryAfterSeconds`'a taşınır.
|
|
27
|
+
*/
|
|
28
|
+
async request(path, init = {}) {
|
|
29
|
+
const url = new URL(`api/v1/${path.replace(/^\/+/, '')}`, this.opts.baseUrl.replace(/\/?$/, '/'));
|
|
30
|
+
const headers = new Headers(init.headers);
|
|
31
|
+
headers.set('accept', 'application/json');
|
|
32
|
+
if (this.opts.authorization)
|
|
33
|
+
headers.set('authorization', this.opts.authorization);
|
|
34
|
+
if (init.body && !headers.has('content-type'))
|
|
35
|
+
headers.set('content-type', 'application/json');
|
|
36
|
+
const res = await fetch(url, { ...init, headers });
|
|
37
|
+
if (res.status === 204)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
let body = {};
|
|
41
|
+
try {
|
|
42
|
+
const parsed = await res.json();
|
|
43
|
+
// `null` ya da metin gibi nesne olmayan bir JSON gövdesi alan okumasında TypeError'a düşmesin.
|
|
44
|
+
if (parsed !== null && typeof parsed === 'object')
|
|
45
|
+
body = parsed;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* gövdesiz 401/403 normaldir */
|
|
49
|
+
}
|
|
50
|
+
throw new OneError(res.status, body.code ?? `HTTP-${res.status}`, body.detail ?? body.title ?? 'Sunucu isteği reddetti.', {
|
|
51
|
+
retryAfterSeconds: retryAfterSecondsOf(res.headers, body),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return (await res.json());
|
|
55
|
+
}
|
|
56
|
+
get(path) {
|
|
57
|
+
return this.request(path);
|
|
58
|
+
}
|
|
59
|
+
post(path, body) {
|
|
60
|
+
return this.request(path, { method: 'POST', body: JSON.stringify(body) });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { OneCacheBinding } from './runtime.ts';
|
|
2
|
+
export declare const CACHE_BINDING = "CACHE";
|
|
3
|
+
export declare const CACHE_KEY_MAX_BYTES = 512;
|
|
4
|
+
export declare const CACHE_VALUE_MAX_BYTES: number;
|
|
5
|
+
export declare const CACHE_MIN_TTL_SECONDS = 60;
|
|
6
|
+
export declare const CACHE_MAX_TTL_SECONDS: number;
|
|
7
|
+
export declare function normalizeCacheKey(raw: string): string;
|
|
8
|
+
export interface PutCacheOptions {
|
|
9
|
+
/** Saniye; ZORUNLU. 60 … 2.592.000 (30 gün). Sınır dışı değer HATADIR, sessizce kırpılmaz. */
|
|
10
|
+
ttlSeconds: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class OneCache {
|
|
13
|
+
private readonly store;
|
|
14
|
+
constructor(store: OneCacheBinding);
|
|
15
|
+
/** Anahtar yoksa ya da süresi dolmuşsa null. Değer yazıldığı JSON şeklinde döner; tipi çağıran bilir. */
|
|
16
|
+
get<T = unknown>(key: string): Promise<T | null>;
|
|
17
|
+
put(key: string, value: unknown, options: PutCacheOptions): Promise<void>;
|
|
18
|
+
delete(key: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEnD,eAAO,MAAM,aAAa,UAAU,CAAA;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,qBAAqB,QAAc,CAAA;AAChD,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,qBAAqB,QAAoB,CAAA;AAEtD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,UAAU,EAAE,MAAM,CAAA;CACnB;AA8BD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAlC,YAA6B,KAAK,EAAE,eAAe,EAAI;IAEvD,yGAAyG;IACnG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CASrD;IAEK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E;IAEK,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvC;CACF"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Önbellek servisi — kurulum başına anahtar-değer önbelleği (manifest `services.cache` → binding `CACHE`, kurulumda
|
|
2
|
+
// açılır; D-35). İzolasyon ÖNBELLEK sınırındadır (dosya deposu ve veritabanıyla aynı kalıp): anahtara PortalId eklenmez,
|
|
3
|
+
// başka kurulumun önbelleği görünmez. Bu bir ÖNBELLEKTİR, kayıt deposu değil: TTL zorunludur (60 sn … 30 gün), değer
|
|
4
|
+
// JSON'a çevrilerek yazılır ve 1 MiB'yi aşamaz (depo tavanı 25 MiB; platform bilinçli daraltır), okuma yok sayılan
|
|
5
|
+
// anahtarda null döner. Önbellek nihai tutarlıdır: yazma başka bölgelerde 60 sn'ye kadar gecikebilir — sayaç/kilit
|
|
6
|
+
// için KULLANILMAZ. Sınırlar depo belgesinden okundu (14.10.2026): anahtar ≤ 512 bayt, değer ≤ 25 MiB.
|
|
7
|
+
import { OneError } from './context.js';
|
|
8
|
+
export const CACHE_BINDING = 'CACHE';
|
|
9
|
+
export const CACHE_KEY_MAX_BYTES = 512;
|
|
10
|
+
export const CACHE_VALUE_MAX_BYTES = 1024 * 1024;
|
|
11
|
+
export const CACHE_MIN_TTL_SECONDS = 60;
|
|
12
|
+
export const CACHE_MAX_TTL_SECONDS = 30 * 24 * 60 * 60;
|
|
13
|
+
export function normalizeCacheKey(raw) {
|
|
14
|
+
const key = raw.trim();
|
|
15
|
+
if (key.length === 0)
|
|
16
|
+
throw new OneError(400, 'ONE-SDK-E-020', 'Önbellek anahtarı boş olamaz.');
|
|
17
|
+
if (new TextEncoder().encode(key).byteLength > CACHE_KEY_MAX_BYTES)
|
|
18
|
+
throw new OneError(400, 'ONE-SDK-E-020', `Önbellek anahtarı UTF-8 ile en çok ${CACHE_KEY_MAX_BYTES} bayt olabilir.`);
|
|
19
|
+
// Depo tam olarak "." ve ".." anahtarlarını kabul etmez; depo hatası yerine SDK'nın kendi doğrulama hatası dönsün.
|
|
20
|
+
if (key === '.' || key === '..')
|
|
21
|
+
throw new OneError(400, 'ONE-SDK-E-020', 'Önbellek anahtarı "." ya da ".." olamaz.');
|
|
22
|
+
// eslint-disable-next-line no-control-regex
|
|
23
|
+
if (/[\u0000-\u001f\u007f]/.test(key))
|
|
24
|
+
throw new OneError(400, 'ONE-SDK-E-021', 'Önbellek anahtarı kontrol karakteri içeremez.');
|
|
25
|
+
return key;
|
|
26
|
+
}
|
|
27
|
+
function normalizeTtl(ttl) {
|
|
28
|
+
if (typeof ttl !== 'number' || !Number.isInteger(ttl))
|
|
29
|
+
throw new OneError(400, 'ONE-SDK-E-022', 'Önbellek TTL değeri tam sayı saniye olmalıdır.');
|
|
30
|
+
if (ttl < CACHE_MIN_TTL_SECONDS || ttl > CACHE_MAX_TTL_SECONDS)
|
|
31
|
+
throw new OneError(400, 'ONE-SDK-E-022', `Önbellek TTL değeri ${CACHE_MIN_TTL_SECONDS}-${CACHE_MAX_TTL_SECONDS} saniye aralığında olmalıdır.`);
|
|
32
|
+
return ttl;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `undefined` JSON'a çevrilemez; üst düzey `null` ise okumada "anahtar yok" ile AYIRT EDİLEMEZ (`get` ikisinde de
|
|
36
|
+
* `null` döner) — ikisi de açıkça reddedilir. "Boş" bir değer saklamak gerekiyorsa çağıran onu bir nesneye sarar.
|
|
37
|
+
*/
|
|
38
|
+
function serialize(value) {
|
|
39
|
+
if (value === undefined)
|
|
40
|
+
throw new OneError(400, 'ONE-SDK-E-023', 'Önbelleğe undefined yazılamaz.');
|
|
41
|
+
if (value === null)
|
|
42
|
+
throw new OneError(400, 'ONE-SDK-E-023', 'Önbelleğe null yazılamaz; okuma "anahtar yok" ile ayırt edemezdi.');
|
|
43
|
+
let text;
|
|
44
|
+
try {
|
|
45
|
+
text = JSON.stringify(value);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new OneError(400, 'ONE-SDK-E-023', 'Önbellek değeri JSON\'a çevrilemiyor.');
|
|
49
|
+
}
|
|
50
|
+
if (text === undefined)
|
|
51
|
+
throw new OneError(400, 'ONE-SDK-E-023', 'Önbellek değeri JSON\'a çevrilemiyor.');
|
|
52
|
+
const size = new TextEncoder().encode(text).byteLength;
|
|
53
|
+
if (size > CACHE_VALUE_MAX_BYTES)
|
|
54
|
+
throw new OneError(413, 'ONE-SDK-E-024', `Önbellek değeri ${CACHE_VALUE_MAX_BYTES} bayt sınırını aşıyor (${size}).`);
|
|
55
|
+
return text;
|
|
56
|
+
}
|
|
57
|
+
export class OneCache {
|
|
58
|
+
store;
|
|
59
|
+
constructor(store) {
|
|
60
|
+
this.store = store;
|
|
61
|
+
}
|
|
62
|
+
/** Anahtar yoksa ya da süresi dolmuşsa null. Değer yazıldığı JSON şeklinde döner; tipi çağıran bilir. */
|
|
63
|
+
async get(key) {
|
|
64
|
+
const text = await this.store.get(normalizeCacheKey(key), 'text');
|
|
65
|
+
if (text === null)
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(text);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Önbellek yalnız bu SDK'dan yazılır; bozuk kayıt beklenmez ama önbellek asla fırlatarak isteği düşürmez.
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async put(key, value, options) {
|
|
76
|
+
const k = normalizeCacheKey(key);
|
|
77
|
+
const ttl = normalizeTtl(options?.ttlSeconds);
|
|
78
|
+
await this.store.put(k, serialize(value), { expirationTtl: ttl });
|
|
79
|
+
}
|
|
80
|
+
async delete(key) {
|
|
81
|
+
await this.store.delete(normalizeCacheKey(key));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/** Köprü betiğinin ve görsel dil dosyasının uygulama içindeki yolu. */
|
|
2
|
+
export declare const BRIDGE_SCRIPT_PATH = "/one-bridge.js";
|
|
3
|
+
export declare const UI_CSS_PATH = "/one-ui.css";
|
|
4
|
+
/** Portal'ın çizdiği menüde en çok öğe (manifest `navigation` tavanıyla aynı). */
|
|
5
|
+
export declare const NAVIGATION_MAX_ITEMS = 12;
|
|
6
|
+
/** Sayfa başlığı (`one:title`) tavanı; uzunu kesilir. */
|
|
7
|
+
export declare const TITLE_MAX_LENGTH = 120;
|
|
8
|
+
/** `one:download` ile Portal'a verilebilecek en büyük dosya. */
|
|
9
|
+
export declare const DOWNLOAD_MAX_BYTES: number;
|
|
10
|
+
/** Uygulama içi yol (manifest `navigation[].path` ile aynı kural): `/` ya da `/` ile ayrılmış parçalar; sorgu/`#`/`..` yok. */
|
|
11
|
+
export declare const ROUTE_PATH_RE: RegExp;
|
|
12
|
+
export interface OneNavigationItem {
|
|
13
|
+
path: string;
|
|
14
|
+
label: {
|
|
15
|
+
tr: string;
|
|
16
|
+
en?: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Sekmeyi görme izni (S10; manifest `navigation[].permission`). Portal'a GİTMEZ: köprü sekmeyi yalnız kullanıcı bu izni
|
|
20
|
+
* taşıyorsa (ya da yöneticiyse) menüye koyar — `one.setNavigationAccess`. Yalnız görünürlüktür; asıl kapı sunucu ucudur.
|
|
21
|
+
*/
|
|
22
|
+
permission?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Oturumdaki kişinin uygulama izinleri (`hasPermission` ile aynı anlam: yönetici her izni taşır). */
|
|
25
|
+
export interface OneNavigationAccess {
|
|
26
|
+
permissions: readonly string[];
|
|
27
|
+
admin: boolean;
|
|
28
|
+
}
|
|
29
|
+
/** Uygulama izin kodu (manifest `PERMISSION_CODE_RE` ile aynı): `One.<Uygulama>.<Eylem>`. */
|
|
30
|
+
export declare const NAVIGATION_PERMISSION_RE: RegExp;
|
|
31
|
+
/**
|
|
32
|
+
* Kullanıcıya görünecek sekmeler (S10): izinsiz sekme herkese, izinli sekme yalnız izni taşıyana ve yöneticiye. Erişim
|
|
33
|
+
* bilinmiyorsa (`null` — oturum henüz okunmadı) yalnız izinsiz sekmeler. Dönen öğeler `permission` TAŞIMAZ (Portal
|
|
34
|
+
* sözleşmesi `{ path, label }`).
|
|
35
|
+
*/
|
|
36
|
+
export declare function visibleNavigation(items: readonly OneNavigationItem[], access: OneNavigationAccess | null): OneNavigationItem[];
|
|
37
|
+
export type OneToastSeverity = 'success' | 'info' | 'warn' | 'error';
|
|
38
|
+
export interface OneToast {
|
|
39
|
+
severity: OneToastSeverity;
|
|
40
|
+
summary: string;
|
|
41
|
+
detail?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface OneConfirmOptions {
|
|
44
|
+
message: string;
|
|
45
|
+
title?: string;
|
|
46
|
+
severity?: 'danger' | 'warn' | 'info';
|
|
47
|
+
acceptLabel?: string;
|
|
48
|
+
rejectLabel?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface OneDownload {
|
|
51
|
+
name: string;
|
|
52
|
+
mime: string;
|
|
53
|
+
/** Sözleşmede `ArrayBuffer`; köprü kolaylık olarak `Uint8Array`, `Blob` ve metni de ArrayBuffer'a çevirir. */
|
|
54
|
+
data: ArrayBuffer | ArrayBufferView | Blob | string;
|
|
55
|
+
}
|
|
56
|
+
/** iframe'in ekranda görünen kısmı (iframe CSS piksel). Uzun sayfada pencere/çekmece bu alana yerleştirilir. */
|
|
57
|
+
export interface OneViewport {
|
|
58
|
+
top: number;
|
|
59
|
+
height: number;
|
|
60
|
+
}
|
|
61
|
+
/** Portal'ın gönderdiği tasarım değerleri; köprü bunları `--one-primary` … CSS değişkenlerine yazar. */
|
|
62
|
+
export interface OneDesign {
|
|
63
|
+
primary: string;
|
|
64
|
+
primaryContrast: string;
|
|
65
|
+
fontFamily: string;
|
|
66
|
+
radius: string;
|
|
67
|
+
}
|
|
68
|
+
export interface OneBridgeContext {
|
|
69
|
+
theme: 'light' | 'dark';
|
|
70
|
+
/** Portal'ın dil kodu (`tr-TR`, `en-US` …). */
|
|
71
|
+
lang: string;
|
|
72
|
+
autoHeight: boolean;
|
|
73
|
+
/** Vekalet (`delegation`) ya da Yerine Görüntüle (`impersonation`) oturumu; kendi oturumunda null. */
|
|
74
|
+
actor: {
|
|
75
|
+
kind: 'delegation' | 'impersonation';
|
|
76
|
+
} | null;
|
|
77
|
+
design: OneDesign | null;
|
|
78
|
+
}
|
|
79
|
+
/** `window.one` — köprünün tarayıcıdaki yüzeyi (sayfa betiği `var one = window.one` ile kullanır). */
|
|
80
|
+
export interface OneBridge {
|
|
81
|
+
readonly bridgeVersion: number;
|
|
82
|
+
/** Sayfa Portal içinde mi (iframe)? Değilse yardımcılar tarayıcının kendi davranışına düşer (yerel geliştirme). */
|
|
83
|
+
readonly framed: boolean;
|
|
84
|
+
readonly parents: readonly string[];
|
|
85
|
+
readonly token: string | null;
|
|
86
|
+
readonly tokenExpiresAt: number;
|
|
87
|
+
readonly context: OneBridgeContext | null;
|
|
88
|
+
readonly actor: OneBridgeContext['actor'];
|
|
89
|
+
/** Uygulama içi geçerli yol. */
|
|
90
|
+
readonly path: string;
|
|
91
|
+
readonly viewport: {
|
|
92
|
+
readonly current: OneViewport | null;
|
|
93
|
+
onChange(fn: (v: OneViewport) => void): () => void;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* one:ready + (verildiyse) one:navigation gönderir ve yükseklik bildirimini başlatır. Bir kez çalışır. İzinli sekmeler
|
|
97
|
+
* (`permission`) erişim bilinene kadar menüye KONMAZ; bkz. `setNavigationAccess`.
|
|
98
|
+
*/
|
|
99
|
+
start(options?: {
|
|
100
|
+
navigation?: readonly OneNavigationItem[];
|
|
101
|
+
}): void;
|
|
102
|
+
/**
|
|
103
|
+
* Oturumdaki kişinin izinleri (S10): izinli sekmelerden kişinin görebildikleri menüye eklenir (değiştiyse
|
|
104
|
+
* one:navigation yeniden gönderilir). Uygulama bunu oturum bilgisini okuyunca çağırır (`GET /api/session`).
|
|
105
|
+
*/
|
|
106
|
+
setNavigationAccess(access: OneNavigationAccess): void;
|
|
107
|
+
onToken(fn: (token: string) => void): () => void;
|
|
108
|
+
onContext(fn: (ctx: OneBridgeContext) => void): () => void;
|
|
109
|
+
onNavigate(fn: (path: string) => void): () => void;
|
|
110
|
+
/** `fetch` + Portal'dan gelen belirteç (`Authorization: Bearer …`). */
|
|
111
|
+
fetch(input: string, init?: RequestInit): Promise<Response>;
|
|
112
|
+
toast(toast: OneToast): void;
|
|
113
|
+
confirm(options: OneConfirmOptions | string): Promise<boolean>;
|
|
114
|
+
download(file: OneDownload): Promise<void>;
|
|
115
|
+
openExternal(url: string): void;
|
|
116
|
+
setTitle(title: string | null): void;
|
|
117
|
+
setDirty(dirty: boolean): void;
|
|
118
|
+
setRoute(path: string): void;
|
|
119
|
+
}
|
|
120
|
+
/** Uygulama içi yol geçerli mi (manifest `navigation[].path` kuralı)? */
|
|
121
|
+
export declare function isRoutePath(path: unknown): path is string;
|
|
122
|
+
/**
|
|
123
|
+
* Manifest'in `navigation` alanından Portal'a bildirilecek menü (one-ci aynı kuralı yayından önce doğrular). Bozuk öğe
|
|
124
|
+
* atlanır, yinelenen yol bir kez alınır, en çok `NAVIGATION_MAX_ITEMS`. Sunucu tarafı bunu sayfa betiğine gömer.
|
|
125
|
+
* `permission` korunur (biçimi bozuksa öğe ATLANIR — sekme herkese açılmasın diye); süzme köprüdedir.
|
|
126
|
+
*/
|
|
127
|
+
export declare function navigationFromManifest(manifest: unknown): OneNavigationItem[];
|
|
128
|
+
/** Sayfa betiğini (`/shell.js` gibi) doğru içerik türüyle döndürür — `script-src 'self'` ayrı dosya ister. */
|
|
129
|
+
export declare function scriptResponse(body: string): Response;
|
|
130
|
+
/**
|
|
131
|
+
* `/one-bridge.js`, `/one-components.js` (D-83 hazır bileşenler) ve `/one-ui.css`; başka yolda `null` (uygulamanın kendi
|
|
132
|
+
* yönlendirmesi devam eder).
|
|
133
|
+
*/
|
|
134
|
+
export declare function clientAssetResponse(pathname: string): Response | null;
|
|
135
|
+
/**
|
|
136
|
+
* `window.one` köprüsü. Tarayıcıda çalışır (derleme yok); `String.raw` ters bölüleri olduğu gibi korur. Değişiklik bu
|
|
137
|
+
* dosyanın testinde sahte DOM'da GERÇEKTEN koşturularak denenir (test-support/shellHarness.ts).
|
|
138
|
+
*/
|
|
139
|
+
export declare const ONE_BRIDGE_SCRIPT: string;
|
|
140
|
+
/**
|
|
141
|
+
* Devoplus One görsel dili (D-76 U5). Açık/koyu değişkenler `[data-theme]` ile seçilir (köprü `one:context` ile yazar);
|
|
142
|
+
* Portal tasarım değerleri (`one:context.design`) `--one-primary`, `--one-primary-contrast`, `--one-font-family`,
|
|
143
|
+
* `--one-radius` değişkenlerine yazılır. Sınıflar `one-` önekiyle: düğme · alan · tablo · kart · mesaj · içerik sekmesi.
|
|
144
|
+
* ⚠️ `.one-tabs` içerik İÇİNDEKİ gruplama içindir; uygulama menüsü değildir (menüyü Portal çizer, U1).
|
|
145
|
+
*/
|
|
146
|
+
export declare const ONE_UI_CSS: string;
|
|
147
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|