Finetuning types, applying patches to make it useable
This commit is contained in:
parent
0122cca36d
commit
414ed069f7
6 changed files with 47 additions and 28 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
.idea
|
||||
node_modules
|
||||
dist/
|
||||
|
|
10
README.md
10
README.md
|
@ -1,2 +1,10 @@
|
|||
# Mangrove-reviews-typescript
|
||||
A vite-compatible typescript port of Mangrove.reviews
|
||||
|
||||
This is a port of [mangrove-reviews](https://www.npmjs.com/package/mangrove-reviews), but which uses [jose](https://www.npmjs.com/package/jose) instead of [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken).
|
||||
The latter has a dependency which uses `Stream`, which `vite` cannot handle.
|
||||
|
||||
Another benefit is that this one has better typing* and should thus be more ergonomic to use.
|
||||
|
||||
(*): typing is incomplete and only includes the very basic usecase of downloading and uploading reviews - the bare minimum of what I needed for MapComplete.
|
||||
However, I'll gladly merge pull requests which add more types.
|
||||
|
||||
|
|
|
@ -8,56 +8,56 @@ export interface QueryParameters {
|
|||
/**
|
||||
* Search for reviews that have this string in `sub` or `opinion` field.
|
||||
*/
|
||||
q: string,
|
||||
q?: string,
|
||||
/**
|
||||
* Search for review with this `signature` value.
|
||||
*/
|
||||
signature: string
|
||||
signature?: string
|
||||
|
||||
/**
|
||||
* Reviews by issuer with the following PEM public key.
|
||||
*/
|
||||
kid: string
|
||||
kid?: string
|
||||
/**
|
||||
* Reviews issued at this UNIX time.
|
||||
*/
|
||||
iat: number
|
||||
iat?: number
|
||||
/**
|
||||
* Reviews with UNIX timestamp greater than this.
|
||||
*/
|
||||
gt_iat: number
|
||||
gt_iat?: number
|
||||
/**
|
||||
* Reviews of the given subject URI.
|
||||
*/
|
||||
sub: string
|
||||
sub?: string
|
||||
/**
|
||||
* Reviews with the given rating.
|
||||
*/
|
||||
rating: number
|
||||
rating?: number
|
||||
/**
|
||||
* Reviews with the given opinion.
|
||||
*/
|
||||
opinion: string
|
||||
opinion?: string
|
||||
/**
|
||||
* Maximum number of reviews to be returned.
|
||||
*/
|
||||
limit: number
|
||||
limit?: number
|
||||
/**
|
||||
* Get only reviews with opinion text.
|
||||
*/
|
||||
opinionated: boolean
|
||||
opinionated?: boolean
|
||||
/**
|
||||
* Include reviews of example subjects.
|
||||
*/
|
||||
examples: boolean
|
||||
examples?: boolean
|
||||
/**
|
||||
* Include aggregate information about review issuers.
|
||||
*/
|
||||
issuers: boolean
|
||||
issuers?: boolean
|
||||
/**
|
||||
* Include aggregate information about reviews of returned reviews.
|
||||
*/
|
||||
maresi_subjects: boolean
|
||||
maresi_subjects?: boolean
|
||||
|
||||
}
|
||||
|
||||
|
@ -93,7 +93,7 @@ export class MangroveReviews {
|
|||
* @param {string} [api=ORIGINAL_API] API endpoint used to fetch the data.
|
||||
* @returns {Promise} Resolves to "true" in case of successful insertion or rejects with errors.
|
||||
*/
|
||||
public static submitReview(jwt, api = MangroveReviews.ORIGINAL_API) {
|
||||
public static submitReview(jwt: string, api: string = MangroveReviews.ORIGINAL_API) {
|
||||
return axios.put(`${api}/submit/${jwt}`)
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,7 @@ export class MangroveReviews {
|
|||
* @param {Payload} payload Base {@link Payload} to be cleaned, it will be mutated.
|
||||
* @param {string} [api=ORIGINAL_API] - API endpoint used to fetch the data.
|
||||
*/
|
||||
static async signAndSubmitReview(keypair, payload, api = MangroveReviews.ORIGINAL_API) {
|
||||
static async signAndSubmitReview(keypair: CryptoKeyPair, payload: Review, api:string = MangroveReviews.ORIGINAL_API) {
|
||||
const jwt = await MangroveReviews.signReview(keypair, payload)
|
||||
return MangroveReviews.submitReview(jwt, api)
|
||||
}
|
||||
|
@ -114,7 +114,20 @@ export class MangroveReviews {
|
|||
|
||||
* @param api The api-endpoint to query; default: mangrove.reviews
|
||||
*/
|
||||
public static async getReviews(query: QueryParameters, api = MangroveReviews.ORIGINAL_API): Promise<Review[]> {
|
||||
public static async getReviews(query: QueryParameters, api = MangroveReviews.ORIGINAL_API):
|
||||
Promise<{
|
||||
/** A list of reviews satisfying the query.*/
|
||||
reviews: {
|
||||
signature: string,
|
||||
jwt: string,
|
||||
kid: string,
|
||||
payload: Review,
|
||||
scheme: "geo" | string
|
||||
}[] ,
|
||||
/** A map from Review identifiers (urn:maresi:<signature>) to information about the reviews of that review. */
|
||||
maresi_subjects?: any[],
|
||||
issuers?: any[]
|
||||
}> {
|
||||
const {data} = await axios.get(`${api}/reviews`, {
|
||||
params: query,
|
||||
headers: {'Content-Type': 'application/json'}
|
||||
|
@ -238,8 +251,7 @@ export class MangroveReviews {
|
|||
public static async privateToPem(key) {
|
||||
try {
|
||||
const exported: ArrayBuffer = await crypto.subtle.exportKey('pkcs8', key)
|
||||
const exportedAsString = MangroveReviews.u8aToString(exported)
|
||||
const exportedAsBase64 = window.btoa(exportedAsString)
|
||||
const exportedAsBase64 = btoa(String.fromCharCode(...new Uint8Array(exported)));
|
||||
return `-----BEGIN PRIVATE KEY-----\n${exportedAsBase64}\n-----END PRIVATE KEY-----`
|
||||
} catch {
|
||||
// Workaround for Firefox webcrypto not working.
|
||||
|
@ -255,8 +267,8 @@ export class MangroveReviews {
|
|||
*/
|
||||
public static async publicToPem(key: CryptoKey): Promise<string> {
|
||||
const exported: ArrayBuffer = await crypto.subtle.exportKey('spki', key)
|
||||
const exportedAsString = MangroveReviews.u8aToString(exported)
|
||||
const exportedAsBase64 = btoa(exportedAsString)
|
||||
const exportedAsBase64 = btoa(String.fromCharCode(...new Uint8Array(exported)));
|
||||
|
||||
// Do not add new lines so that its copyable from plain string representation.
|
||||
return `-----BEGIN PUBLIC KEY-----${exportedAsBase64}-----END PUBLIC KEY-----`
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ export interface Metadata extends JWTPayload{
|
|||
/**
|
||||
* Identity of the client used to leave the review, gets populated if not provided.
|
||||
*/
|
||||
client_id: string
|
||||
client_id?: string
|
||||
|
||||
/**
|
||||
* Nickname of the reviewer.
|
||||
|
@ -66,7 +66,7 @@ export interface Review {
|
|||
* Unix timestamp of when review was issued,
|
||||
* gets filled in automatically if not provided.
|
||||
*/
|
||||
iat: number
|
||||
iat?: number
|
||||
|
||||
/**
|
||||
* Array of up to 5 images to be included.
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "mangrove-reviews-typescript",
|
||||
"version": "0.0.1",
|
||||
"version": "0.0.2",
|
||||
"description": "A library to interface with Mangrove.reviews",
|
||||
"main": "lib/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc -project .",
|
||||
"build": "tsc -project ."
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
@ -9,9 +9,7 @@
|
|||
"declaration": true,
|
||||
"outDir": "./dist",
|
||||
"rootDir": "lib",
|
||||
"types": [
|
||||
"node"
|
||||
],
|
||||
"types": [ ],
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"resolveJsonModule": false,
|
||||
|
|
Loading…
Reference in a new issue