Skip to content

Convert anything libreoffice supports using Effect TS

License

Notifications You must be signed in to change notification settings

fiws/effect-libreoffice

Repository files navigation

effect-libreoffice

NPM Version GitHub License Effect: yes

A Effect-based wrapper for LibreOffice, providing multiple strategies for document conversion.

Implementations

This library offers two distinct implementations for interacting with LibreOffice:

  1. LibreOfficeCmd (Default): Uses the soffice command-line tool directly.
  2. UnoClient (Uno): Connects to a running unoserver instance.

Comparison

Feature LibreOfficeCmd (Default) UnoClient (Uno)
Method Spawns a new process for each conversion Connects to a long-running server
Performance Slower (~440ms/file) Fast (~60ms/file)
Setup Requires LibreOffice installed locally Requires unoserver
Best For CLI tools, low volume, simple setup Servers, high volume, performance critical

Usage

Default Implementation (CLI)

Best for quick scripts or when you can't run a unoserver.

import { NodeContext } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice } from "effect-libreoffice";

const program = Effect.gen(function* () {
  const libre = yield* LibreOffice;
  yield* libre.convertLocalFile("input.docx", "output.pdf");
});

const Layers = LibreOffice.Default.pipe(Layer.provide(NodeContext.layer));

program.pipe(Effect.provide(Layers), Effect.runPromise);

Uno Implementation (Start Server)

Best for servers, has a lot better performance. This starts a unoserver for you. You will need to have unoserver binary installed and available in your PATH.

import { NodeContext, NodeHttpClient } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice, UnoServer } from "effect-libreoffice";

const program = Effect.gen(function* () {
  const libre = yield* LibreOffice;
  yield* libre.convertLocalFile("input.docx", "output.pdf");
});

const Layers = LibreOffice.Uno.pipe(
  Layer.provide(UnoServer.Default), // This will start a unoserver
  Layer.provide(NodeContext.layer),
  Layer.provide(NodeHttpClient.layer)
);

program.pipe(Effect.provide(Layers), Effect.runPromise);

Uno Implementation (Remote)

If you want to manage the unoserver yourself, you can use the remote implementation of Uno.

# compose.yml
services:
  unoserver:
    image: libreofficedocker/libreoffice-unoserver:3.22
    ports:
      - "2003:2003"
    volumes:
      - /tmp:/tmp # some shared directory where files can be written and read
import { NodeHttpClient } from "@effect/platform-node";
import { Effect, Layer } from "effect";
import { LibreOffice, UnoServer } from "effect-libreoffice";

const program = Effect.gen(function* () {
  const libre = yield* LibreOffice;
  yield* libre.convertLocalFile("input.docx", "output.pdf");
});

const UnoLayers = LibreOffice.Uno.pipe(
  Layer.provide(NodeHttpClient.layerUndici),
  Layer.provide(UnoServer.Remote) // Defaults to localhost:2003
  // or: Layer.provide(UnoServer.remoteWithURL("http://localhost:1111/custom/RPC2"))
);

program.pipe(Effect.provide(UnoLayers), Effect.runPromise);

About

Convert anything libreoffice supports using Effect TS

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •