Release v0.1.0 #5

Merged
B00tLoad merged 37 commits from release/v.0.1.0 into main 2025-09-01 12:19:37 +02:00
Showing only changes of commit f9385c9cf0 - Show all commits

View File

@@ -88,11 +88,12 @@ export type PushoverMessage = z.infer<typeof MessageSchema>;
interface PushoverResponse { interface PushoverResponse {
status: number; status: number;
request: string;
} }
export interface PushoverMessageResponse extends PushoverResponse { export interface PushoverMessageResponse extends PushoverResponse {
request: string;
errors?: string[]; errors?: string[];
receipt?: string;
} }
export interface PushoverValidationResponse extends PushoverResponse { export interface PushoverValidationResponse extends PushoverResponse {
@@ -100,6 +101,22 @@ export interface PushoverValidationResponse extends PushoverResponse {
licenses?: string[]; licenses?: string[];
} }
export interface PushoverReceiptResponse extends PushoverResponse {
acknowledged: boolean;
acknowledged_at: number;
acknowledged_by: string;
acknowledged_by_device: string;
last_delivered_at: number;
expired: boolean;
expired_at: number;
called_back: boolean;
called_back_at: number;
}
export interface PushoverTagCancellationResponse extends PushoverResponse {
canceled: number;
}
export interface SendOptions { export interface SendOptions {
recipients: PushoverUser[]; recipients: PushoverUser[];
verbose?: boolean; verbose?: boolean;
@@ -129,10 +146,8 @@ export class Pushover {
public async send( public async send(
message: PushoverMessage, message: PushoverMessage,
options: SendOptions, options: SendOptions,
): Promise<PushoverResponse[]> { ): Promise<PushoverMessageResponse[]> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
console.log(MessageSchema.parse(message));
if (options.recipients.length === 0) { if (options.recipients.length === 0) {
reject("No recipients specified."); reject("No recipients specified.");
} }
@@ -156,7 +171,7 @@ export class Pushover {
private async sendToSingleRecipient( private async sendToSingleRecipient(
message: PushoverMessage, message: PushoverMessage,
user: PushoverUser, user: PushoverUser,
): Promise<PushoverResponse> { ): Promise<PushoverMessageResponse> {
const params = new URLSearchParams(); const params = new URLSearchParams();
// Add token and user // Add token and user
@@ -191,16 +206,17 @@ export class Pushover {
params.append("timestamp", String(message.timestamp)); params.append("timestamp", String(message.timestamp));
if (message.ttl) params.append("ttl", String(message.ttl)); if (message.ttl) params.append("ttl", String(message.ttl));
return this.makeRequest("messages.json", params); return this.makeRequest("messages.json", "POST", params);
} }
private makeRequest( private makeRequest(
url: string, url: string,
method: "POST" | "GET",
params: URLSearchParams, params: URLSearchParams,
): Promise<PushoverResponse> { ): Promise<PushoverResponse> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = { const options = {
method: "POST", method: method,
headers: { headers: {
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
}, },
@@ -216,11 +232,7 @@ export class Pushover {
res.on("end", () => { res.on("end", () => {
try { try {
const response = JSON.parse(data) as PushoverResponse; const response = JSON.parse(data) as PushoverResponse;
if (url === "messages.json") resolve(response);
resolve(response as PushoverMessageResponse);
else if (url == "users/validate.json")
resolve(response as PushoverValidationResponse);
else resolve(response);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
reject(new Error(`Failed to parse response: ${data}`)); reject(new Error(`Failed to parse response: ${data}`));
@@ -249,6 +261,31 @@ export class Pushover {
params.append("user", options.user ?? ""); params.append("user", options.user ?? "");
if (options.deviceName) params.append("device", options.deviceName); if (options.deviceName) params.append("device", options.deviceName);
return this.makeRequest("users/validate.json", params); return this.makeRequest("users/validate.json", "POST", params);
}
checkReceipt(receipt: string): Promise<PushoverReceiptResponse> {
const params = new URLSearchParams();
return this.makeRequest(
`receipts/${receipt}.json?token=${this.token}`,
"GET",
params,
) as Promise<PushoverReceiptResponse>;
}
cancelRetries(receipt: string): Promise<PushoverResponse> {
const params = new URLSearchParams();
params.append("token", this.token);
return this.makeRequest(`receipts/${receipt}/cancel.json`, "POST", params);
}
cancelRetriesByTag(tag: string): Promise<PushoverTagCancellationResponse> {
const params = new URLSearchParams();
params.append("token", this.token);
return this.makeRequest(
`receipts/cancel_by_tag/${tag}.json`,
"POST",
params,
) as Promise<PushoverTagCancellationResponse>;
} }
} }