Skip to content

feat(ipfs): add IPNS API #932

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
194 changes: 193 additions & 1 deletion packages/clients/src/api/ipfs/v1alpha1/api.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@ import {
waitForResource,
} from '../../../bridge'
import type { Region, WaitForOptions } from '../../../bridge'
import { PIN_TRANSIENT_STATUSES } from './content.gen'
import { NAME_TRANSIENT_STATUSES, PIN_TRANSIENT_STATUSES } from './content.gen'
import {
marshalCreatePinByCIDRequest,
marshalCreatePinByURLRequest,
marshalCreateVolumeRequest,
marshalIpnsApiCreateNameRequest,
marshalIpnsApiImportKeyNameRequest,
marshalIpnsApiUpdateNameRequest,
marshalReplacePinRequest,
marshalUpdateVolumeRequest,
unmarshalExportKeyNameResponse,
unmarshalListNamesResponse,
unmarshalListPinsResponse,
unmarshalListVolumesResponse,
unmarshalName,
unmarshalPin,
unmarshalReplacePinResponse,
unmarshalVolume,
Expand All @@ -27,12 +33,22 @@ import type {
CreateVolumeRequest,
DeletePinRequest,
DeleteVolumeRequest,
ExportKeyNameResponse,
GetPinRequest,
GetVolumeRequest,
IpnsApiCreateNameRequest,
IpnsApiDeleteNameRequest,
IpnsApiExportKeyNameRequest,
IpnsApiGetNameRequest,
IpnsApiImportKeyNameRequest,
IpnsApiListNamesRequest,
IpnsApiUpdateNameRequest,
ListNamesResponse,
ListPinsRequest,
ListPinsResponse,
ListVolumesRequest,
ListVolumesResponse,
Name,
Pin,
ReplacePinRequest,
ReplacePinResponse,
Expand Down Expand Up @@ -328,3 +344,179 @@ export class API extends ParentAPI {
urlParams: urlParams(['volume_id', request.volumeId]),
})
}

