Wait out the messages the application holds before shutting a session down

This commit is contained in:
2026-09-01 13:58:28 +02:00
parent a99e1227ac
commit 3bcea108e3
12 changed files with 263 additions and 79 deletions
+12 -5
View File
@@ -1,6 +1,6 @@
import type { ErrorName } from './defs/errors.ts';
import type { MessageState } from './defs/constants.ts';
import type { PduObject, TlvInput } from './pdu.ts';
import type { PduObject, PduObjectInput, TlvInput } from './pdu.ts';
import type { Result, VoidResult } from './result.ts';
import type { Session } from './session.ts';
import { consts } from './defs/constants.ts';
@@ -43,12 +43,18 @@ export type SmsInput = {
to: string;
};
/** What the session's incoming side gives a message so it can be answered and accounted for. */
export type SmsHandlers = {
onAnswered: () => void;
send: (input: PduObjectInput) => Promise<Result<{ pduObj: PduObject }>>;
};
/** Each segment of a multipart message gets its own message_id, as a separate submit_sm must. */
function segmentId(smsId: string, index: number, total: number): string {
return total === 1 ? smsId : `${smsId}-${String(index + 1)}`;
}
export function createSms(input: SmsInput): Sms {
export function createSms(input: SmsInput, handlers: SmsHandlers): Sms {
const first = input.pduObjs[0];
const registered = first?.params.registered_delivery;
const dataCoding = first?.params.data_coding;
@@ -60,8 +66,8 @@ export function createSms(input: SmsInput): Sms {
from: input.from,
message: input.message,
pduObjs: input.pduObjs,
sendDlr: status => sendDlr(sms, status),
sendResp: options => sendResp(sms, answered, options ?? {}),
sendDlr: status => sendDlr(sms, handlers.send, status),
sendResp: options => sendResp(sms, answered, options ?? {}).finally(handlers.onAnswered),
session: input.session,
get smsId(): string {
return answered.smsId;
@@ -124,6 +130,7 @@ function receiptTlvs(smsId: string, status: MessageState): Record<string, TlvInp
async function sendDlr(
sms: Sms,
send: SmsHandlers['send'],
status: MessageState = 'DELIVERED',
): Promise<Result<{ pduObjs: PduObject[] }>> {
if (!sms.session.bindAllows('deliver_sm')) {
@@ -135,7 +142,7 @@ async function sendDlr(
for (let index = 0; index < total; index++) {
const smsId = segmentId(sms.smsId, index, total);
const sent = await sms.session.send({
const sent = await send({
cmdName: 'deliver_sm',
params: {
destination_addr: sms.from,