@wai-industries/whatsapp-wrappers
v0.1.1
Published
WhatsApp sender wrappers for Odin omni-channel and campaign-service
Readme
@wai-industries/whatsapp-wrappers
WhatsApp sender wrappers shared between omni-channel and campaign-service in the
Odin backend. Contains only WhatsApp sender implementations. Does not contain
customer-upsert logic, message-template approval tracking, or any domain utilities.
Published to npmjs.org under the @wai-industries scope (same pattern as @wai-industries/polylogger).
Contents
| Export | Description |
|---|---|
| EoceanWhatsAppSenderBase + subclasses | E-ocean HTTP sender per message type |
| WSenderApiMessageSenderBase + subclasses | WSenderApi HTTP sender per message type |
| EoceanMessageSenderFactory | Creates E-ocean senders by message type |
| WSenderApiMessageSenderFactory | Creates WSenderApi senders by message type |
| WhatsAppVendor | Vendor enum |
| WhatsAppSenderMessageType | Sender-side message type enum |
| Message payload interfaces | TextMessage, ImageMessage, … |
| SendTemplateParams / SendTemplateResult | Campaign template-send interface |
| TEMPLATE_PAUSED_ERROR_CODES | Meta/BSP error codes that mean template paused |
| SessionKeyInvalidError | Thrown by WSenderApi sender on 401 + refresh |
Installation
npm install @wai-industries/whatsapp-wrappersCI publish (Azure DevOps)
See devops/azure-devops-npm-publish.md.
Pipeline azure-pipelines.yml publishes to registry.npmjs.org on push to main using the NPM_TOKEN secret variable.
Local development with yalc
npm link has Windows symlink issues — use yalc for local iteration before a version is on npm.
npm install -g yalc
cd path\to\odin-whatsapp-wrappers
npm install
npm run build
yalc publish
cd path\to\odin-backend\omni-channel
yalc add @wai-industries/whatsapp-wrappers
# After changes:
cd path\to\odin-whatsapp-wrappers
npm run build && yalc pushConstructor injection design
Both sender base classes take (config, logger) — no module-level singletons.
import {
EoceanMessageSenderFactory,
EoceanSenderConfig,
Logger,
WhatsAppSenderMessageType,
} from '@wai-industries/whatsapp-wrappers';
const config: EoceanSenderConfig = { baseUrl: '...', apiKey: '...' };
const factory = new EoceanMessageSenderFactory(config, logger);
const sender = factory.getSender(WhatsAppSenderMessageType.TEXT);
await sender?.send({ to_number: '...', message_text: '...' });WSenderApi — inject session key resolution (package never touches Redis):
import { WSenderApiMessageSenderFactory, WSenderApiSenderConfig } from '@wai-industries/whatsapp-wrappers';
const config: WSenderApiSenderConfig = {
baseUrl: '...',
resolveApiKey: () => sessionService.resolveSessionApiKey(),
onUnauthorized: (sessionId) => sessionService.handle401Error(sessionId as string | number),
sessionId: activeSessionId,
};
const factory = new WSenderApiMessageSenderFactory(config, logger);Template send (Phase 2 / campaign-service)
const result = await sender.sendTemplate({
to: '+923001234567',
templateName: 'order_confirmation',
language: 'en',
components: [],
});
if (result.status === 'TEMPLATE_PAUSED') {
// pause campaign and write CampaignAlert
}Confirm E-ocean and WSenderApi template/HSM endpoint URLs and payload shapes with vendors before production campaign sends.
Deploy ordering (consumers)
- Publish this package to npm (pipeline or manual).
- Update consumer
package.jsonto@wai-industries/whatsapp-wrappers@^x.y.z. - Replace imports from any previous package name (e.g.
@odin/whatsapp-wrappers). npm install,npm run build,npm run test.
