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:
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