web_lib

Common web application libraries
git clone https://radroots.dev/git/web_lib.git
Log | Files | Refs | LICENSE

commit 5ab812730a971c44b59df61d341e4604669765e1
parent 2207d29e7d735b8007b9e56738e41897e1d35ba5
Author: triesap <triesap@radroots.dev>
Date:   Thu, 20 Nov 2025 16:43:16 +0000

client: refactor `radroots` accounts methods, extract shared nostr event header generation, update `sql.js` version

Diffstat:
Mclient/package.json | 2+-
Mclient/src/radroots/types.ts | 20++++++++++----------
Mclient/src/radroots/web.ts | 30+++++++++++++++++-------------
Mclient/src/tangle/types.ts | 19++++++++++---------
Mclient/src/tangle/web.ts | 39++++++++++++++++++++-------------------
5 files changed, 58 insertions(+), 52 deletions(-)

diff --git a/client/package.json b/client/package.json @@ -71,7 +71,7 @@ "@radroots/tangle-sql-wasm": "*", "idb": "^8.0.3", "idb-keyval": "^6.2.1", - "sql.js": "^1.13.0" + "sql.js": "1.13.0" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/client/src/radroots/types.ts b/client/src/radroots/types.ts @@ -1,23 +1,23 @@ import type { IError } from "@radroots/types-bindings"; import { type FilePath, type ResultObj, type ResultPass } from '@radroots/utils'; -export type IClientRadrootsProfileRequestMessage = +export type IClientRadrootsAccountsRequestMessage = | string | `error.client.request_failure` | `*-registered`; -export type IClientRadrootsProfileRequest = { profile_name: string; secret_key: string; }; -export type IClientRadrootsProfileRequestResolve = ResultObj<string> | IError<IClientRadrootsProfileRequestMessage>; -export type IClientRadrootsProfileCreate = { tok: string; secret_key: string; }; -export type IClientRadrootsProfileCreateResolve = ResultObj<string> | IError<IClientRadrootsProfileRequestMessage>; -export type IClientRadrootsProfileActivate = { id: string; secret_key: string; }; -export type IClientRadrootsProfileActivateResolve = ResultPass | IError<IClientRadrootsProfileRequestMessage>; +export type IClientRadrootsAccountsRequest = { profile_name: string; secret_key: string; }; +export type IClientRadrootsAccountsRequestResolve = ResultObj<string> | IError<IClientRadrootsAccountsRequestMessage>; +export type IClientRadrootsAccountsCreate = { tok: string; secret_key: string; }; +export type IClientRadrootsAccountsCreateResolve = ResultObj<string> | IError<IClientRadrootsAccountsRequestMessage>; +export type IClientRadrootsAccountsActivate = { id: string; secret_key: string; }; +export type IClientRadrootsAccountsActivateResolve = ResultPass | IError<IClientRadrootsAccountsRequestMessage>; export type IClientRadrootsMediaImageUpload = { file_path: FilePath; file_data: Uint8Array; secret_key: string; }; export type IClientRadrootsMediaImageUploadResolve = any; export type IClientRadroots = { - profile_request: (opts: IClientRadrootsProfileRequest) => Promise<IClientRadrootsProfileRequestResolve>; - profile_create: (opts: IClientRadrootsProfileCreate) => Promise<IClientRadrootsProfileCreateResolve>; - profile_activate: (opts: IClientRadrootsProfileActivate) => Promise<IClientRadrootsProfileActivateResolve>; + accounts_request: (opts: IClientRadrootsAccountsRequest) => Promise<IClientRadrootsAccountsRequestResolve>; + accounts_create: (opts: IClientRadrootsAccountsCreate) => Promise<IClientRadrootsAccountsCreateResolve>; + accounts_activate: (opts: IClientRadrootsAccountsActivate) => Promise<IClientRadrootsAccountsActivateResolve>; media_image_upload: (opts: IClientRadrootsMediaImageUpload) => Promise<IClientRadrootsMediaImageUploadResolve>; }; diff --git a/client/src/radroots/web.ts b/client/src/radroots/web.ts @@ -1,7 +1,7 @@ import { err_msg, type IHttpResponse, is_err_response, is_error_response } from '@radroots/utils'; import { lib_nostr_event_sign_attest } from '@radroots/utils-nostr'; import { WebHttp } from '../http/web.js'; -import type { IClientRadroots, IClientRadrootsMediaImageUpload, IClientRadrootsMediaImageUploadResolve, IClientRadrootsProfileActivate, IClientRadrootsProfileActivateResolve, IClientRadrootsProfileCreate, IClientRadrootsProfileCreateResolve, IClientRadrootsProfileRequest, IClientRadrootsProfileRequestResolve } from "./types.js"; +import type { IClientRadroots, IClientRadrootsAccountsActivate, IClientRadrootsAccountsActivateResolve, IClientRadrootsAccountsCreate, IClientRadrootsAccountsCreateResolve, IClientRadrootsAccountsRequest, IClientRadrootsAccountsRequestResolve, IClientRadrootsMediaImageUpload, IClientRadrootsMediaImageUploadResolve } from "./types.js"; export class WebClientRadroots implements IClientRadroots { private _base_url: string @@ -20,13 +20,17 @@ export class WebClientRadroots implements IClientRadroots { if (typeof field === `string` && field) return field } - public profile_request = async (opts: IClientRadrootsProfileRequest): Promise<IClientRadrootsProfileRequestResolve> => { + private create_x_nostr_event(secret_key: string): string { + return JSON.stringify(lib_nostr_event_sign_attest(secret_key)) + } + + public accounts_request = async (opts: IClientRadrootsAccountsRequest): Promise<IClientRadrootsAccountsRequestResolve> => { const { profile_name, secret_key } = opts const res = await this._http_client.fetch({ - url: `${this._base_url}/public/profile/request`, + url: `${this._base_url}/v1/accounts/request`, method: `post`, headers: { - "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)) + "X-Nostr-Event": this.create_x_nostr_event(secret_key), }, data: { profile_name } }) @@ -36,16 +40,16 @@ export class WebClientRadroots implements IClientRadroots { const tok = this.parse_res_field(res.data.tok) if (tok) return { result: tok } } - return err_msg(`error.radroots.profile_registered`) + return err_msg(`error.radroots.account_registered`) } - public profile_create = async (opts: IClientRadrootsProfileCreate): Promise<IClientRadrootsProfileCreateResolve> => { + public accounts_create = async (opts: IClientRadrootsAccountsCreate): Promise<IClientRadrootsAccountsCreateResolve> => { const { tok, secret_key } = opts const res = await this._http_client.fetch({ - url: `${this._base_url}/public/profile/create`, + url: `${this._base_url}/v1/accounts/create`, method: `post`, headers: { - "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)) + "X-Nostr-Event": this.create_x_nostr_event(secret_key), }, authorization: tok }) @@ -58,13 +62,13 @@ export class WebClientRadroots implements IClientRadroots { return err_msg(`error.client.request_failure`) } - public profile_activate = async (opts: IClientRadrootsProfileActivate): Promise<IClientRadrootsProfileActivateResolve> => { + public accounts_activate = async (opts: IClientRadrootsAccountsActivate): Promise<IClientRadrootsAccountsActivateResolve> => { const { id, secret_key } = opts const res = await this._http_client.fetch({ - url: `${this._base_url}/public/profile/activate`, + url: `${this._base_url}/v1/accounts/activate`, method: `post`, headers: { - "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)) + "X-Nostr-Event": this.create_x_nostr_event(secret_key), }, data: { id } }) @@ -77,11 +81,11 @@ export class WebClientRadroots implements IClientRadroots { public media_image_upload = async (opts: IClientRadrootsMediaImageUpload): Promise<IClientRadrootsMediaImageUploadResolve> => { const { file_path, file_data, secret_key } = opts const res = await this._http_client.fetch({ - url: `${this._base_url}/public/media/image/upload`, + url: `${this._base_url}/v1/media/image/upload`, method: `put`, headers: { "Content-Type": file_path.mime_type, - "X-Nostr-Event": JSON.stringify(lib_nostr_event_sign_attest(secret_key)) + "X-Nostr-Event": this.create_x_nostr_event(secret_key), }, data_bin: file_data }) diff --git a/client/src/tangle/types.ts b/client/src/tangle/types.ts @@ -7,8 +7,6 @@ import type { IFarmFindManyResolve, IFarmFindOne, IFarmFindOneResolve, - IFarmLocationRelation, - IFarmLocationResolve, IFarmUpdate, IFarmUpdateResolve, ILocationGcsCreate, @@ -49,8 +47,6 @@ import type { INostrProfileFindManyResolve, INostrProfileFindOne, INostrProfileFindOneResolve, - INostrProfileRelayRelation, - INostrProfileRelayResolve, INostrProfileUpdate, INostrProfileUpdateResolve, INostrRelayCreate, @@ -71,15 +67,19 @@ import type { ITradeProductFindManyResolve, ITradeProductFindOne, ITradeProductFindOneResolve, + ITradeProductUpdate, + ITradeProductUpdateResolve, + IFarmLocationRelation, + IFarmLocationResolve, + INostrProfileRelayRelation, + INostrProfileRelayResolve, ITradeProductLocationRelation, ITradeProductLocationResolve, ITradeProductMediaRelation, - ITradeProductMediaResolve, - ITradeProductUpdate, - ITradeProductUpdateResolve + ITradeProductMediaResolve } from "@radroots/tangle-schema-bindings"; -import type { IError } from "@radroots/types-bindings"; import { type SqlJsMigrationState } from "../sql/types.js"; +import type { IError } from "@radroots/types-bindings"; import type { TangleDatabaseBackup } from "./web.js"; export interface IClientTangleDatabase { @@ -133,4 +133,4 @@ export interface IClientTangleDatabase { trade_product_location_unset(opts: ITradeProductLocationRelation): Promise<ITradeProductLocationResolve | IError<string>>; trade_product_media_set(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaResolve | IError<string>>; trade_product_media_unset(opts: ITradeProductMediaRelation): Promise<ITradeProductMediaResolve | IError<string>>; -} +} +\ No newline at end of file diff --git a/client/src/tangle/web.ts b/client/src/tangle/web.ts @@ -7,8 +7,6 @@ import type { IFarmFindManyResolve, IFarmFindOne, IFarmFindOneResolve, - IFarmLocationRelation, - IFarmLocationResolve, IFarmUpdate, IFarmUpdateResolve, ILocationGcsCreate, @@ -49,8 +47,6 @@ import type { INostrProfileFindManyResolve, INostrProfileFindOne, INostrProfileFindOneResolve, - INostrProfileRelayRelation, - INostrProfileRelayResolve, INostrProfileUpdate, INostrProfileUpdateResolve, INostrRelayCreate, @@ -71,24 +67,24 @@ import type { ITradeProductFindManyResolve, ITradeProductFindOne, ITradeProductFindOneResolve, + ITradeProductUpdate, + ITradeProductUpdateResolve, + IFarmLocationRelation, + IFarmLocationResolve, + INostrProfileRelayRelation, + INostrProfileRelayResolve, ITradeProductLocationRelation, ITradeProductLocationResolve, ITradeProductMediaRelation, - ITradeProductMediaResolve, - ITradeProductUpdate, - ITradeProductUpdateResolve + ITradeProductMediaResolve } from "@radroots/tangle-schema-bindings"; import init_wasm, { query_sql, - tangle_db_export_backup, tangle_db_farm_create, tangle_db_farm_delete, tangle_db_farm_find_many, tangle_db_farm_find_one, - tangle_db_farm_location_set, - tangle_db_farm_location_unset, tangle_db_farm_update, - tangle_db_import_backup, tangle_db_location_gcs_create, tangle_db_location_gcs_delete, tangle_db_location_gcs_find_many, @@ -108,30 +104,34 @@ import init_wasm, { tangle_db_nostr_profile_delete, tangle_db_nostr_profile_find_many, tangle_db_nostr_profile_find_one, - tangle_db_nostr_profile_relay_set, - tangle_db_nostr_profile_relay_unset, tangle_db_nostr_profile_update, tangle_db_nostr_relay_create, tangle_db_nostr_relay_delete, tangle_db_nostr_relay_find_many, tangle_db_nostr_relay_find_one, tangle_db_nostr_relay_update, - tangle_db_reset_database, - tangle_db_run_migrations, tangle_db_trade_product_create, tangle_db_trade_product_delete, tangle_db_trade_product_find_many, tangle_db_trade_product_find_one, + tangle_db_trade_product_update, + tangle_db_farm_location_set, + tangle_db_farm_location_unset, + tangle_db_nostr_profile_relay_set, + tangle_db_nostr_profile_relay_unset, tangle_db_trade_product_location_set, tangle_db_trade_product_location_unset, tangle_db_trade_product_media_set, tangle_db_trade_product_media_unset, - tangle_db_trade_product_update + tangle_db_reset_database, + tangle_db_run_migrations, + tangle_db_export_backup, + tangle_db_import_backup } from "@radroots/tangle-sql-wasm"; import type { IError } from "@radroots/types-bindings"; import { type IdbClientConfig } from "@radroots/utils"; import type { SqlJsMigrationRow, SqlJsMigrationState } from "../sql/types.js"; -import { WebSqlEngine, } from "../sql/web.js"; +import { WebSqlEngine } from "../sql/web.js"; import { radroots_sql_install_bridges } from "./bridge.js"; import type { IClientTangleDatabase } from "./types.js"; @@ -157,7 +157,7 @@ export type TangleDatabaseBackup = { export class WebTangleDatabase implements IClientTangleDatabase { private engine: WebSqlEngine | null = null; - private readonly store_key: string = "radroots.tangle-db-v1.key";; + private readonly store_key: string = "radroots.tangle-db-v1.key"; private cipher_config: IdbClientConfig | null = null; constructor(config?: { @@ -438,4 +438,4 @@ export class WebTangleDatabase implements IClientTangleDatabase { return this.deserialize<ITradeProductMediaResolve>(res); } -} +} +\ No newline at end of file