/** IPFS Naming service API. */
export class IpnsAPI extends ParentAPI {
/** Lists the available regions of the API. */
public static readonly LOCALITIES: Region[] = ['fr-par', 'nl-ams', 'pl-waw']

/**
* Create a new name. You can use the `ipns key` command to list and generate
* more names and their respective keys.
*
* @param request - The request {@link IpnsApiCreateNameRequest}
* @returns A Promise of Name
*/
createName = (request: Readonly<IpnsApiCreateNameRequest>) =>
this.client.fetch<Name>(
{
body: JSON.stringify(
marshalIpnsApiCreateNameRequest(request, this.client.settings),
),
headers: jsonContentHeaders,
method: 'POST',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names`,
},
unmarshalName,
)

/**
* Get information about a name. Retrieve information about a specific name.
*
* @param request - The request {@link IpnsApiGetNameRequest}
* @returns A Promise of Name
*/
getName = (request: Readonly<IpnsApiGetNameRequest>) =>
this.client.fetch<Name>(
{
method: 'GET',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names/${validatePathParam('nameId', request.nameId)}`,
},
unmarshalName,
)

/**
* Waits for {@link Name} to be in a final state.
*
* @param request - The request {@link GetNameRequest}
* @param options - The waiting options
* @returns A Promise of Name
*/
waitForName = (
request: Readonly<IpnsApiGetNameRequest>,
options?: Readonly<WaitForOptions<Name>>,
) =>
waitForResource(
options?.stop ??
(res => Promise.resolve(!NAME_TRANSIENT_STATUSES.includes(res.status))),
this.getName,
request,
options,
)

/**
* Delete an existing name. Delete a name by its ID.
*
* @param request - The request {@link IpnsApiDeleteNameRequest}
*/
deleteName = (request: Readonly<IpnsApiDeleteNameRequest>) =>
this.client.fetch<void>({
method: 'DELETE',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names/${validatePathParam('nameId', request.nameId)}`,
})

protected pageOfListNames = (
request: Readonly<IpnsApiListNamesRequest> = {},
) =>
this.client.fetch<ListNamesResponse>(
{
method: 'GET',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names`,
urlParams: urlParams(
['order_by', request.orderBy ?? 'created_at_asc'],
['organization_id', request.organizationId],
['page', request.page],
[
'page_size',
request.pageSize ?? this.client.settings.defaultPageSize,
],
['project_id', request.projectId],
),
},
unmarshalListNamesResponse,
)

/**
* List all names by a Project ID. Retrieve information about all names from a
* Project ID.
*
* @param request - The request {@link IpnsApiListNamesRequest}
* @returns A Promise of ListNamesResponse
*/
listNames = (request: Readonly<IpnsApiListNamesRequest> = {}) =>
enrichForPagination('names', this.pageOfListNames, request)

/**
* Update name information. Update name information (CID, tag, name...).
*
* @param request - The request {@link IpnsApiUpdateNameRequest}
* @returns A Promise of Name
*/
updateName = (request: Readonly<IpnsApiUpdateNameRequest>) =>
this.client.fetch<Name>(
{
body: JSON.stringify(
marshalIpnsApiUpdateNameRequest(request, this.client.settings),
),
headers: jsonContentHeaders,
method: 'PATCH',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names/${validatePathParam('nameId', request.nameId)}`,
},
unmarshalName,
)

/**
* Export your private key. Export a private key by its ID.
*
* @param request - The request {@link IpnsApiExportKeyNameRequest}
* @returns A Promise of ExportKeyNameResponse
*/
exportKeyName = (request: Readonly<IpnsApiExportKeyNameRequest>) =>
this.client.fetch<ExportKeyNameResponse>(
{
method: 'GET',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names/${validatePathParam('nameId', request.nameId)}/export-key`,
},
unmarshalExportKeyNameResponse,
)

/**
* Import your private key. Import a private key.
*
* @param request - The request {@link IpnsApiImportKeyNameRequest}
* @returns A Promise of Name
*/
importKeyName = (request: Readonly<IpnsApiImportKeyNameRequest>) =>
this.client.fetch<Name>(
{
body: JSON.stringify(
marshalIpnsApiImportKeyNameRequest(request, this.client.settings),
),
headers: jsonContentHeaders,
method: 'POST',
path: `/ipfs/v1alpha1/regions/${validatePathParam(
'region',
request.region ?? this.client.settings.defaultRegion,
)}/names/import-key`,
},
unmarshalName,
)
}
5 changes: 4 additions & 1 deletion packages/clients/src/api/ipfs/v1alpha1/content.gen.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// This file was automatically generated. DO NOT EDIT.
// If you have any remark or suggestion do not hesitate to open an issue.
import type { PinStatus } from './types.gen'
import type { NameStatus, PinStatus } from './types.gen'

/** Lists transient statutes of the enum {@link NameStatus}. */
export const NAME_TRANSIENT_STATUSES: NameStatus[] = ['queued', 'publishing']

/** Lists transient statutes of the enum {@link PinStatus}. */
export const PIN_TRANSIENT_STATUSES: PinStatus[] = ['queued', 'pinning']
14 changes: 13 additions & 1 deletion packages/clients/src/api/ipfs/v1alpha1/index.gen.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
// This file was automatically generated. DO NOT EDIT.
// If you have any remark or suggestion do not hesitate to open an issue.
export { API } from './api.gen'
export { API, IpnsAPI } from './api.gen'
export * from './content.gen'
export type {
CreatePinByCIDRequest,
CreatePinByURLRequest,
CreateVolumeRequest,
DeletePinRequest,
DeleteVolumeRequest,
ExportKeyNameResponse,
GetPinRequest,
GetVolumeRequest,
IpnsApiCreateNameRequest,
IpnsApiDeleteNameRequest,
IpnsApiExportKeyNameRequest,
IpnsApiGetNameRequest,
IpnsApiImportKeyNameRequest,
IpnsApiListNamesRequest,
IpnsApiUpdateNameRequest,
ListNamesRequestOrderBy,
ListNamesResponse,
ListPinsRequest,
ListPinsRequestOrderBy,
ListPinsResponse,
ListVolumesRequest,
ListVolumesRequestOrderBy,
ListVolumesResponse,
Name,
NameStatus,
Pin,
PinCID,
PinCIDMeta,
Expand Down
85 changes: 85 additions & 0 deletions packages/clients/src/api/ipfs/v1alpha1/marshalling.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ import type {
CreatePinByCIDRequest,
CreatePinByURLRequest,
CreateVolumeRequest,
ExportKeyNameResponse,
IpnsApiCreateNameRequest,
IpnsApiImportKeyNameRequest,
IpnsApiUpdateNameRequest,
ListNamesResponse,
ListPinsResponse,
ListVolumesResponse,
Name,
Pin,
PinCID,
PinCIDMeta,
Expand Down Expand Up @@ -64,6 +70,27 @@ const unmarshalPinInfo = (data: unknown) => {
} as PinInfo
}

export const unmarshalName = (data: unknown) => {
if (!isJSONObject(data)) {
throw new TypeError(
`Unmarshalling the type 'Name' failed as data isn't a dictionary.`,
)
}

return {
createdAt: unmarshalDate(data.created_at),
key: data.key,
name: data.name,
nameId: data.name_id,
projectId: data.project_id,
region: data.region,
status: data.status,
tags: data.tags,
updatedAt: unmarshalDate(data.updated_at),
value: data.value,
} as Name
}

export const unmarshalPin = (data: unknown) => {
if (!isJSONObject(data)) {
throw new TypeError(
Expand Down Expand Up @@ -101,6 +128,36 @@ export const unmarshalVolume = (data: unknown) => {
} as Volume
}

export const unmarshalExportKeyNameResponse = (data: unknown) => {
if (!isJSONObject(data)) {
throw new TypeError(
`Unmarshalling the type 'ExportKeyNameResponse' failed as data isn't a dictionary.`,
)
}

return {
createdAt: unmarshalDate(data.created_at),
nameId: data.name_id,
privateKey: data.private_key,
projectId: data.project_id,
publicKey: data.public_key,
updatedAt: unmarshalDate(data.updated_at),
} as ExportKeyNameResponse
}

export const unmarshalListNamesResponse = (data: unknown) => {
if (!isJSONObject(data)) {
throw new TypeError(
`Unmarshalling the type 'ListNamesResponse' failed as data isn't a dictionary.`,
)
}

return {
names: unmarshalArrayOfObject(data.names, unmarshalName),
totalCount: data.total_count,
} as ListNamesResponse
}

export const unmarshalListPinsResponse = (data: unknown) => {
if (!isJSONObject(data)) {
throw new TypeError(
Expand Down Expand Up @@ -180,6 +237,34 @@ export const marshalCreateVolumeRequest = (
project_id: request.projectId ?? defaults.defaultProjectId,
})

export const marshalIpnsApiCreateNameRequest = (
request: IpnsApiCreateNameRequest,
defaults: DefaultValues,
): Record<string, unknown> => ({
name: request.name,
project_id: request.projectId ?? defaults.defaultProjectId,
value: request.value,
})

export const marshalIpnsApiImportKeyNameRequest = (
request: IpnsApiImportKeyNameRequest,
defaults: DefaultValues,
): Record<string, unknown> => ({
name: request.name,
private_key: request.privateKey,
project_id: request.projectId ?? defaults.defaultProjectId,
value: request.value,
})

export const marshalIpnsApiUpdateNameRequest = (
request: IpnsApiUpdateNameRequest,
defaults: DefaultValues,
): Record<string, unknown> => ({
name: request.name,
tags: request.tags,
value: request.value,
})

export const marshalReplacePinRequest = (
request: ReplacePinRequest,
defaults: DefaultValues,
Expand Down
Loading